在前文中,我們介紹了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 ,結果如下圖所示: