
在過去半年,我實際參與了一個中大型系統專案第一期的建置,主要負責 API Gateway 的架構評估與 PoC 驗證。
這件事不只是把服務架起來而已,真正的挑戰在於,要怎麼幫一堆不同性質的服務,設計一個同時兼顧安全性、可觀測性跟高可用性的對外入口。
客戶擁有大量內部 API 服務,希望透過數位轉型將其對外開放並商業化。核心目標是建立一個自助式 API 租賃平台,讓開發者能快速申請、按量付費使用,第一期的部份,就是評估方案和架構在正式開發系統前,驗證是否能夠達成需求。
| 面向 | 問題 |
|---|---|
| 流程效率 | 紙本申請、多層簽核、綁定 IP,金鑰核發曠日廢時 |
| 用量追蹤 | 無統一監控,不知誰在用、用多少,無法追蹤 |
| 安全穩定 | 缺乏統一認證、無流量控制,難以定位問題 |
| 系統整合 | 子系統各自為政,開發者對接成本高 |
透過 API Gateway,我們可以帶來的價值:
在評估階段,我們需要一個能夠處理高並發請求、支援豐富插件且能與 Kubernetes 原生整合的解決方案,最終我們選用了 Kong API Gateway 搭配 Redis 與 PostgreSQL 作為核心架構。
根據我們的架構規劃:
這次的架構驗證環境我們選擇部署於 Google Cloud Platform (GCP) 的虛擬機器 (VM) 上,使用 RKE(Rancher Kubernetes Engine) 自行架設 Kubernetes Cluster 進行測試。RKE 是 Rancher 推出的 Kubernetes 安裝與管理工具,主打快速、標準化地在現有主機上部署 Kubernetes 叢集,這讓我們能更彈性地模擬地端機房的網路限制與資源調度情境。
我們採用 Helmfile 來管理多個 Helm Releases(包含 Kong, Redis, Postgres 等)。為了讓架構更穩健並符合資安要求,我們採取了狀態分離的部署策略:
依據官方的測試報告Kong Gateway 在單機 16 核心的資源下,能夠穩定處理 10 萬級別的 RPS,且即便在 HTTPS 加密與多重插件邏輯處理下,仍能保持 毫秒級 (Single-digit ms) 的極低延遲,適合對效能有嚴苛要求的微服務架構。
進行 API Gateway 架構驗證的首要目標,是將既有的子系統 API 納入統一管理。
我們利用 Kong Manager 進行了標準化的配置工作,重點如下:
Gateway Services:統一定義後端服務的轉發目標,涵蓋多種 API 服務協定。
突破插件限制 (Plugin Limitation):由於 Kong 的機制限制單一路由無法重複掛載相同類型的插件(例如無法對同一 Route 同時設定兩組不同的 Rate Limiting 規則),我們採用 拆分路由 (Route Splitting) 的策略來解決。針對同一個 Backend Service,依據 URL 特徵拆分出多個 Route,以便分別掛載針對性的流量控制插件,實現更細粒度的管理。
為實作差異化限流,我們採用 Route Splitting 策略。
舉例說明:假設後端有一個電商服務 ecommerce-service,我們可以依據 Route Prefix 拆分成多條路由:
| Route Name | Path Prefix | Rate Limit | 用途 |
|---|---|---|---|
product-list | /api/v1/products/* | 1000 req/min | 商品列表查詢 |
order-create | /api/v1/orders/* | 100 req/min | 訂單建立(高運算) |
payment-process | /api/v1/payments/* | 50 req/min | 金流處理(敏感操作) |
透過這種方式,不僅能針對不同 API 設定差異化的流量限制,還能利用 Route Prefix 分別統計各類 API 的用量,便於後續進行用量分析、計費與資源規劃。
Routes 與 Rewrite:設定精確的路徑轉發規則。針對舊版 API,我們靈活運用 Request Transformer 插件搭配正規表達式 (Regex) 進行 URI Rewrite(例如將 ~/(wms|wmts)/(?<path>api/item/1)$ 轉發),確保新舊系統能無縫接軌。
💡 這過程中的重要體悟: 進行 API Gateway 架構驗證時,強烈建議優先進行 API 正規化 (Normalization)。 如果後端 API 的 URL 結構混亂、命名不統一,雖然靠 Gateway 的 Regex Rewrite 勉強能轉發,但這會導致路由設定變得極度複雜且難以維護。長痛不如短痛,先梳理好 API 規範,整合起來才會事半功倍。
考量使用者組成與相容性,我們在 JWT、HMAC 與 API Key 間權衡後,採用「Header 型 Key Auth」。
以下以使用者呼叫流程,概述 Gateway 的實際運作步驟:
為了合理分配運算資源,我們的流量分流策略如下:
為了支援多節點 (Multi-Node) 的水平擴展,我們將 Rate Limiting 的策略改為 Redis 模式 (Redis Mode)。所有的計數與狀態皆統一儲存於 Redis 中,確保數據在不同節點間的一致性,避免單機計數導致的誤差。
除了基礎的請求次數限制 (Rate Limiting),針對大檔案或高頻寬需求的服務,我們開發了客製化的 Kong Lua 插件:
針對付費與敏感資料,我們利用 ACL (Access Control Lists) 插件建立了嚴格的權限模型:
backend_service, mobile_app 等 Consumers。business-tier-gold)。在解決了核心的路由與權限配置後,下一個挑戰是如何讓眾多子系統快速且標準化地上架。為了避免人工手讀 Swagger 文件再手動 Key 設定所造成的失誤,我們設計了一套 URL Sync 模式。
這套機制的核心在於「規格即時同步」,系統不透過人工上傳檔案,而是直接讀取子系統提供的 Swagger / OpenAPI Specification (OAS) URL。
我們的自動化上架流程包含四個關鍵步驟:
完善的監控是 Gateway 穩定運行的基石。這半年我們投入了大量心力整合 ELK Stack 與 Prometheus 生態系,實現從「日誌查詢」到「指標儀表板」的全方位可觀測性。
Kong 的日誌插件本身已包含 client_ip 欄位,但若需要取得更多進階資訊(如經過多層 Proxy 後的原始 IP、X-Forwarded-For Header 等),可以透過 UDP Log 插件的 custom_fields_by_lua 注入客製化欄位:
custom_fields_by_lua = {
remote_addr = "return kong.client.get_forwarded_ip()",
real_ip = "return ngx.var.realip_remote_addr",
x_forwarded_for = "return kong.request.get_header('x-forwarded-for')"
}
這段配置讓我們能取得更完整的來源 IP 資訊,精準分析流量來源與使用行為,對業務決策提供了關鍵數據。同時,我們採用 Sidecar 模式 部署 Filebeat,直接讀取 /var/log/kong 下的 access/error log 並轉發至 Elasticsearch,建立 kong-logs-YYYY.MM.DD 索引。
利用 Kong 的 Prometheus 插件,我們收集了詳細的流量指標,並在 Grafana 建立了專屬儀表板:
Uptime Kuma 是一款開源的自架式監控工具,類似於 Uptime Robot,但可以完全部署在自己的伺服器上。它提供了直覺的 Web UI,支援多種監控類型(HTTP、TCP、Ping、DNS 等),並能透過 Telegram、Slack、Email 等管道發送告警通知。對於需要監控大量內部服務且不想依賴外部 SaaS 的團隊來說,是個很好的選擇。
為了克服原生 Uptime Kuma 在大量監控下的效能瓶頸(約 800 支 API),我們將架構進行了改造:
kuma-mariadb 服務,支援更高的併發讀寫。關於這部分的實作細節,我另外整理了一篇文章:使用 Vibe Coding 打造 Uptime Kuma 集群系統:從單機到高可用監控平台。
監控的最後一哩路是「告警」。我們在 Prometheus 與 Alert Manager 中定義了 20 條告警規則,分為 Critical、Warning 與 Info 三個等級。
以下是我們定義的幾個關鍵 Critical 告警規則 (PromQL):
當 Kong Namespace 下沒有任何 Up 的 Pod 時觸發:
sum(up{job="kong-metrics", namespace="kong"}) == 0
當 5xx 錯誤率超過 5% 時觸發,這通常代表後端服務異常:
(sum(rate(kong_http_requests_total{code=~"5.."}[5m])) by (instance)
/
sum(rate(kong_http_requests_total[5m])) by (instance)
) > 0.05
當 P95 請求延遲超過 2 秒時觸發 (Warning 等級):
histogram_quantile(0.95, sum(rate(kong_latency_bucket[5m])) by (le, instance) ) > 2000
NodeDiskSpaceCritical (可用空間 < 5%)NodeMemoryCritical (使用率 > 95%)這半年的最終成果,順利協助專案通過第一期的系統驗收。
在驗收過程中,我們使用開源 API 測試工具 Hoppscotch (前身為 Postwoman) 針對多項關鍵服務進行了密集的功能驗證。測試結果顯示,API Gateway 不僅能有效攔截未授權的惡意請求,其精細的流量控制機制也能在系統高負載下維持服務穩定,成功達成契約所訂定的各項效能指標。
Kong OSS 本身不提供群組規則、進階流量控管或僅限 route 層級的控制機制,也沒有 API 訂閱的原生概念,因此,若要使用 Kong 來實作 API 訂閱制或較為複雜的群組權限與流量規則,通常需要進行大量客製化;否則在設計上容易顯得不夠貼合需求,必須遷就既有的架構與邏輯。