Spring Cloud Gateway實戰之四:內建predicate小結

程式設計師欣宸發表於2021-11-17

歡迎訪問我的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
  • 以上就是常用的斷言型別了,可見功能已經很強大了,希望能給您一些參考

你不孤單,欣宸原創一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 資料庫+中介軟體系列
  6. DevOps系列

歡迎關注公眾號:程式設計師欣宸

微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos

相關文章