首頁 後端開發 Golang 重新思考我們的 REST API:建立黃金 API

重新思考我們的 REST API:建立黃金 API

Dec 06, 2024 pm 10:05 PM

Rethinking our REST API: Building the Golden API

在某個時刻,每家公司都會到達一個十字路口,他們需要停下來重新評估他們一直在使用的工具。對我們來說,那一刻到來了,我們意識到為 Web 儀表板提供支援的 API 變得難以管理、難以測試,並且不符合我們為程式碼庫設定的標準。

Arcjet 主要是安全即程式碼 SDK,可協助開發人員實現機器人偵測、電子郵件驗證和 PII 偵測等安全功能。這與我們的高效能、低延遲決策 gRPC API 進行通訊。

我們的網頁儀表板使用單獨的REST API 主要用於管理網站連接和審查已處理的請求分析,但這也包括註冊新用戶和管理他們的帳戶,這意味著它仍然是產品的重要組成部分。

Rethinking our REST API: Building the Golden API
Arcjet 儀表板的請求分析頁面的螢幕截圖。

因此,我們決定接受從頭開始重建 API 的挑戰,這次將重點放在可維護性、效能和可擴充性。然而,我們不想開始一個巨大的重寫專案 - 永遠不會成功 - 相反,我們決定建立一個新的基礎,然後從單一 API 端點開始。

在這篇文章中,我將討論我們如何解決這個問題。

之前在 Arcjet 上

當速度是我們的首要任務時,Next.js 提供了最方便的解決方案來建立我們的前端可以使用的 API 端點。它為我們提供了在單一程式碼庫中進行無縫全端開發的能力,而且我們不必太擔心基礎設施,因為我們部署在 Vercel 上。

我們的重點是程式碼 SDK 的安全性和低延遲決策 API,因此對於前端儀表板,該堆疊使我們能夠輕鬆快速地製作功能原型。

我們的堆疊:Next.js、DrizzleORM、useSWR、NextAuth

然而,隨著我們產品的發展,我們發現將所有 API 端點和前端程式碼組合在同一個專案中會導致混亂。

測試我們的API 變得很麻煩(並且無論如何使用Next.js 都很難),並且我們需要一個能夠處理內部外部消費。隨著我們與更多平台(如 Vercel、Fly.io 和 Netlify)集成,我們意識到僅靠開發速度是不夠的。我們需要一個更強大的解決方案。

作為此專案的一部分,我們還希望解決一個揮之不去的安全問題,即 Vercel 如何要求您公開公開資料庫。除非您為他們的企業「安全計算」付費,否則連接到遠端資料庫需要它具有公共端點。我們更喜歡鎖定我們的資料庫,以便只能透過專用網路存取它。縱深防禦很重要,這將是另一層保護。

這導致我們決定將前端 UI 與後端 API 分開。

介紹“黃金 API”

什麼是「黃金 API」?它不是特定的技術或框架,而是定義建構良好的 API 的一組理想原則。雖然開發人員可能對語言和框架有自己的偏好,但在建立高品質 API 時,大多數人都同意某些跨技術堆疊有效的概念。

1. 效能和可擴充性

我們已經擁有交付高效能 API 的經驗。 我們的 Decision API 部署在靠近客戶的位置,使用 Kubernetes 進行動態擴展,並針對低延遲響應進行了優化.

我們考慮了無伺服器環境和其他供應商,但由於我們現有的k8s 叢集已經在運行,因此重用現有的基礎設施是最有意義的:透過Octopus Deploy 進行部署,透過Grafana Jaeger、Loki 、Prometheus 等進行監控

經過短暫的內部Rust 與Go 對比後,我們選擇了Go,因為它的簡單性、速度以及它實現其最初目標 對構建可擴展網絡服務的出色支援的效果。我們也已經將它用於 Decision API 並了解如何操作 Go API,這為我們最終確定了決策。

2. 全面、清晰的文檔

由於 Go 的簡單性和強大工具的可用性,將後端 API 切換到 Go 非常簡單。但有一個問題:我們保留了 Next.js 前端,並且不想手動編寫 TypeScript 類型或為我們的新 API 維護單獨的文件。

引入 OpenAPI——它非常適合我們的需求。 OpenAPI 允許我們定義前端和後端之間的契約,同時也充當我們的文件。這解決了維護應用程式兩側架構的問題。

3. 安全與認證

在 Go 中整合身分驗證並不太困難,這要歸功於 NextAuth 在後端的模仿相對簡單。 NextAuth(現在的 Auth.js)具有可用於驗證會話的 API。

這意味著我們可以在前端有一個根據 OpenAPI 規範產生的 TypeScript 用戶端,對後端 API 進行提取呼叫。憑證會自動包含在取得呼叫中,後端可以使用 NextAuth 驗證會話。

4. 可測試性

在 Go 中編寫任何類型的測試都非常簡單,並且有很多範例,涵蓋了測試 HTTP 處理程序的主題。

與 Next.js API 相比,為新的 Go API 端點編寫測試也容易得多,特別是因為我們想要測試經過身份驗證的狀態和真實的資料庫呼叫。我們能夠輕鬆地為 Gin 路由器 編寫測試,並使用 Testcontainers 針對我們的 Postgres 資料庫啟動真正的整合測試。

把它們放在一起

編寫 OpenAPI 規範

我們先為我們的 API 寫 OpenAPI 3.0 規格。 OpenAPI 優先的方法提倡在實施之前設計 API 契約,確保所有利害關係人(開發人員、產品經理和客戶)在編寫任何程式碼之前就 API 的行為和結構達成一致。它鼓勵仔細規劃並產生經過深思熟慮的 API 設計,該設計是一致的並遵守既定的最佳實踐。這就是為什麼我們選擇先編寫規範並從中產生程式碼,而不是相反的原因。

