SpringCloud之Gateway
官網地址:
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
1. 什么是gateway
Spring Cloud Gateway 是Spring Cloud官方推出的第二代網關框架,定位于取代 Netflix Zuul。相比 Zuul 來說,Spring CloudGateway 提供更優秀的性能,更強大的有功能。
Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 實現的響應式的 API 網關。它不能在傳統的 servlet 容器中工作,也不能構建成 war 包。
Spring Cloud Gateway 旨在為微服務架構提供一種簡單且有效的 API 路由的管理方式,并基于 Filter 的方式提供網關的基本功能,例如安全認證、監控、限流等等。
2. 優勢
2.1 非阻塞式 & 高性能:
基于 Netty 和 Project Reactor(響應式編程模型)構建,采用異步非阻塞 I/O。
相比傳統的同步阻塞式網關(如 Zuul 1.x),它能更高效地處理高并發請求,資源消耗更低,性能顯著提升。
2.2 聲明式配置:
支持通過 Java DSL(領域特定語言)或 YAML/Properties 配置文件定義路由規則、斷言、過濾器等,配置靈活直觀。
2.3 強大的路由能力:
基于多種斷言 (Predicate) 精確匹配請求(如路徑、方法、Header、Host、Cookie、查詢參數、時間、權重等)。
支持動態路由(如從配置中心 Nacos、Consul 動態加載路由配置)。
2.4 豐富的過濾器 (Filter):
提供大量內置過濾器,用于修改請求和響應(如添加/刪除 Header、路徑重寫、參數修改、重定向、Hystrix 熔斷、請求限流、重試、修改響應體等)。
支持自定義過濾器,滿足特定業務需求(如認證、日志、加解密)。
過濾器分為 GatewayFilter (作用于單個路由) 和 GlobalFilter (作用于所有路由)。
2.5 易于集成:
無縫集成 Spring Cloud Discovery Client(Eureka, Nacos, Consul),實現服務發現和動態路由。
輕松集成 Spring Cloud CircuitBreaker(Resilience4j, Sentinel)實現熔斷降級。
集成 Spring Cloud LoadBalancer 實現客戶端負載均衡。
與 Spring Security 集成實現 OAuth2/JWT 等安全認證。
2.6 支持 WebSocket:
內置對 WebSocket 路由的支持。
3. 核心特性
Spring Cloud Gateway 的核心處理流程圍繞著三個關鍵概念: 路由 (Route),斷言 (Predicate),過濾器 (Filter)。
3.1 路由 (Route):
網關的基本構建塊。定義了一個請求如何被轉發到后端服務(目標 URI)。
包含:
-
ID: 路由的唯一標識符。
-
目標 URI: 請求最終被轉發到的地址(可以是 http://, https://, lb:// (服務名負載均衡), ws://, wss://)。
-
斷言 (Predicates) 集合: 一組匹配規則,決定當前請求是否適用此路由。
-
過濾器 (Filters) 集合: 一組在處理請求和響應前后執行的邏輯(針對此特定路由)。
示例配置 (YAML):
spring:cloud:gateway:routes:- id: user_service_route # 路由IDuri: lb://user-service # 目標URI (lb:// 表示負載均衡到 user-service)predicates: # 斷言集合- Path=/api/users/** # 匹配以 /api/users/ 開頭的請求路徑filters: # 過濾器集合- StripPrefix=1 # 去掉路徑前綴1級 (/api/users/foo -> /foo)- AddRequestHeader=X-Request-UserService, gateway-user # 添加請求頭
3.2 斷言 (Predicate):
Java 8 的 Predicate 函數式接口實現。
接收 ServerWebExchange 對象(包含 HTTP 請求的所有信息),根據請求的屬性(如路徑、方法、Header、Host、Cookie、查詢參數、時間等)進行邏輯判斷。
返回 boolean 值:true 表示請求匹配成功,該路由規則生效;false 表示不匹配。
常見內置斷言:
-
Path: 請求路徑匹配 (Ant 風格或正則表達式)。
-
Method: HTTP 方法匹配 (GET, POST, PUT, DELETE 等)。
-
Header: 檢查請求頭是否存在或值匹配正則。
-
Host: 匹配請求頭 Host 的值。
-
Cookie: 檢查指定 Cookie 是否存在或值匹配正則。
-
Query: 檢查請求參數是否存在或值匹配正則。
-
After, Before, Between: 基于時間匹配請求。
-
RemoteAddr: 匹配客戶端 IP 地址(CIDR 表示法)。
-
Weight: 按權重分組路由(常用于灰度發布)。
多個斷言關系: 默認情況下,一個路由中的所有斷言必須同時為 true,該路由才算匹配成功(邏輯與 AND)。
3.3 過濾器 (Filter):
基于 Spring Framework GatewayFilter 工廠構建。
在路由匹配成功后,請求被轉發到目標服務之前 (pre 邏輯) 和收到目標服務響應之后 (post 邏輯) 執行特定操作。
- 作用:
修改請求 (pre): 添加/修改 Header、參數、路徑重寫、請求體修改、鑒權、限流、熔斷等。
修改響應 (post): 添加/修改 Header、修改狀態碼、修改響應體、日志記錄等。
- 類型:
GatewayFilter: 應用于特定路由。在路由配置的 filters 部分定義。
GlobalFilter: 應用于所有路由。通過 @Bean 方式注冊到 Spring 上下文即可生效。常用于全局邏輯如認證、日志、監控。
-
常見內置過濾器:
AddRequestHeader / AddResponseHeader: 添加請求/響應頭。RemoveRequestHeader / RemoveResponseHeader: 移除請求/響應頭。SetRequestHeader / SetResponseHeader: 設置(覆蓋)請求/響應頭。RewritePath: 重寫請求路徑(正則表達式替換)。PrefixPath: 為請求路徑添加前綴。StripPrefix: 移除請求路徑的前綴(指定級數)。SetPath: 直接設置請求路徑(支持模板變量)。RedirectTo: 重定向(302/301)。SaveSession: 強制保存 WebSession(常用于分布式會話)。SetStatus: 設置響應的 HTTP 狀態碼。RequestRateLimiter: 請求限流(需集成 Redis 或其它實現)。Retry: 請求重試(配置重試次數、條件等)。Hystrix: 熔斷(注意:Spring Cloud 2020.0.0 后移除了 Netflix 堆棧,推薦使用 Resilience4j 或 Sentinel 的過濾器)。ModifyRequestBody / ModifyResponseBody: 高級功能,修改請求/響應體內容(需謹慎使用,性能影響較大)。
4. 執行流程
┌────────────┐
│ Client │ ① 發送 HTTP 請求
└────┬───────┘│
┌────▼────────────┐
│ Gateway Handler │ ② Route Predicate 匹配
│ Mapping │ - Path / Host / Header / Method …
└────┬────────────┘│ 找到匹配的路由
┌────▼────────────┐
│ Gateway Web │ ③ 把請求交給 Handler
│ Handler │
└────┬────────────┘│ 進入該路由的 Filter Chain
┌────▼────────────┐
│ Pre-Filter鏈 │ ④ 在代理之前執行
│ (限流、鑒權…) │
└────┬────────────┘│
┌────▼────────────┐
│ Proxy Request │ ⑤ 轉發到下游服務
│ (Netty Client) │
└────┬────────────┘│
┌────▼────────────┐
│ Post-Filter鏈 │ ⑥ 在代理之后執行
│ (日志、加頭…) │
└────┬────────────┘│
┌────▼────────────┐
│ Client │ ⑦ 收到最終響應
└─────────────────┘
說明:
步驟 | 組件/類 | 說明 |
---|---|---|
① 接收請求 | Netty Reactor | 網關基于 WebFlux + Netty,非阻塞接收。 |
② 路由匹配 | RoutePredicateHandlerMapping | 根據 predicates 判斷哪個 Route 命中。 |
③ 創建執行鏈 | FilteringWebHandler | 把命中的 Route 對應的 GatewayFilter 串成鏈。 |
④ Pre-Filter | GatewayFilter#filter | 在 下游調用前 執行:鑒權、限流、日志、加頭。 |
⑤ 代理請求 | NettyRoutingFilter | 使用 Netty 客戶端發送 HTTP/HTTPS 請求到下游。 |
⑥ Post-Filter | GatewayFilter#filter | 在 拿到響應后 執行:改寫響應頭、記錄耗時、熔斷降級。 |
⑦ 返回客戶端 | NettyWriteResponseFilter | 把最終響應寫回原始客戶端連接。 |
5. 應用
-
統一入口 & 路由: 所有外部請求統一訪問網關,網關根據規則路由到內部微服務。
-
認證鑒權: 在 GlobalFilter 中實現 JWT 校驗、OAuth2 集成、基礎認證等,保護后端服務。
-
限流熔斷: 使用 RequestRateLimiter 過濾器(如基于 Redis)進行限流;集成 Resilience4j 或 Sentinel 實現熔斷降級,防止服務雪崩。
-
日志審計: 在 GlobalFilter 中記錄請求和響應的關鍵信息(如請求ID、路徑、方法、狀態碼、耗時等),用于監控和審計。
-
灰度發布 / 金絲雀發布: 利用 Weight 斷言或自定義 Predicate/Filter 實現按權重、Header、Cookie、用戶ID 等條件將流量分發到不同版本的服務。
-
跨域處理 (CORS): 在網關層統一配置 CORS 策略,避免每個微服務單獨處理。
-
路徑重寫與聚合: 使用 RewritePath, PrefixPath, StripPrefix 等過濾器簡化客戶端請求路徑或適配后端服務路徑。對于前端聚合請求,可以考慮使用 ModifyRequestBody/ModifyResponseBody(性能需評估)或結合 GraphQL。
-
監控集成: 集成 Micrometer 和 Prometheus/Grafana,暴露網關的指標(請求數、耗時、錯誤率等)。
6. 總結
Spring Cloud Gateway 是一個功能強大、性能優異、易于擴展的現代 API 網關解決方案。它通過路由、斷言、過濾器三大核心概念,為微服務架構提供了統一的入口、靈活的請求路由能力、強大的請求/響應處理機制以及必要的橫切面功能(安全、限流、熔斷、日志等)。其基于響應式編程模型的設計使其在高并發場景下表現卓越。結合 Spring Cloud 生態的其他組件(如服務發現、配置中心、熔斷器),Spring Cloud Gateway 是構建健壯、可擴展、易管理的微服務系統的理想選擇。