Gateway 網關 之 Predicate 斷言


啟動 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  <<<<<<<<<<<<<<<<<


免責聲明!

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



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