1. 基本概念
路由是 Spring Cloud Gateway 的基本組成單元。它定義了從客戶端接收到的請求應該被轉發到哪個目標服務。一個完整的路由通常包含以下幾個要素:
- ID (id):路由的唯一標識符。
- 目標 URI (uri):請求最終要被轉發到的后端服務地址。
- 斷言集合 (predicates):一個或多個斷言的集合,用于匹配傳入的請求。
- 過濾器集合 (filters):一個或多個過濾器集合,用于在請求轉發前后對請求或響應進行修改。
簡單來說,路由就是一條規則,告訴網關:“如果請求滿足某些條件(斷言),就把它發到這個地方(URI),并在發送前后做一些處理(過濾器)。”
斷言就是 判斷傳入的請求是否滿足路由規則中定義的條件。只有當一個路由中的所有斷言都評估為 true
時,該路由才會被匹配成功。
# 路由配置
spring:cloud:gateway:routes:- id: user-service # 路由IDuri: http://localhost:8081 # 目標URIpredicates: # 斷言集合(匹配條件)- Path=/user/** # 路徑斷言- Method=GET # 方法斷言- Header=X-Request-Id, \d+ # 請求頭斷言filters: # 過濾器集合- StripPrefix=1
2. 工作流程
3. 常用斷言類型
Spring Cloud Gateway 提供了許多內置的斷言工廠,可以根據請求的不同屬性進行匹配,
predicates:
# 路徑匹配# Path 斷言:根據請求路徑匹配,例如 /users/**。- Path=/api/user/{id}
# 時間相關# After/Before/Between 斷言:根據請求到達時間匹配。- After=2023-01-01T00:00:00+08:00- Before=2023-12-31T23:59:59+08:00- Between=2023-01-01T00:00:00+08:00,2023-12-31T23:59:59+08:00
# HTTP相關# Method 斷言:根據 HTTP 請求方法匹配,例如 GET, POST。- Method=GET,POST# Header 斷言:根據請求頭信息匹配,例如 Host=example.com。- Header=X-Request-Id, \d+# Query 斷言:根據查詢參數匹配,例如 param=value。- Query=name, jack# Cookie 斷言:根據 Cookie 信息匹配。- Cookie=session, abc
# 網絡相關# Host 斷言:根據請求的主機名匹配。- Host=**.example.com# RemoteAddr 斷言:根據客戶端 IP 地址匹配。- RemoteAddr=192.168.1.0/24
4. 自定義斷言
@Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {@Overridepublic Predicate<ServerWebExchange> apply(Config config) {return exchange -> {// 自定義匹配邏輯return exchange.getRequest().getHeaders().getFirst("Custom-Header").equals(config.getValue());};}@Datapublic static class Config {private String value;}
}