6.3 ESB 與 API Gateway:統一協議與路由#
協議巴別塔#
到這裡,系統裡有 Dubbo TCP、Spring Cloud HTTP、RocketMQ 消息、HBase/ES 各種客戶端。前端 App、H5、小程序各調各的,後端一改介面,前端跟著改。內部調用亂、外部接入更亂,需要一個統一入口。
早期答案是 ESB(企業服務匯流排),後來演進為更輕的 API Gateway。
flowchart TD
APP[App/H5/小程序] -->|HTTPS + JSON| GW[API Gateway:鑑權、限流、路由]
GW -->|Dubbo| A[商品服務]
GW -->|HTTP| B[交易服務]
GW -->|消息| Q[(MQ)]
GW -->|檢索| E[(ES)]ESB vs Gateway:一重一輕#
| 維度 | ESB(SOA 時代) | API Gateway(微服務時代) |
|---|---|---|
| 位置 | 中央匯流排,所有邏輯走它 | 邊緣閘道,只做橫切面 |
| 功能 | 協議轉換、編排、重規則引擎 | 路由、鑑權、限流、灰階 |
| 優點 | 統一管控、適合異構系統整合 | 輕量高性能、去中心化 |
| 缺點 | 中央過重、單點瓶頸、難擴展 | 業務編排要服務自己做 |
| 代表 | Mule、WebSphere MB | Zuul、Spring Cloud Gateway、Higress |
# Spring Cloud Gateway:統一路由 + 限流
spring:
cloud:
gateway:
routes:
- id: item-route
uri: lb://item-service # 負載均衡到商品服務
predicates:
- Path=/api/items/**
filters:
- StripPrefix=1
- name: RequestRateLimiter # 閘道層直接限流
args:
redis-rate-limiter.replenishRate: 1000
閘道只做「橫切面」:鑑權、限流(呼應 5.4)、日誌、灰階路由。業務編排(先查商品再建單)留在業務服務裡,避免 ESB 式的中央巨無霸。
SOA vs 微服務:一句話辨析#
| 維度 | SOA + ESB | 微服務 + Gateway |
|---|---|---|
| 拆分粒度 | 粗:幾個大服務 | 細:圍繞限界上下文的小服務 |
| 通訊 | ESB 中央編排 | 服務直連 + 閘道在邊緣 |
| 資料 | 常共享資料庫 | 各服務私有庫(5.1 紀律) |
| 治理 | 重流程、重規範 | 輕協議、自治 + 可觀測 |
可以這樣記:SOA 是「中央集權」,微服務是「聯邦自治」。淘寶從 ESB 走向 Gateway,就是從集權走向自治的縮影。
閘道實戰:鑑權、灰階一次收斂#
flowchart LR
U[請求] --> AUTH[鑑權:Token 合法?]
AUTH -->|非法| R401[401 拒絕]
AUTH -->|合法| GRAY{灰階路由}
GRAY -->|userId 尾號 0| NEW[新版交易 v2]
GRAY -->|其餘| OLD[穩定版 v1]// 閘道過濾器:統一鑑權,業務服務不再各寫一遍
@Component
public class AuthFilter implements GlobalFilter {
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("X-Token");
if (!authService.verify(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
}
鑑權、限流、日誌、灰階四件事在閘道做一次,全站生效;業務服務專心做業務。這也是後來 Higress、Envoy 把閘道做成獨立層的起點。
本章小結#
- 服務多了需要統一入口:對外收斂協議,對內路由到異構後端。
- ESB 重而中央,Gateway 輕而在邊緣;微服務時代選 Gateway。
- SOA vs 微服務:粒度、通訊、資料所有權三處不同。
- 架構很美好,但幾十個服務的部署運維已成噩夢,下一節直面運維地獄。
想一想#
- 為什麼 ESB 的「中央編排」在服務變多後會成為瓶頸?Gateway 如何避開?
- 閘道適合放哪些功能?為什麼「下單編排」不該放在閘道裡?
- 用「中央集權 vs 聯邦自治」比喻 SOA 和微服務,各有什麼代價?