詳解Spring Cloud Gateway應(yīng)用1之謂詞
環(huán)境:springboot2.3.7 + spring cloud Hoxton.SR9
Spring Cloud Gateway工作流程:

客戶端調(diào)用spring cloud gateway配置的請求。根據(jù)配置的映射確定請求與路由,將其發(fā)送到網(wǎng)關(guān)Web處理程序。此處理程序通過特定于請求的過濾器運行請求。過濾器被虛線分割的原因是,過濾器可以在代理請求發(fā)送之前和之后運行邏輯。執(zhí)行所有“pre”過濾器邏輯。然后發(fā)出代理請求。在發(fā)出代理請求之后,運行“post”過濾器邏輯。
一. 路由謂詞
1.After 路由謂詞工廠
作用:After 謂詞工廠接受一個參數(shù)datetime(它是java ZonedDateTime)。此謂詞匹配在指定日期時間之后發(fā)生的請求。以下示例配置After Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: after_route
- uri: https://www.baidu.com
- predicates:
- - After=2021-01-10T17:42:47.789-07:00
所有的請求必須在2021-01-10T17:42:47.789-07:00之后才能訪問。當(dāng)超過當(dāng)前配置的這個時間,請求會返回404。
測試:
當(dāng)前時間:2021-01-11 17:09
After=2021-01-10T17:42:47.789-07:00

正常調(diào)整到了頁面:
設(shè)置:
After=2021-01-20T17:42:47.789-07:00

2.Before 路由謂詞工廠
作用:Before 謂詞工廠接受一個參數(shù)datetime(它是java ZonedDateTime)。此謂詞匹配在指定日期時間之前發(fā)生的請求。以下示例配置Before Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: before_route
- uri: https://www.qq.com
- predicates:
- - Before=2021-01-10T17:42:47.789-07:00
運行結(jié)果與After正好相反。
3.Between 路由謂詞工廠
作用:Between謂詞工廠接受兩個參數(shù)datetime(它是java ZonedDateTime)。此謂詞匹配請求必須在兩個日期之間發(fā)生。以下示例配置Between Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: between_route
- uri: https://www.163.com
- predicates:
- - Between=2021-01-01T17:42:47, 2021-01-10T17:42:47
請求必須位于2021-01-01T17:42:47到2021-01-10T17:42:47之間,如果超過這個日期范圍返回
404。
失?。?/p>
配置:Between=2021-01-01T17:42:47, 2021-01-10T17:42:47

4.Cookie 路由謂詞工廠
作用:只有網(wǎng)關(guān)請求中包含指定的cookie 才能匹配,否則404。以下示例配置Cookie Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: cookie_route
- uri: https://www.baidu.com
- predicates:
- - Cookie=code,testiptv255
當(dāng)請求header中包含的Cookie中包含name為code,值為testiptv255時,請求才能被匹配。
示例:

當(dāng)不包含name為code的cookie時請求返回404。
5.Header 路由謂詞工廠
作用:當(dāng)請求中包含指定的Header信息時,請求才能匹配。以下示例配置Header Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: header_route
- uri: https://www.baidu.com
- predicates:
- - Header=Host,localhost:20000
當(dāng)網(wǎng)關(guān)請求Header中包含Host請求頭,并且值為localhost:20000,請求才會被匹配。
示例:

6.Host 路由謂詞工廠
作用:當(dāng)請求Header中的Host頭信息為配置中的列表中,那么網(wǎng)關(guān)將被匹配。以下示例配置Host Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: host_route
- uri: https://www.baidu.com
- predicates:
- - Host=**.xg.com,localhost:20000
當(dāng)請求Header中的Host取值為:www.xg.com或者xxx.xg.com或者localhost:20000時路由將被匹配:
示例:

7.Method 路由謂詞工廠
作用:當(dāng)請求是指定的Method時,路由將被匹配。以下示例配置Method Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: method_route
- uri: https://www.baidu.com
- predicates:
- - Method=GET,POST
當(dāng)請求是GET或者是POST請求時,網(wǎng)關(guān)路由將會被匹配。
示例:

8.Path 路由謂詞工廠
作用:當(dāng)請求的路徑為指定的Path時,路由將會被匹配。以下示例配置Path Route謂詞:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: path_route
- uri: https://www.baidu.com
- predicates:
- - Path=/api-a/{segment},/api-1/{segment}
當(dāng)請求的地址為:http://xxx/api-a/xxx或者是http://xxx/api-1/xxx時,路由將會被匹配;注意:你的目標(biāo)地址應(yīng)該有/api-a/xxx和/api-1/xxx這兩個請求地址。
示例:

頁面顯示的404是因為http://www.baidu.com/api-a/1沒有這樣的請求地址是baidu返回的404,并不是我們服務(wù)器返回的404錯誤。
9.Query 路由謂詞工廠
作用:當(dāng)請求中包含指定的查詢參數(shù)或者是包含指定的查詢參數(shù)及值時才匹配路由。以下示例配置Query Route謂詞:
- 1、方式1:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: query_route
- uri: https://www.baidu.com
- predicates:
- - Query=name
- 2、方式2:
- spring:
- cloud:
- gateway:
- enabled: true
- discovery:
- locator:
- enabled: true
- lowerCaseServiceId: true
- routes:
- - id: query_route
- uri: https://www.baidu.com
- predicates:
- - Query=name,admin
方式1:當(dāng)請求中只要包含name參數(shù)即可。

方式2:當(dāng)請求中包含name參數(shù)名并且值為admin時匹配路由。

當(dāng)值非admin時返回404。