我選擇的工具是API Fiddle,它可以幫助您快速起草和測試 OpenAPI 規格。然而,API Fiddle 僅支援 OpenAPI 3.1(我們無法使用它,因為許多程式庫尚未採用它),因此我們堅持使用 3.0 版本並手動編寫規格。

以下是我們 API 規格的範例:

OpenAPI 規格就位後,我們使用了 OAPI-codegen,這是一個根據 OpenAPI 規格自動產生 Go 程式碼的工具。它產生所有必要的類型、處理程序和錯誤處理結構,使開發過程更加順利。

輸出是一組 Go 文件,一個包含伺服器框架,另一個包含處理程序實作。以下是為 Site 物件產生的 Go 類型的範例:

使用產生的程式碼,我們能夠實作 API 處理程序邏輯,如下所示:

資料庫:遠離 DrizzleORM

Drizzle 對於 JS 專案來說是一個很棒的 ORM,我們會再次使用它,但是將資料庫程式碼移出 Next.js 意味著我們需要類似的 Go 程式碼。

我們選擇 GORM 作為我們的 ORM,並使用 儲存庫模式 來抽象資料庫互動。這使我們能夠編寫乾淨、可測試的資料庫查詢。

測試。一切

測試對我們來說至關重要。我們希望確保所有資料庫呼叫都得到正確測試,因此我們使用 Testcontainers 為我們的測試啟動一個真實的資料庫,密切反映我們的生產設定。

設定測試環境後,我們像在生產中一樣測試了所有 CRUD 操作,確保我們的程式碼行為正確。

為了測試我們的 API 處理程序,我們使用了 Go 的 httptest 套件並使用 Mockery 模擬了資料庫互動。這使我們能夠專注於測試 API 邏輯,而不必擔心資料庫問題。

前端消耗:OpenAPI 驅動的前端

我們的 API 經過測試和部署後,我們就把注意力轉向了前端。

我們之前的 API 呼叫是使用 Next.js 推薦的 fetch API 進行的,內建快取。對於更多動態視圖,一些元件在 fetch 之上使用 SWR,因此我們可以獲得類型安全、自動重新載入資料獲取呼叫。

為了在前端使用 API,我們使用了 openapi-typescript 函式庫,它根據我們的 OpenAPI 架構產生 TypeScript 類型。這使得我們可以輕鬆地將後端與前端集成,而無需手動同步資料模型。它內建了 Tanstack Query,它在底層使用 fetch,但也同步到我們的架構。

我們正在逐步將 API 端點遷移到新的 Go 伺服器,並在過程中進行一些小的改進。如果您開啟瀏覽器檢查器,您將看到這些新請求發送至 api.arcjet.com

Rethinking our REST API: Building the Golden API
瀏覽器檢查器螢幕截圖,顯示對新 Go 後端的 API 呼叫。

黃金清單

那麼,我們實作了難以捉摸的 Golden API 了嗎?讓我們選中該框:

  • 效能和可擴充性 – API 部署在我們現有的 k8s 叢集上,這些叢集已經針對效能進行了調整。我們有詳細的指標,並可根據需要進行擴展。
  • 全面且清晰的文件 – OpenAPI 規範提供了單一的事實來源,因為程式碼是從它產生的,而不是相反。使用產生的客戶端意味著我們的團隊可以輕鬆使用 API。
  • 安全性和身份驗證 – 我們已經在生產中部署了 Go,因此我們可以複製我們的安全實踐。身份驗證由 NextAuth 處理。
  • 可測試性 – 我們使用 Testcontainers 實現了處理程序的單元測試和整合測試,這是對我們的 Next.js API 的重大改進。

我們更進一步:

  • 監控 – 部署到現有的 k8s 叢集意味著我們繼承了已經設定的追蹤、日誌記錄和指標功能。在 Gin 上加入 OpenTelemetry 儀器非常簡單。
  • 簡單性 – Go 最初是為 API 設計的,這一點也體現出來了。我們的程式碼更乾淨、更易於維護。

最後,我們對結果感到滿意。我們的 API 更快、更安全且經過更好的測試。向 Go 的過渡是值得的,隨著我們產品的成長,我們現在可以更好地擴展和維護我們的 API。

以上是重新思考我們的 REST API:建立黃金 API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1251
29
C# 教程
1224
24
Golang的目的:建立高效且可擴展的系統 Golang的目的:建立高效且可擴展的系統 Apr 09, 2025 pm 05:17 PM

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

Golang和C:並發與原始速度 Golang和C:並發與原始速度 Apr 21, 2025 am 12:16 AM

Golang在並發性上優於C ,而C 在原始速度上優於Golang。 1)Golang通過goroutine和channel實現高效並發,適合處理大量並發任務。 2)C 通過編譯器優化和標準庫,提供接近硬件的高性能,適合需要極致優化的應用。

Golang vs. Python:主要差異和相似之處 Golang vs. Python:主要差異和相似之處 Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

表演競賽:Golang vs.C 表演競賽:Golang vs.C Apr 16, 2025 am 12:07 AM

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golang的影響:速度,效率和簡單性 Golang的影響:速度,效率和簡單性 Apr 14, 2025 am 12:11 AM

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

C和Golang:表演至關重要時 C和Golang:表演至關重要時 Apr 13, 2025 am 12:11 AM

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang和C:性能的權衡 Golang和C:性能的權衡 Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

See all articles