一、Spring Cloud Gateway 是什麼
在微服務架構中,系統通常被拆分為多個獨立的小服務,每個服務有自己的端口與職責。
但用户請求需要通過統一入口進入系統,並正確路由到目標服務,這就是 API 網關(Gateway) 的職責。
Spring Cloud Gateway 是 Spring 官方推出的新一代網關組件,基於 Spring WebFlux + Reactor 響應式編程模型 構建,取代了老舊的 Zuul 1.x。
✅ 它與 Spring Cloud 全家桶(Nacos、OpenFeign、LoadBalancer) 無縫集成,具備高性能、可擴展、易維護等特性。
二、核心功能
|
功能項
|
説明
|
|
路由(Routing) |
按路徑、方法、請求頭、參數等規則轉發請求
|
|
過濾器(Filters) |
在請求進入或響應返回時攔截,如鑑權、限流、日誌
|
|
服務發現與負載均衡 |
結合 Nacos / LoadBalancer 實現動態服務發現
|
|
動態路由 |
路由可從配置中心(如 Nacos Config)動態更新,無需重啓
|
三、執行流程:從請求到轉發的全過程
我們以訪問 /order/get 為例,來看 Gateway 的完整執行鏈路。
1️⃣ 請求到達 Gateway
所有外部請求(如前端 API 調用)首先到達 Gateway 的監聽端口(如 8080)。
2️⃣ 匹配路由規則(Route Predicate)
Gateway 會根據配置文件中定義的匹配規則,判斷該請求應路由到哪個微服務:
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/order/**
lb://order-service表示使用負載均衡,從 Nacos 獲取order-service實例。
3️⃣ 執行過濾器鏈(Filters)
在路由轉發前後,Gateway 會執行一系列過濾器。
常見過濾器場景包括:
- 鑑權過濾器:校驗 Token;
- Header 增強:添加統一請求頭;
- 限流與熔斷:控制訪問頻率;
- 日誌記錄:記錄請求耗時與路徑。
4️⃣ 通過 LoadBalancer 選擇實例
Gateway 調用 Spring Cloud LoadBalancer,從 Nacos 拉取 order-service 的服務實例列表。
然後根據策略(輪詢、隨機、權重等)選出目標實例。
5️⃣ 發起請求
Gateway 使用 WebClient(響應式 HTTP 客户端)將請求轉發到選中的服務節點。
6️⃣ 響應返回
目標服務返回響應後,響應數據同樣會經過過濾器鏈(如日誌、統一包裝等),再返回客户端。
四、身份認證放在哪更合適?
|
放置位置
|
優點
|
缺點
|
適用場景
|
|
微服務內部認證 |
每個服務獨立控制,靈活性高
|
重複開發、資源浪費
|
小型項目或差異化認證需求
|
|
Gateway 網關層認證 ✅ |
統一認證、性能高、維護簡單
|
網關壓力較大
|
中大型微服務系統首選
|
📘 結論:
推薦將認證邏輯放在 Gateway 層,實現統一 Token 驗證與權限控制。
🔒 示例:全局 Token 認證過濾器
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !isValidToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() { return -1; }
}
五、LoadBalancer 與 Ribbon 的區別
|
對比項
|
Ribbon(舊版)
|
LoadBalancer(新版)
|
|
所屬模塊
|
Netflix Ribbon(已停止維護)
|
Spring Cloud 官方
|
|
實現方式
|
基於阻塞 IO
|
基於響應式(Reactor)
|
|
配置方式
|
需使用 |
Spring Boot 自動裝配
|
|
負載算法
|
內置隨機、輪詢
|
可插拔策略(隨機、權重、Zone等)
|
|
支持框架
|
Feign、RestTemplate
|
Gateway、Feign、WebClient
|
|
維護狀態
|
❌ 停止維護
|
✅ 官方推薦
|
📘 簡單理解:
- Ribbon 是過去獨立的客户端負載均衡;
- LoadBalancer 是現在官方內置方案,更輕量、響應式、與 Gateway 深度融合。
六、小項目中沒有 Gateway 時,可以使用 Ribbon 嗎?
✅ 可以,而且很常見。
在一些服務數量少(3~5個以內)、調用鏈簡單的小型項目中,引入 Gateway 反而增加複雜度。
這種情況下,可以直接使用 Ribbon 或 LoadBalancer 實現服務間的負載均衡。
示例:
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/user/{id}")
UserDTO getUser(@PathVariable Long id);
}
Ribbon 的流程:
- 從 Nacos 拉取
user-service實例; - 選擇一個實例(輪詢、隨機等);
- 發起 HTTP 調用。
✅ 對比 Gateway 與 Ribbon
|
對比維度
|
Ribbon(或 LoadBalancer)
|
Gateway
|
|
層級 |
服務間調用(Feign / RestTemplate)
|
系統入口層
|
|
功能 |
僅負責負載均衡
|
限流、認證、日誌、動態路由
|
|
性能 |
開銷小
|
稍高(多一層轉發)
|
|
複雜度 |
簡單快速
|
配置較多
|
|
適用場景 |
小型項目、內部系統
|
中大型項目、對外接口層
|
📘 結論:
- 小項目:Ribbon / LoadBalancer 足夠用
- 大項目:必須使用 Gateway 統一網關層
七、Gateway + Nacos + OpenFeign 的完整鏈路關係
完整的服務調用鏈如下:
[Client] → [Spring Cloud Gateway]
→ [Nacos Service Discovery]
→ [Order-Service]
→ [OpenFeign]
→ [User-Service]
1️⃣ 客户端請求進入 Gateway
Gateway 根據路由規則匹配目標服務,如 lb://order-service。
2️⃣ Nacos 服務發現
Gateway 從 Nacos 獲取可用實例,LoadBalancer 根據策略選擇目標。
3️⃣ Gateway 轉發請求
認證、限流、日誌在此階段處理。
4️⃣ Order-Service 內部調用 Feign
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/user/{id}")
UserDTO getUser(@PathVariable Long id);
}
Feign 再次通過 LoadBalancer 從 Nacos 獲取 user-service 實例發起請求。
5️⃣ Nacos 健康維護
Nacos 持續接收服務實例心跳,Gateway 與 Feign 動態感知節點變化。
八、常見問題與優化建議
|
問題
|
原因
|
解決方案
|
|
認證過濾器性能瓶頸
|
每次查詢數據庫驗證 Token
|
使用 Redis 或 JWT 無狀態認證
|
|
負載不均
|
默認輪詢策略過於簡單
|
自定義負載策略(基於響應時間或 CPU)
|
|
網關單點問題
|
Gateway 實例只有一個
|
部署多個 Gateway + Nginx Ingress
|
九、整體架構總結
|
模塊
|
職責
|
核心作用
|
|
Gateway |
請求入口、統一認證、限流、日誌
|
控制與安全
|
|
Nacos |
服務註冊與發現
|
服務治理
|
|
OpenFeign |
微服務通信
|
業務調用
|
|
LoadBalancer |
負載均衡策略
|
流量調度
|
總結一句話
在 Spring Cloud 微服務體系中,Gateway + Nacos + LoadBalancer + Feign 構成了完整的服務調用鏈。
它讓每個微服務既能保持獨立,又能高效協作,是現代分佈式系統的標準架構核心。