Spring Cloud Alibaba學習筆記(16) - Spring Cloud Gateway 內置的路由謂詞工廠


Spring Cloud Gateway路由配置的兩種形式

Spring Cloud Gateway的路由配置有兩種形式,分別是路由到指定的URL以及路由到指定的微服務,在上文博客的示例中我們就已經使用過路由到微服務的這種配置形式了。在這兩種形式中,均支持訪問路徑的通配及精確匹配,在之前的示例中我們只使用了通配。所以本文將給出具體的配置示例,以此直觀的了解這兩種形式及不同匹配方式在配置上的區別。

路由配置必須與predicates配套使用才會生效!

路由到指定的URL

通配

使用通配符/**進行匹配,示例代碼如下:

spring:
  cloud:
    gateway:
      routes:
        - id: {路由的唯一標識}
          uri: http://www.xxx.com
          predicates:
            # 使用通配符匹配
            - Path=/**

**該配置使訪問 GATEWAY_URL/** 時會轉發到 http://www.xxx.com/** **

精確匹配

配置具體的接口路徑,示例代碼如下:

spring:
  cloud:
    gateway:
      routes:
        - id:  {路由的唯一標識}
          uri: http://www.xxx.com/order/detail
          predicates:
            # 指定具體的路徑進行匹配
            - Path=/order/detail

該配置使訪問 GATEWAY_URL/order/detail 時會轉發到 http://www.xxx.com/order/detail

路由到指定的微服務

通配

spring:
  cloud:
    gateway:
      routes:
        - id: {路由的唯一標識}  # 這種形式下通常是微服務名稱
          uri: lb://study01  # lb代表從注冊中心獲取服務
          predicates:
            # 使用通配符匹配
            - Path=/**

**該配置使訪問 GATEWAY_URL/** 時會轉發到 study01微服務的/** **

精確匹配

spring:
  cloud:
    gateway:
      routes:
        - id: {路由的唯一標識}  # 這種形式下通常是微服務名稱
          uri: lb://study01/order/detail # lb代表從注冊中心獲取服務
          predicates:
            # 指定具體的路徑進行匹配
            - Path=/order/detail

該配置使訪問 GATEWAY_URL/order/detail時會轉發到 study01微服務的/order/detail

內置的路由謂詞工廠

Spring Cloud Gateway內置了一系列的路由謂詞工廠,以便我們可以在開發中靈活的使用Gateway進行請求轉發。
路由謂詞工廠的作用是:符合Predicate的條件,就使用該路由的配置,否則就不管。

路由謂詞工廠 作用 參數
After 當且僅當請求時的時間After配置的時間時,才轉發該請求 一個帶有時區的具體時間
Before 當且僅當請求時的時間Before配置的時間時,才轉發該請求 一個帶有時區的具體時間
Between 當且僅當請求時的時間Between配置的時間段時,才轉發該請求 一個帶有時區的具體時間段
Cookie 當且僅當請求時攜帶的Cookie名稱及值與配置的名稱及值相符時,才轉發該請求 Cookie的名稱及值,支持使用正則表達式來匹配值
Header 當且僅當請求時攜帶的Header名稱及值與配置的名稱及值相符時,才轉發該請求 Header的名稱及值,支持使用正則表達式來匹配值
Host 當且僅當請求時名為Host的Header的值與配置的值相符時,才轉發該請求 Host的值,支持配置多個且支持使用通配符
Method 當且僅當請求時所使用的HTTP方法與配置的請求方法相符時,才轉發該請求 HTTP請求方法,例如GET、POST等
Path 當且僅當請求時所訪問的路徑與配置的路徑相匹配時,才轉發該請求 通配符、占位符或具體的接口路徑,可以配置多個
Query 當且僅當請求時所帶有的參數名稱與配置的參數名稱相符時,才轉發該請求 參數名稱和參數值(非必須),支持使用正則表達式對參數值進行匹配
RemoteAddr 當且僅當請求時的IP地址與配置的IP地址相符時,才轉發該請求 IP地址或IP段

After

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求時的時間After配置的時間時,才轉發該請求
        # 若請求時的時間不是After配置的時間時,則會返回404 not found
        - After=2019-10-28T12:34:42.917822900+08:00[Asia/Shanghai]

**注意:當predicates配置項只配置了一個Predicate且沒有配置Path時,Path的默認值為/** 。所以該段配置會使訪問 GATEWAY_URL/** 時轉發到example-service微服務的/** **

Before

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: before_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求時的時間Before配置的時間時,才轉發該請求
        - Before=2019-10-28T12:34:42.917822900+08:00[Asia/Shanghai]

Between

示例配置:

pring:
  cloud:
    gateway:
      routes:
      - id: between_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求時的時間Between配置的時間段時,才轉發該請求
        - Between=2019-10-28T12:34:42.917822900+08:00[Asia/Shanghai]:2019-10-29T12:34:42.917822900+08:00[Asia/Shanghai]

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求帶有名為chocolate,並且值符合正則表達式 ch.p 的Cookie時,才轉發該請求
        - Cookie=chocolate, ch.p

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求帶有名為X-Request-Id,並且值符合正則表達式 \d+ 的Header時,才轉發該請求
        - Header=X-Request-Id, \d+

Host

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: host_route
        uri: lb://example-service
        predicates:
        # 當且僅當名為Host的Header符合**.somehost.org或**.anotherhost.org時,才轉發該請求
        # 例如:www.somehost.org、beta.somehost.org、www.anotherhost.org等Host就滿足該匹配
        - Host=**.somehost.org,**.anotherhost.org

Method

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: lb://example-service
        predicates:
        # 當且僅當HTTP請求方法為GET時,才轉發該請求
        - Method=GET

Path

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: path_route
        uri: lb://example-service
        predicates:
        # 當且僅當訪問路徑是/foo/*、/some-example/list及/bar/**時,才轉發該請求
        # segment是一個特殊的占位符,表示單層路徑匹配,而/**則是多層路徑的匹配
        - Path=/foo/{segment},/example/list,/bar/**

Query

示例配置一:

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求帶有名為baz的參數,才轉發該請求
        - Query=baz

示例配置二:

spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求帶有名為foo的參數,且參數值與正則表達式 ba. 相匹配,才轉發該請求
        - Query=foo, ba.

RemoteAddr

示例配置:

spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: lb://example-service
        predicates:
        # 當且僅當請求IP是192.168.1.101/24網段,例如192.168.1.101,才轉發該請求
        - RemoteAddr=192.168.1.101/24


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM