API 閘道 (API Gateway)
API Gateway 是客戶端與後端服務之間的統一入口(single entry point)。所有外部請求先進 Gateway,由它路由到對應服務,並在中途集中處理所有橫切關注點(認證、限流、SSL、轉換)。
心法:Gateway 保證「你是你說的那個人」,服務決定「你能做什麼」。
為什麼需要 API Gateway
當單體拆成十個微服務,每個服務有自己的 IP、port、API 格式。沒有 Gateway 時:
- 客戶端要知道每個服務的地址、協定、認證方式
- 一個「訂單頁」可能要打三個服務(用戶 / 訂單 / 商品)
- JWT 驗證、rate limiting、CORS 這些橫切關注點在每個服務重複實作 → 浪費又易錯
- 內部拓撲(topology)直接暴露給外部 → 換 port / 拆服務就要改所有客戶端
| 沒有 Gateway | 有 Gateway |
|---|---|
| 客戶端認得每個服務 | 客戶端只認得一個地址 |
| 認證/限流每個服務各做一遍 | 集中在 Gateway 一次處理 |
| 內部拓撲外露 | 後端細節對客戶端透明 |
核心職責
1. 請求路由(Routing)— 最基本功能
依路徑、HTTP method、header 把請求轉發到對應後端:
GET /users/{id} → 用戶服務 (user-service:8001)
GET /orders/{id} → 訂單服務 (order-service:8002)
POST /orders → 訂單服務 (order-service:8002)
GET /products/{id} → 商品服務 (product-service:8003)
服務拆分、合併、換地址,只改 Gateway 路由規則,客戶端完全不受影響。
2. 認證與授權(AuthN & AuthZ)
集中認證,後端服務不必各自實作:
Client ──Bearer <JWT>──► API Gateway ──驗 JWT 簽名+有效期──► 解析 user_id
│
└─► 後端服務 (帶 X-User-Id: 123, X-User-Roles: admin)
後端「信任」這個 header,不再自己解 JWT
- Gateway 做粗粒度授權:「這個 token 能不能進
/admin/...」 - 細粒度授權留在服務:「這個用戶能不能看這筆訂單」需要查 DB,Gateway 沒這個 context
3. 限流(Rate Limiting)— 所有請求都經過它,最自然的限流點
| 維度 | 範例 |
|---|---|
| 按 API key | 免費 60/分、付費 1000/分 |
| 按 IP | 防單一來源洪水(DDoS 第一道防線) |
| 按 endpoint | 登入 / 簡訊驗證碼比一般 API 更嚴 |
| 全域 | 整體上限,保護後端不被打垮 |
超過閾值 Gateway 直接回 429 Too Many Requests,後端完全不知道這個請求存在。
4. SSL 終止(SSL Termination)
Gateway 處理 TLS handshake / 加解密,與後端在內網用 HTTP 溝通。
- ✅ 集中管理憑證(只在 Gateway 更新)
- ✅ 後端省去加解密 CPU
- ⚠️ 內網用 HTTP 是否安全取決於網路隔離;高安全需求可改 mTLS
5. 請求/回應轉換 + 請求聚合
- 轉換:協定轉換(外部 REST → 內部 gRPC)、欄位過濾(濾掉敏感欄位)、格式統一、header 注入
- 聚合(Aggregation):一個
GET /dashboard由 Gateway 同時打用戶/訂單/通知服務,合併成單一回應 → 減少行動端網路往返
GET /dashboard
├── 用戶服務: GET /users/123 → 姓名、頭像
├── 訂單服務: GET /users/123/orders → 最近訂單
└── 通知服務: GET /users/123/notifications → 未讀通知
→ 聚合成單一 JSON 回傳
有架構師認為 Gateway 應該保持薄薄一層,不該做聚合。這是設計選擇 —— 面試時說出你的考量即可。
6. 快取(Caching)
讀多寫少、回應不常變的公開資料(商品目錄、公告)可在 Gateway 快取,後端完全不必處理。個人化回應(購物車)不適合在此快取。
API Gateway vs Load Balancer(面試常見混淆)
| 維度 | Load Balancer | API Gateway |
|---|---|---|
| 工作層次 | L4(TCP/UDP)/ L7 | L7(理解 HTTP 語義) |
| 主要職責 | 流量分散、高可用 | 路由、認證、限流、轉換 |
| 理解業務邏輯 | ❌ 否 | ✅ 是 |
| 典型場景 | 同一服務的多實例 | 不同服務的統一入口 |
| 代表產品 | ALB / NLB、Nginx | AWS API GW、Kong、Envoy |
兩者通常一起用,不是互相替代:
Internet → Load Balancer → API Gateway 集群 → 各後端服務
(分散到多個 GW 實例) (依內容路由)
LB 把流量分散到多個 Gateway 實例(避免 Gateway 成為 SPOF);Gateway 再依請求內容路由到後端。LB 是流量分發器,Gateway 是智慧路由器。
BFF(Backend for Frontend)模式
不同客戶端對 API 的需求差異變大時,為每類客戶端維護各自的 Gateway:
Web Browser → Web BFF ─┐
iOS App → Mobile BFF ─┼─► 後端微服務
Android App → Mobile BFF ─┘
Third-party → Public API Gateway
- Web BFF:大量聚合,回傳豐富 JSON
- Mobile BFF:精簡欄位,省流量
- Public API Gateway:嚴格版本控制、向後相容
代價是多個 Gateway 要維護。適合有多個差異明顯的客戶端、各前端團隊能自維 BFF 的場景;小團隊用一個統一 Gateway 就夠。
常見實作
| 產品 | 特性 | 適合 |
|---|---|---|
| AWS API Gateway | 全受管 Serverless、與 Lambda 緊密整合、按請求計費 | Serverless、不想自管基礎設施 |
| Kong | 開源、基於 Nginx、插件系統擴展 | 需高度客製、有 Nginx 經驗 |
| Envoy / Istio | Service Mesh 核心、sidecar proxy(mTLS/熔斷/追蹤) | K8s 內部服務間流量 |
| Nginx / Traefik | 輕量、Traefik 自動發現 K8s 服務 | 只要基本路由 + SSL |
Ingress Gateway 處理外部流量,Service Mesh 處理內部服務間流量 —— 兩者功能重疊但通常分開。
面試話術
「系統拆成用戶/訂單/商品服務。對外有一個 API Gateway 負責路由、JWT 認證、限流。客戶端只認得 Gateway 地址,後端的拆分與部署對客戶端透明。」
- 安全性:「認證集中在 Gateway(驗 JWT、解析用戶),透過 header 傳給後端;細粒度業務授權留在服務層。」
- 系統保護:「Gateway 做限流第一道防線,按 IP/API key 限頻,超過直接回 429,後端不感知。」
常見情境:
- 電商促銷:限流防搶購 Bot + 快取商品目錄(60s TTL),大部分流量在 Gateway 消化
- 多平台 App:BFF 模式分開 Web / Mobile BFF
- 開放 API:Public Gateway 做 API key 認證 + 嚴格限流 + 版本管理(
/v1/、/v2/)
常見 Deep Dive
是潛在 SPOF,所以必須多實例部署 + 前面掛 LB。Gateway 通常無狀態(路由規則在設定檔/DB,限流狀態在 Redis),任一實例都能處理任何請求,水平擴展自然。某實例掛 → LB 移出輪換,不影響整體。
兩層都做,但做不同的事。Gateway 做認證(驗 JWT 簽名/有效期,技術層面,與業務無關);服務做授權(「用戶只能看自己的訂單」需查 DB,Gateway 沒這個 context)。Gateway 可做粗粒度授權(路徑需要 admin role),細粒度資料授權留在服務。
A 實例看到用戶發 50 個請求,B 實例不知道 → 用戶可繞過限制。解法是把計數器存在共享的 Redis / Memcached,所有 Gateway 實例查同一份。
路由查詢在記憶體(近零延遲)、JWT 驗證是本地密碼學運算(無網路請求),合理實作下額外延遲 1–5ms。若需呼叫外部認證服務(Auth0),每請求多一次網路往返 → 快取認證結果或用自帶簽名的 JWT。Gateway 的 CPU 主要花在 TLS 終止與 JWT 驗證(CPU bound),成瓶頸就加實例。
熱重載(Hot Reload):Kong/Nginx 設定變更不停機生效。金絲雀(Canary):新路由規則先對 5% 流量生效,觀察沒問題再全量。版本管理:/v1/、/v2/ 前綴路由到不同後端,讓新舊版本共存。
把太多業務邏輯塞進 Gateway,它會變成難測試、難維護的大泥球。Gateway 應該是薄薄的、可預期的轉發層,請求聚合要謹慎使用。
自我測驗重點
| 問題 | 重點 |
|---|---|
| Gateway vs LB | L7 智慧路由(懂業務)vs L4/L7 流量分發 |
| 認證 vs 授權 | Gateway 認證、服務授權(粗粒度可在 GW) |
| Gateway 是否 SPOF | 多實例 + 前掛 LB(無狀態好水平擴展) |
| 限流跨實例 | 計數器存共享 Redis |
| 效能開銷 | 1–5ms(路由+JWT 本地運算) |
| Gateway 反模式 | 塞爆業務邏輯 → 第二個 monolith |
Related Notes
- 11-Infrastructure/02-Load-Balancer — Gateway 前面掛 LB,兩者分工
- 03-API-Design/05-API-Security — JWT / OAuth / mTLS / RBAC,Gateway 認證的基礎
- 03-API-Design/01-API-Design-Framework — 外部 REST / 內部 gRPC,Gateway 做協定轉換
- 01-Networking/06-Load-Balancing — L4/L7 LB 與 CDN 的網路層視角
- 11-Infrastructure/04-Serverless — AWS API Gateway + Lambda 是經典 Serverless 入口
- 07-Caching-Storage/01-Caching — Gateway 快取與限流計數器都依賴 Redis