(41)java Spring Cloud企業快速開發架構之SpringCloud-Gateway的常用路由斷言工廠

JIAN2 發表於 2021-09-26
Java Spring

SpringCloud Gateway 內建了許多路由斷言工廠,可以通過配置的方式直接使用,也可以組合使用多個路由斷言工廠。接下來為大家介紹幾個常用的路由斷言工廠類。

需要框架原始碼的朋友可以看我個人簡介聯絡我。

(41)java Spring Cloud企業快速開發架構之SpringCloud-Gateway的常用路由斷言工廠
 1)Path 路由斷言工廠
Path 路由斷言工廠接收一個引數,根據 Path 定義好的規則來判斷訪問的 URI 是否匹配。

spring:  cloud:    gateway:      routes:        - id: host_route    uri: http://minglisoft.cn    predicates:      - Path=/blog/detail/{segment}

如果請求路徑為 /blog/detail/xxx,則此路由將匹配。也可以使用正則,例如 /blog/detail/** 來匹配 /blog/detail/ 開頭的多級 URI。

我們訪問本地的閘道器: :2001/blog/detail/36185 ,可以看到顯示的是  http://minglisoft.cn/blog/det... 對應的內容。

2)Query 路由斷言工廠
Query 路由斷言工廠接收兩個引數,一個必需的引數和一個可選的正規表示式。

spring:  cloud:    gateway:      routes:        - id: query_route      uri: 

如果請求包含一個值與 ba 匹配的 foo 查詢引數,則此路由將匹配。bar 和 baz 也會匹配,因為第二個引數是正規表示式。

測試連結: :2001/?foo=baz。

3)Method 路由斷言工廠
Method 路由斷言工廠接收一個引數,即要匹配的 HTTP 方法。

spring:
  cloud:
    gateway:
      routes:
        - id: method_route
  uri: 
    - Method=GET

4)Header 路由斷言工廠
Header 路由斷言工廠接收兩個引數,分別是請求頭名稱和正規表示式。

spring:  cloud:    gateway:      routes:        - id: header_route  uri: \d+

如果請求中帶有請求頭名為 x-request-id,其值與 \d+ 正規表示式匹配(值為一個或多個數字),則此路由匹配。

如果你想學習更多路由斷言工廠的用法,可以參考官方文件進行學習。

自定義路由斷言工廠
自定義路由斷言工廠需要繼承 AbstractRoutePredicateFactory 類,重寫 apply 方法的邏輯。

在 apply 方法中可以通過 exchange.getRequest() 拿到 ServerHttpRequest 物件,從而可以獲取到請求的引數、請求方式、請求頭等資訊。

apply 方法的引數是自定義的配置類,在使用的時候配置引數,在 apply 方法中直接獲取使用。

命名需要以 RoutePredicateFactory 結尾,比如 CheckAuthRoutePredicateFactory,那麼在使用的時候 CheckAuth 就是這個路由斷言工廠的名稱。程式碼如下所示。

@Componentpublic class CheckAuthRoutePredicateFactory        extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {
    public CheckAuthRoutePredicateFactory() {
        super(Config.class);
    }
  @Override    public Predicate<ServerWebExchange> apply(Config config) {
        return exchange -> {
            System.err.println("進入了CheckAuthRoutePredicateFactory\t" + config.getName());
            if (config.getName().equals("zhangsan")) {
                return true;
            }
            return false;
        };
    }
    public static class Config {
        private String name;
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
    }
}

使用示例如下所示:

spring:  cloud:    gateway:      routes:  - id: customer_route  uri: 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70006413/viewspace-2793751/,如需轉載,請註明出處,否則將追究法律責任。