歡迎訪問我的GitHub
https://github.com/zq2599/blog_demos
內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等;
本篇概覽
- 本文是《Spring Cloud Gateway實戰》系列的第四篇,我們們將已有的斷言(predicate)的型別做個小結,今天的內容中,除了官方推薦的簡化版配置,還給出了動態路由時該斷言的JSON格式配置;
After
- <font color="blue">After</font>表示路由在指定時間之後才生效
- 配置檔案,注意時間字串的格式,<font color="blue">+08:00</font>表示東八區:
spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://127.0.0.1:8082
predicates:
- After=2021-08-16T07:36:00.000+08:00[Asia/Shanghai]
- 動態路由的JSON格式,注意<font color="blue">args</font>引數要用<font color="red">datetime</font>:
[
{
"id": "after_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "After",
"args": {
"datetime": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]"
}
}
]
}
]
Before
- <font color="blue">Before</font>表示路由在指定時間之前才生效
- 配置檔案:
spring:
cloud:
gateway:
routes:
- id: before_route
uri: http://127.0.0.1:8082
predicates:
- Before=2021-08-16T07:36:00.000+08:00[Asia/Shanghai]
- 動態路由的JSON格式,注意<font color="blue">args</font>引數要用<font color="red">datetime</font>:
[
{
"id": "before_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Before",
"args": {
"datetime": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]"
}
}
]
}
]
Between
- <font color="blue">Between</font>表示路由在指定時間段之內才生效,既然是時間段就是兩個引數,注意它們的寫法
- 配置檔案:
spring:
application:
name: hello-gateway
cloud:
gateway:
routes:
- id: between_route
uri: http://127.0.0.1:8082
predicates:
- Between=2021-08-16T07:36:00.000+08:00[Asia/Shanghai], 2021-08-16T08:15:00.000+08:00[Asia/Shanghai]
- 動態路由的JSON格式,注意<font color="blue">args</font>引數,起始時間是<font color="red">datetime1</font>,結束時間是<font color="red">datetime2</font>:
[
{
"id": "path_route_addr",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Between",
"args": {
"datetime1": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]",
"datetime2": "2021-08-16T08:18:00.000+08:00[Asia/Shanghai]"
}
}
]
}
]
Cookie
- <font color="blue">Cookie</font>表示cookie存在指定名稱,並且對應的值符合指定正規表示式,才算匹配成功
配置檔案:
spring: cloud: gateway: routes: - id: cookie_route uri: https://example.org predicates: - Cookie=chocolate, ch.p
- 動態路由的JSON格式,注意<font color="blue">args</font>引數:
[
{
"id": "cookie_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Cookie",
"args": {
"name": "chocolate",
"regexp": "ch.p"
}
}
]
}
]
Header
- <font color="blue">Header</font>表示header存在指定名稱,並且對應的值符合指定正規表示式,才算匹配成功
- 下面的例子要求header中必須存在<font color="blue">X-Request-Id</font>,並且值一定要是數字
- 配置檔案:
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+
- 動態路由的JSON格式,注意<font color="blue">args</font>引數是<font color="red">header</font>和<font color="red">regexp</font>,還要注意的是regexp的值裡面有兩個反斜槓(轉義問題):
[
{
"id": "header_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Header",
"args": {
"header": "X-Request-Id",
"regexp": "\\d+"
}
}
]
}
]
- 用postman測試的引數填寫和結果如下:
Host
- <font color="blue">Host</font>表示請求的host要和指定的字串匹配,並且對應的值符合指定正規表示式,才算匹配成功,可以同時指定多個host匹配表示式,下面的例子給了兩個,其中第一個指定了埠:
- 配置檔案:
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://127.0.0.1:8082
predicates:
- Host=test.com:8081,**.anotherhost.org
- 動態路由的JSON格式,注意<font color="blue">args</font>引數,另外通過實測發現,這裡regex的值是個正規表示式,因此上面配置檔案中的多個host,在此處要通過正規表示式的寫法實現(json陣列的寫法,在反序列化的時候總是出現異常,無法解析成功):
[
{
"id": "header_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Host",
"args": {
"regex": "test.com:8086"
}
}
]
}
]
Method
- <font color="blue">Method</font>非常好理解,匹配指定的方法型別(可以有多個)
- 配置檔案:
spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://127.0.0.1:8082
predicates:
- Method=GET,POST
- 動態路由的JSON格式,同樣,由於個人水平問題,暫時只實踐出指定單個方法的JSON寫法,如果你知道如何指定過個方法,還望告知,謝謝:
[
{
"id": "method_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Method",
"args": {
"methods": "GET"
}
}
]
}
]
Path
- <font color="blue">Path</font>很常用,匹配指定的方法型別(可以有多個)
- 配置檔案,注意<font color="blue">{segment}</font>,表示該位置的真實值可以被提取出來,在filter中可以使用,這在後續的filter文章中會有說明:
spring:
cloud:
gateway:
routes:
- id: path_route
uri: http://127.0.0.1:8082
predicates:
- Path=/hello/{segment},/lbtest/{segment}
- 動態路由的JSON格式,同樣,由於個人水平問題,暫時只實踐出指定單個方法的JSON寫法,如果你知道如何指定過個方法,還望告知,謝謝:
[
{
"id": "path_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Path",
"args": {
"pattern": "/hello/{segment}"
}
}
]
}
]
Query
- <font color="blue">Query</font>匹配的是請求中是否帶有指定的引數,也能要求該引數等於指定的值(正規表示式)才被匹配上
- 配置檔案,只要帶有名為<font color="blue">name</font>的請求引數就被匹配:
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://127.0.0.1:8082
predicates:
- Query=name
- 如下所示,還可以指定name引數的值必須<font color="blue">aaa.</font>,這個小數點表示匹配一個字元,例如<font color="blue">name=aaa1</font>或者<font color="blue">name=aaa2</font>都可以:
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://127.0.0.1:8082
predicates:
- Query=name,aaa.
- 動態路由的JSON格式,注意引數名和引數值分別用<font color="blue">param</font>和<font color="blue">regexp</font>來設定:
[
{
"id": "query_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Query",
"args": {
"param": "name",
"regexp": "aaa."
}
}
]
}
]
- 測試如下:
RemoteAddr
- <font color="blue">RemoteAddr</font>很好理解,匹配的指定來源的請求
- 配置檔案:
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://127.0.0.1:8082
predicates:
- RemoteAddr=192.168.50.134/24
- 動態路由的JSON格式,注意引數名和引數值分別用<font color="blue">param</font>和<font color="blue">regexp</font>來設定:
[
{
"id": "remoteaddr_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "RemoteAddr",
"args": {
"sources": "192.168.50.134/24"
}
}
]
}
]
- 測試如下,注意測試的時候主機地址不要用<font color="blue">localhost</font>和<font color="blue">127.0.0.1</font>,這樣會導致服務端判斷來源的時候取得的網路卡地址為0.0.0.0:
Weight
- <font color="blue">Weight</font>顧名思義,按照權重將請求分發到不同位置
- 配置檔案:
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: http://192.168.50.134:8082
predicates:
- Weight=group1, 8
- id: weight_low
uri: http://192.168.50.135:8082
predicates:
- Weight=group1, 2
- 以上就是常用的斷言型別了,可見功能已經很強大了,希望能給您一些參考
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos