微服務(wù)架構(gòu)中,網(wǎng)關(guān)服務(wù)通常提供動態(tài)路由,以及流量控制與請求識別等核心能力,在之前的篇幅中有說過Zuul組件的使用流程,但是當(dāng)下Gateway組件是更常規(guī)的選擇,下面就圍繞Gateway的實踐做詳細分析;
從架構(gòu)模式上看,網(wǎng)關(guān)不管采用什么技術(shù)組件,都是在客戶端與業(yè)務(wù)服務(wù)中間提供一層攔截與校驗的能力,但是相比較Zuul來說,Gateway提供了更強大的功能和卓越的性能;
基于實踐的場景來看,在功能上網(wǎng)關(guān)更側(cè)重請求方的合法校驗,流量管控,以及IP級別的攔截,從架構(gòu)層面看,通常需要提供靈活的路由機制,比如灰度,負載均衡的策略等,并基于消息機制,進行系統(tǒng)級的安全通知等;
(相關(guān)資料圖)
下面圍繞客戶端、網(wǎng)關(guān)層、門面服務(wù)的三個節(jié)點,分析Gateway的使用細節(jié),即客戶端向網(wǎng)關(guān)發(fā)出請求,經(jīng)過網(wǎng)關(guān)路由到門面服務(wù)處理;
二、動態(tài)路由1.基礎(chǔ)概念路由:作為網(wǎng)關(guān)中最核心的能力,從源碼結(jié)構(gòu)上看,包括ID、請求URI、斷言集合、過濾集合等組成;
public class RouteDefinition { private String id; private URI uri; private List 斷言+過濾:通常在斷言中定義請求的匹配規(guī)則,在過濾中定義請求的處理動作,結(jié)構(gòu)上看都是名稱加參數(shù)集合,并且支持快捷的方式配置; public class PredicateDefinition { private String name; private Map 以配置的方式,添加facade?服務(wù)路由,以路徑匹配的方式,如果請求路徑錯誤則斷言失敗,StripPrefix設(shè)置為1,即在過濾中去掉第一個/facade參數(shù); spring: application: name: gateway cloud: gateway: routes: - id: facade uri: http://127.0.0.1:8082 predicates: - Path=/facade/** filters: - StripPrefix=1 執(zhí)行原理如下: 這里是以配置文件的方式,設(shè)置facade服務(wù)的路由策略,其中指定了路徑方式,在Gateway文檔中提供了多種路由樣例,比如:Header、Cookie、Method、Query、Host等斷言方式; 基于編碼的方式管理路由策略,在Gateway文檔同樣提供了多種參考樣例,如果路由服務(wù)少并且固定,配置的方式可以解決,如果路由服務(wù)很多,并且需要動態(tài)添加,那基于庫表方式更適合; @Configurationpublic class GateConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("facade",r -> r.path("/facade/**").filters(f -> f.stripPrefix(1)) .uri("http://127.0.0.1:8082")).build(); }}4.庫表加載 在常規(guī)的應(yīng)用中,從庫表中讀取路由策略是比較常見的方式,定義路由工廠類并實現(xiàn)RouteDefinitionRepository?接口,涉及加載、添加、刪除三個核心方法,然后基于服務(wù)類從庫中讀取數(shù)據(jù)轉(zhuǎn)換為RouteDefinition對象即可; @Componentpublic class DefRouteFactory implements RouteDefinitionRepository { @Resource private ConfigRouteService routeService ; // 加載 @Override public Flux 在源碼倉庫中采用的就是庫表管理的方式,代碼邏輯的更多細節(jié)可以移步Git參考,此處不再過多粘貼; 自定義斷言,繼承AbstractRoutePredicateFactory?類,注意命名以RoutePredicateFactory?結(jié)尾,重寫apply方法,即可執(zhí)行特定的匹配規(guī)則; @Componentpublic class DefCheckRoutePredicateFactory extends AbstractRoutePredicateFactory 自定義過濾,繼承AbstractNameValueGatewayFilterFactory?類,注意命名以GatewayFilterFactory?結(jié)尾,重寫apply方法,即可執(zhí)行特定的過濾規(guī)則; @Componentpublic class DefHeaderGatewayFilterFactory extends AbstractNameValueGatewayFilterFactory { @Override public GatewayFilter apply(AbstractNameValueGatewayFilterFactory.NameValueConfig config) { return (exchange, chain) -> { log.info("DefHeaderGatewayFilterFactory:"+ config.getName() + "-" + config.getValue()); return chain.filter(exchange); }; }} 配置加載方式,此處斷言與過濾即快捷的配置方式,所以在命名上要遵守Gateway的約定; spring: cloud: gateway: routes: - id: facade uri: http://127.0.0.1:8082 predicates: - Path=/facade/** - DefCheck=butte filters: - StripPrefix=1 - DefHeader=cicada,smile 通常來說,在應(yīng)用級的系統(tǒng)中都需要進行斷言和過濾的策略自定義,以提供業(yè)務(wù)或者架構(gòu)層面的支撐,完成更加細致的規(guī)則校驗,尤其在相同服務(wù)多版本并行時,可以更好的管理路由策略,從而避免分支之間的影響; 在路由中采用的過濾是GatewayFilter?,實際Gateway中還提供了GlobalFilter全局過濾器,雖然從結(jié)構(gòu)上看十分相似,但是其職責(zé)是有本質(zhì)區(qū)別的; 全局過濾器1:打印請求ID @Component@Order(1)public class DefOneGlobalFilter implements GlobalFilter { @Override public Mono 全局過濾器2:打印請求URI @Component@Order(2)public class DefTwoGlobalFilter implements GlobalFilter { @Override public Mono Gateway網(wǎng)關(guān)作為微服務(wù)架構(gòu)系統(tǒng)中最先接收請求的一層,可以定義許多策略來保護系統(tǒng)的安全,比如高并發(fā)接口的限流,第三方授權(quán)驗證,遭到惡意攻擊時的IP攔截等等,盡量將非法請求在網(wǎng)關(guān)中攔截掉,從而保證系統(tǒng)的安全與穩(wěn)定。 應(yīng)用倉庫:https://gitee.com/cicadasmile/butte-flyer-parent 組件封裝:https://gitee.com/cicadasmile/butte-frame-parent 標(biāo)簽:
Gateway
- 全球今亮點!微服務(wù)網(wǎng)關(guān)Gateway實踐總結(jié)
- 全球微動態(tài)丨網(wǎng)絡(luò)結(jié)構(gòu)問題自動識別調(diào)優(yōu)與鐵塔資源合并聯(lián)合分析研究
- 天天通訊!基于網(wǎng)關(guān)的設(shè)備平臺交互控制技術(shù)漫談
- 華碩無畏Pro14開啟秒殺預(yù)售活動 采用新一代E4發(fā)光材質(zhì)
- 全球焦點!網(wǎng)卡限速工具之WonderShaper
- 熱訊:5G資本支出指數(shù)級增長的日子已過去 但前景并未黯淡
- 最新資訊:抓 Https 加密數(shù)據(jù),偷偷摸摸爽得很!
- 天天速遞!“一箭易斷,十箭難折”——從單鏈路到MC-LAG
- 觀天下!SDN具備的三個好處如何為小型企業(yè)提供幫助
- 環(huán)球觀點:云路由如何構(gòu)建家庭內(nèi)網(wǎng)控制系統(tǒng)?