如果每個服務都自己處理認證、CORS、限流與 Log,第一次做完可能沒什麼感覺。真正麻煩的是共同政策改變之後,每個服務都得各改一次、各自測試、各自部署。所以我會先把適合共用的入口規則整理到 Gateway,但不是什麼都往 Gateway 塞。
例如,只是想調整 CORS 來源,或統一 correlation ID 格式,卻需要所有服務各改一次、各自部署。過程中只要有一個漏掉,同一份政策就可能出現不同結果。後續要查差異,也會多花時間。
把規則集中之後,修改的地方比較清楚,但大家也會一起依賴這個入口。所以,我會先把 Gateway 的工作範圍劃好,再安排容量與故障處理。
Gateway 適合承擔的工作:

圖 Day 09-1:Gateway 治理控制點。
Gateway 若帶著業務規則,就得跟著每一項業務需求一起修改。所以訂單折扣、庫存是否足夠這類判斷,我會留給業務服務處理,Gateway 的 Filter 先對照入口共用政策。
要判斷一條規則放哪裡,我會先看它需要理解多少業務內容。像依 API 設定不同限流門檻,仍可以是入口政策;如果要知道訂單狀態或庫存規則才能決定,就需要回到業務服務確認。
有一點我想特別記下來:請求從內網進來,也不能直接當成可信任。所以 Gateway 驗過 Token,下游仍然要做自己的驗證。Day 11 與 Day 12 會再整理這個分工。
實作時,我會把路由設定放進版本控管,管理端點限制在受控範圍,後端也限制可接受的來源。接著實際測試,確認呼叫端不能繞過 Gateway,讓入口規則真的用得上。
錯誤回應也一起整理。對外有一致的格式與 correlation ID,使用者回報時才找得到那筆請求;內部例外與 stack trace,則留在有權限管控的 Log 裡查。
| 取捨 | 這樣選的理由 | 何時要重新評估 |
|---|---|---|
| 入口政策集中在 Gateway | 政策異動只需改一處,行為也一致 | 例外規則累積到無法維持通用性時 |
| Gateway 只驗證 Token 基本有效性 | 授權判斷需要業務語意,屬服務責任 | 需要在入口做粗粒度阻擋以保護下游時 |
| 後端限制只接受 Gateway 流量 | 避免入口政策被繞過 | 有正當的內部呼叫需求時,需另訂控制方式 |
| 對外錯誤格式統一 | 呼叫端可用一致方式處理錯誤 | 需要傳遞更細的錯誤語意時 |
入口整理好之後,還要維護它的可用性。這一層一旦出問題,所有依賴它的對外服務都可能一起受到影響,所以多個 instance、健康檢查與 timeout 都需要規劃。
| 指標 | 計算方式 | 想回答的問題 |
|---|---|---|
| 繞過 Gateway 的流量 | 未經 Gateway 直達後端的請求數 | 入口政策是否真的無法被繞過? |
| 入口 P95 延遲 | Gateway 處理時間的 P95 | 多一層是否造成可觀察的成本? |
| 5xx 比率 | 5xx 回應數/全部回應數 | 入口本身是否穩定? |
| 限流觸發率 | 429 回應數/全部回應數 | 限流參數是否設得過緊或過鬆? |
| 路由契約測試結果 | 通過的路由測試數/全部路由 | 設定變更是否破壞既有契約? |
入口上的資料,目前只能說明經過它的那一部分。所以也要看看有沒有流量繞過 Gateway;如果還有,就先列出來源與原因。
今天先把 Gateway 的工作整理在入口政策、路由與流量管理這個範圍。下一篇,我想用 Spring Cloud Gateway 的 Route、Predicate 與 Filter,繼續看看設定怎麼配合。