啟動 Gateway 日志中會打印 加載的斷言
(官網介紹:https://cloud.spring.io/spring-cloud-gateway/reference/html/#gateway-request-predicates-factories)
Loaded RoutePredicateFactory [After]
Loaded RoutePredicateFactory [Before]
Loaded RoutePredicateFactory [Between]
Loaded RoutePredicateFactory [Cookie]
Loaded RoutePredicateFactory [Header]
Loaded RoutePredicateFactory [Host]
Loaded RoutePredicateFactory [Method]
Loaded RoutePredicateFactory [Path]
Loaded RoutePredicateFactory [Query]
Loaded RoutePredicateFactory [ReadBody]
Loaded RoutePredicateFactory [RemoteAddr]
Loaded RoutePredicateFactory [Weight]
Loaded RoutePredicateFactory [CloudFoundryRouteService]
Predicate 是一個函數式接口
GatewayPredicate 是一個接口,實現類:
配置時命名規則為 前綴單詞 XxxRoutePredicateFactory 命名為 Xxx,如:PathRoutePredicateFactory 配置時命名為 : Path
配置示例:
cloud: gateway: discovery: locator: enabled: true # 開啟當前項目服務注冊與發現功能, lower-case-service-id: true # 把服務名轉換為小寫,Eureka中默認都是大寫 routes: - id: demo #自定義唯一標識,只要不重復即可 # lb:loadBalance 負載均衡 server-name 代理項目的名 uri: lb://server-name # 路徑規則,命名需要遵循,XxxRoutePredicateFactory 命名:Xxx,簡單類型配置簡化書寫 # predicates: Path=/demo/**,/a/**,/b/** # 或者完整書寫 predicates: # 對應類型的命名前綴 - name: Path # 對應可配置的參數集合 args: # args 為 Map<String,String> 類型,Map類型配置 key: value key: value # PathRoutePredicateFactory 類中 內部類Config 類屬性為 List<String> patterns,即可泛型為簡單類型可以用","分隔如下: - patterns=/a/**,/b/** # 配置請求頭斷言 - name: Header args: # 如校驗請求頭必須攜帶客戶端來源: Origin=IOS-App,regexp正則表達式 - header: Origin regexp: IOS-App - header: My-Hearder regexp: my-hearder-value.* # 命名規則: filters: # 定義一個過濾器,格式:過濾器名稱=參數 或者 name: 名字 args: 參數 - StripPrefix=1 # 轉發后忽略第一層
Query
設置必須包含的參數名。
下面兩種寫法等效。都表示路徑滿足 /demo/** 同時包含參數abc。
Path 和 Query 是斷言。abc是請求參數名稱。
在瀏覽器中輸入: http://localhost:9000/demo/one?abc=jqk
predicates: Path=/demo/**,Query=abc
predicates:
- Path=/demo/**
- Query=abc
設置參數的值:
abc請求參數名稱。jqk. 是abc的值,是一個正則表達式。在正則表達式中點(.)表示匹配任意一個字符。所以當請求參數abc=jqka或abc=jqkw能滿足斷言條件。
在斷言中賦值使用逗號(,)賦值因為Query后面已經有等號,在值內容中不能在出現等號語法。
predicates:
- Query=abc,jqk.
Header:
表示請求頭中必須包含的內容,參數名和參數值之間依然使用逗號,參數值要使用正則表達式,如果Header只有一個值表示請求頭中必須包含的參數。如果有兩個值,第一個表示請求頭必須包含的參數名,第二個表示請求頭參數對應值
predicates: - Header=Connection,keep-alive - Header=Cache-Control,max-age=0
兩個參數:一個屬性名稱,一個正則表達式,這個屬性的值和正則表達式匹配成功才會執行路由
- Header=X-Request-Id, \d+ : 請求頭要有 X-Request-Id ,並且值為 整數
執行測試:
curl http://localhost:11001/socket --H "X-Request-Id=1234"
Method:
Method表示請求方式。支持多個值,使用逗號分隔,表示多個值之間為 or 條件,如下: 表示 請求方式 為: GET 或者 POST
predicates:
- Method=GET,POST
RemoteAddr:
允許訪問的客戶端地址。要注意使用127.0.0.1而不要使用localhost
predicates:
- RemoteAddr=127.0.0.1,192.168.0.*
Host
匹配請求參數中Host參數的值。滿足Ant模式(之前在Spring Security中學習過)可以使用
predicates:
- Host=127.0.0.1:9000
Cookie:
要求請求中包含指定Cookie名和滿足特定正則要求的值。Cookie必須有兩個值,第一個Cookie包含的參數名,第二個表示參數對應的值,正則表達式。不支持一個參數寫法:
predicates:
- Cookie=age,.*
通過 curl 命令進行訪問
Cookie Route Predicate 需要兩個參數,一個是 cookieName,一個是正則表達式,路由會通過 CookieName 值 和正則表達式去匹配,如果匹配上就執行路由,否則不執行路由
curl http://localhost:11001/socket --cookie "age=18"
Before:
在指定時間點之前
predicates:
- Before=2020-01-31T18:00:00.000+08:00[Asia/Shanghai]
After
限定什么時間之后路由可以生效
routes: # 路由ID,沒有固定的規則要求,但要求唯一性,建議配合服務名 - id: netty-socket # 匹配后提供服務的路由地址 uri: lb://braineex-search predicates: # 斷言,路徑相匹配的才進行路由 - Path=/socket/** - After=2020-12-23T14:06:18.250+08:00[Asia/Shanghai]
Between
時間區間范圍內有效
- Between=2020-12-23T14:06:18.250+08:00[Asia/Shanghai],2021-12-23T14:06:18.250+08:00[Asia/Shanghai]
Weight
多版本服務發布的時候,偶爾使用。v1.0+v1.1兩個版本同時發布服務。內容一致,實現機制不同。發布兩個不同命名的服務集群。使用Gateway做負載均衡。
負載均衡中權重。同一個組中URI進行負載均衡。
語法:Weight=組名,負載均衡權重
在注冊兩個服務,這個服務(項目)是相同的,應用程序名分別叫做demo-one和demo-two。
Gateway在路由匹配時demo-one將占20%,demo-two將占80%
routes: - id: suiyi uri: lb://demo-one predicates: - Path=/demo/** - Weight=group,2 filters: StripPrefix=1 - id: suiyi2 uri: lb://demo-two predicates: - Path=/demo/** - Weight=group,8 filters: StripPrefix=1
>>>>>>>>>>>>>> 下一篇 : https://www.cnblogs.com/Alay/p/15150532.html <<<<<<<<<<<<<<<<<