Spring Cloud Gateway的路由匹配的功能是以 Spring WebFlux中的Handler Mapping為基礎實現的。
Spring Cloud Gateway 創建 Route 對象時, 使用 RoutePredicateFactory 創建 Predicate 對象,Predicate 對象可以賦值給 Route。 Spring Cloud Gateway 包含許多內置的Route Predicate Factories。所有這些斷言都匹配HTTP請求的不同屬性。多種斷言工廠可以組合,並通過邏輯and。
路由選擇是通過Predicate函數式接口進行判斷當前路由是否滿足給定條件。匹配成功則進行轉發,否則處理失敗。
路由斷言工廠 RoutePredicateFactory
路由斷言工廠 RoutePredicateFactory 包含的主要實現類如圖所示,可以看到該接口有多個實現類。
抽象類 AbstractRoutePredicateFactory 實現了路由斷言工廠,但是沒有實際的方法,具體的實現類都是繼承自抽象類 AbstractRoutePredicateFactory 包括 Datetime、 請求的遠端地址、 路由權重、 請求頭、 Host 地址、 請求方法、 請求路徑和請求參數等類型的路由斷言。
下面以Query路由斷言工廠(QueryRouteRedicateFactory)為示例,演示Spring Cloud Gateway路由斷言的具體使用。
1. 引用gateway的jar包依賴。
<dependency>
<groupid>org.springframework.cloud/<groupid>
<artifactid>spring-cloud-starter-gateway/<artifactid>
2. 使用Java代碼自定義RouteLocator的配置。
在啟動類Application配置網關路由,如下所示,定義bean對象。
上述代碼,也可以使用屬性文件的配置方式,如在application.yml 中配置(二選一即可)。
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://baidu.com
predicates:
- Query=name, rickie
3. 啟動演示項目
演示項目中的application.yml 配置參數如下。
訪問 http://localhost:8080/?name=rickie,就會成功轉發到對應的uri,因為斷言匹配成功。
閱讀更多 軟件架構 的文章