gataway斷言工作流程源碼剖析
Cookie斷言
拿Cookie斷言來說,首先看它的體系結(jié)構(gòu)

public class CookieRoutePredicateFactory
extends AbstractRoutePredicateFactory<CookieRoutePredicateFactory.Config> {
/**
* Name key.
*/
public static final String NAME_KEY = "name";
/**
* Regexp key.
*/
public static final String REGEXP_KEY = "regexp";
public CookieRoutePredicateFactory() {
super(Config.class);
}
/*
通過shortcutFieldOrder方法設(shè)置Config配置類中的屬性,需要根據(jù)具體的規(guī)則來設(shè)置
通過shortcutType方法獲取具體規(guī)則,具體參看:org.springframework.cloud.gateway.support.ShortcutConfigurable.ShortcutType
規(guī)則包括以下幾種:
DEFAULT : 按照shortcutFieldOrder順序依次賦值
*/
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList(NAME_KEY, REGEXP_KEY);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return new GatewayPredicate() {
@Override
public boolean test(ServerWebExchange exchange) {
List<HttpCookie> cookies = exchange.getRequest().getCookies()
.get(config.name);
if (cookies == null) {
return false;
}
for (HttpCookie cookie : cookies) {
if (cookie.getValue().matches(config.regexp)) {
return true;
}
}
return false;
}
@Override
public String toString() {
return String.format("Cookie: name=%s regexp=%s", config.name,
config.regexp);
}
};
}
/*
內(nèi)部配置類是用來接收在配置文件中配置的參數(shù)的
routes:
#唯一標(biāo)識符
- id: hailtaxi-driver
uri: lb://hailtaxi-driver
#路由斷言
predicates:
- Cookie=username,itheima
*/
@Validated
public static class Config {
@NotEmpty
private String name;
@NotEmpty
private String regexp;
public String getName() {
return name;
}
public Config setName(String name) {
this.name = name;
return this;
}
public String getRegexp() {
return regexp;
}
public Config setRegexp(String regexp) {
this.regexp = regexp;
return this;
}
}
}盡管Spring Cloud Gateway已經(jīng)包含了很多路由匹配規(guī)則,有時候我們需要開發(fā)自定義路由匹配規(guī)則來滿足需求,下面簡單的介紹一下如何自定義路由匹配規(guī)則。
案例
需求:轉(zhuǎn)發(fā)帶token的請求到hailtaxi-drvier服務(wù)中,這里定義請求帶token是指包含某個請求頭的請求,至于是什么請求頭可以由配置指定
1、修改配置文件
gateway:
#路由配置
routes:
#唯一標(biāo)識符
- id: hailtaxi-driver
uri: lb://hailtaxi-driver
#路由斷言
predicates:
# 自定義一個Token斷言,如果請求包含Authorization的token信息則通過
- Token=Authorization2、創(chuàng)建 RoutePredicateFactory
斷言工廠默認(rèn)命名規(guī)則必須按照"名稱"+RoutePredicateFactory,如上TokenRoutePredicateFactory的斷言名稱為Token
@Slf4j
@Component // 要交給spring容器管理
public class TokenRoutePredicateFactory extends AbstractRoutePredicateFactory<TokenRoutePredicateFactory.Config> {
public TokenRoutePredicateFactory() {
super(Config.class);
}
public Predicate<ServerWebExchange> apply(Config config) {
return exchange -> {
// 打印配置文件參數(shù)值
String headerName = config.getHeaderName();
HttpHeaders headers = exchange.getRequest().getHeaders();
List<String> header = headers.get(headerName);
log.info("Token Predicate headers:{}", header);
// 斷言返回的是boolean值
return header!=null && header.size()>0;
};
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("headerName");//指定配置文件中加載到的配置信息應(yīng)填充到Config的哪個屬性上
}
@Override
public ShortcutType shortcutType() {
return ShortcutType.DEFAULT;
}
@Data
public static class Config { //static class
private String headerName;//存儲從配置文件中加載的配置
}
}啟動測試:http://localhost:8001/driver/info/1
以上就是gataway斷言源碼剖析的詳細(xì)內(nèi)容,更多關(guān)于gataway斷言的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Cloud Stream如何實現(xiàn)服務(wù)之間的通訊
這篇文章主要介紹了Spring Cloud Stream如何實現(xiàn)服務(wù)之間的通訊,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
SpringBoot3實現(xiàn)webclient的通用方法詳解
Spring Boot WebClient 是 Spring Framework 5 中引入的一個新的響應(yīng)式 Web 客戶端,用于異步和響應(yīng)式地與外部服務(wù)進(jìn)行通信,下面我們就來看看SpringBoot3實現(xiàn)webclient的通用方法吧2024-04-04
Java新特性之Nashorn_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java新特性之Nashorn的相關(guān)資料,需要的朋友可以參考下2017-06-06
Java發(fā)送form-data請求實現(xiàn)文件上傳
這篇文章主要為大家詳細(xì)介紹了Java發(fā)送form-data請求實現(xiàn)文件上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06
分享我的第一次java Selenium自動化測試框架開發(fā)過程
這篇文章主要介紹了分享我的第一次java Selenium自動化測試框架開發(fā)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

