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=Authorization
2、創(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)文章
Java中HashMap和Hashtable及HashSet的區(qū)別
以下是對Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號
利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號。需要的朋友可以過來參考下,希望對大家有所幫助2013-10-10java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例
這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計sql執(zhí)行時間2014-03-03jxls2.4.5如何動態(tài)導(dǎo)出excel表頭與數(shù)據(jù)
這篇文章主要介紹了jxls2.4.5如何動態(tài)導(dǎo)出excel表頭與數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08SpringSecurity+JWT實(shí)現(xiàn)登錄流程分析
Spring Security 是一個功能強(qiáng)大且高度可定制的身份驗(yàn)證和訪問控制框架,它是為Java應(yīng)用程序設(shè)計的,特別是那些基于Spring的應(yīng)用程序,下面給大家介紹SpringSecurity+JWT實(shí)現(xiàn)登錄流程,感興趣的朋友一起看看吧2024-12-12Java的LinkedHashMap的實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Java的LinkedHashMap的實(shí)現(xiàn)原理詳解,???LinkedHashMap是Map接口的哈希表和鏈接列表實(shí)現(xiàn),具有可預(yù)知的迭代順序,此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵,此類不保證映射的順序,特別是它不保證該順序恒久不變,需要的朋友可以參考下2023-09-09Java設(shè)計模式之簡單工廠 工廠方法 抽象工廠深度總結(jié)
設(shè)計模式(Design Pattern)是前輩們對代碼開發(fā)經(jīng)驗(yàn)的總結(jié),是解決特定問題的一系列套路。它不是語法規(guī)定,而是一套用來提高代碼可復(fù)用性、可維護(hù)性、可讀性、穩(wěn)健性以及安全性的解決方案2021-09-09