Spring Cloud Alibaba學習筆記(17) - Spring Cloud Gateway 自定義路由謂詞工廠


在前文中,我們介紹了Spring Cloud Gateway內置了一系列的路由謂詞工廠,但是如果這些內置的路由謂詞工廠不能滿足業務需求的話,我們可以自定義路由謂詞工廠來實現特定的需求。
例如有某個服務限制用戶只允許在06:00 - 13:00這個時間段內才可以訪問,內置的路由謂詞工廠是無法滿足這個需求的,所以此時我們就需要自定義能夠實現該需求的路由謂詞工廠。

首先定義一個配置類,用於承載時間段的配置參數:

package com.example.gateway;

import lombok.Data;

import java.time.LocalTime;

@Data
public class TimeBetweenConfig {
    private LocalTime start;
    private LocalTime end;
}

然后定義一個路由謂詞工廠:

@Component
public class TimeBetweenRoutePredicateFactory extends AbstractRoutePredicateFactory<TimeBetweenConfig> {

    public TimeBetweenRoutePredicateFactory() {
        super(TimeBetweenConfig.class);
    }

    /**
     * 實現為謂詞判斷的方法
     */
    @Override
    public Predicate<ServerWebExchange> apply(TimeBetweenConfig config) {
        LocalTime start = config.getStart();
        LocalTime end = config.getEnd();
        return serverWebExchange -> {
            LocalTime now = LocalTime.now();
            return now.isAfter(start) && now.isBefore(end);
        };
    }

    /**
     * 設置配置類與配置文件的關系
     * @return
     */
    @Override
    public List<String> shortcutFieldOrder() {
        /*
         * 例如我們的配置項是:TimeBetween=上午6:00, 下午1:00
         * 那么按照順序,start對應的是上午6:00;end對應的是下午1:00
         */
        return Arrays.asList("start", "end");
    }
}

最后,需要在配置文件中啟用該路由謂詞工廠:

spring:
    gateway:
      discovery:
        locator:
          enabled: false
      routes:
        - id: study
          uri: lb://study01
          predicates:
            - TimeBetween=上午6:00,下午1:00

PS:

  • 自定義路由謂詞工廠類時,按照Spring Cloud Stream的約定,類名須為“謂詞工廠名(本文例中:TimeBetween)” + RoutePredicateFactory
  • 要禁止gateway通過服務發現組件轉發請求到其他的微服務,開啟該配置項的話會導致自定義的路由謂詞工廠不生效【開啟該配置項會令Gateway優先將請求按照該配置項進行轉發,導致自定義的路由不生效】
  • 時間格式不是隨便配置的,而是Spring Cloud Gateway的默認時間格式:

到此為止就實現了一個自定義路由謂詞工廠,若此時不在允許的訪問時間段內,訪問就會報404,訪問:http://localhost:8040/findById ,結果如下圖所示:


免責聲明!

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



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