
在這過去的半年裡,我深度參與了「地理資訊平台」的建置案,主要負責第一期的 API Gateway 架構評估及驗證。
這項任務不僅僅是部署一個服務,更具挑戰的是要為海量的地理空間資訊打造一個兼具安全性、可觀測性與高可用性的流量入口。以下將整理這段時間的架構規劃與實作細節,分享我們如何從零打造這套系統。
在評估階段,我們需要一個能夠處理高並發請求、支援豐富插件且能與 Kubernetes 原生整合的解決方案。最終我們選用了 Kong API Gateway 搭配 Redis 與 PostgreSQL 作為核心架構。
根據我們的架構規劃:
這次的架構驗證環境我們選擇部署於 Google Cloud Platform (GCP) 的虛擬機器 (VM) 上,自行架設 Kubernetes Cluster 進行測試。這讓我們能更彈性地模擬地端機房的網路限制與資源調度情境。
我們採用 Helmfile 來管理多個 Helm Releases(包含 Kong, Redis, Postgres 等)。為了讓架構更穩健並符合資安要求,我們採取了狀態分離的部署策略:
進行 API Gateway 架構驗證的首要目標,是將既有的地理空間資訊服務 API 納入統一管理。
我們利用 Kong Manager 進行了標準化的配置工作,重點如下:
~/(wms|wmts)/(?<path>api/item/1)$ 轉發),確保新舊系統能無縫接軌。💡 這過程中的重要體悟: 進行 API Gateway 架構驗證時,強烈建議優先進行 API 正規化 (Normalization)。 如果後端 API 的 URL 結構混亂、命名不統一,雖然靠 Gateway 的 Regex Rewrite 勉強能轉發,但這會導致路由設定變得極度複雜且難以維護。長痛不如短痛,先梳理好 API 規範,整合起來才會事半功倍。
為了合理分配運算資源,我們不採用單一限制,而是依據服務資源消耗(如輕量 API vs 重量級 3D Tiles)與用戶等級設計了分級策略。
我們的流量分流策略如下:
為了支援多節點 (Multi-Node) 的水平擴展,我們將 Rate Limiting 的策略改為 Redis 模式 (Redis Mode)。所有的計數與狀態皆統一儲存於 Redis 中,確保數據在不同節點間的一致性,避免單機計數導致的誤差。
除了基礎的請求次數限制 (Rate Limiting),針對 GIS 領域特有的高頻寬需求(如 3D Tiles 大檔傳輸),我們開發了客製化的 Kong Lua 插件:
針對付費與敏感資料,我們利用 ACL (Access Control Lists) 插件建立了嚴格的權限模型:
backend_service, mobile_app 等 Consumers。business-tier-gold, map-data-premium)。allow: ["advanced"],確保只有授權用戶能訪問高價值的 GIS 資料。除了基本的 Key Auth,我們還啟用了 Correlation ID 插件,為每個請求注入唯一識別碼 (X-Correlation-ID),這在跨系統除錯時不僅能追蹤軌跡,也是資安稽核的重要依據。
完善的監控是 Gateway 穩定運行的基石。這半年我們投入了大量心力整合 ELK 與 Prometheus 生態系,實現從「日誌查詢」到「指標儀表板」的全方位可觀測性。
為了確保日誌中能紀錄使用者的真實 IP(而非 Load Balancer IP),我們在 UDP Log 插件中注入了客製化 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')"
}
這段配置讓我們能精準分析地理圖資的熱點分佈,對業務決策提供了關鍵數據。同時,我們採用 Sidecar 模式 部署 Filebeat,直接讀取 /var/log/kong 下的 access/error log 並轉發至 Elasticsearch,建立 kong-logs-YYYY.MM.DD 索引。
利用 Kong 的 Prometheus 插件,我們收集了詳細的流量指標,並在 Grafana 建立了專屬儀表板:
為了克服原生 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 不僅能有效攔截未授權的惡意請求,其精細的流量控制機制也能在系統高負載下維持服務穩定,成功達成契約所訂定的各項效能指標。