基于SpringCloud Gateway構(gòu)建動態(tài)網(wǎng)關(guān)

一 SpringCloud Gateway相關(guān)概念:

1.1.Spring Cloud Gateway 是 Spring Cloud 的一個全新項目,相對于ZUUL,Gateway可以說是SpringCloud的親兒子了,該項目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技術(shù)開發(fā)的網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單有效的統(tǒng)一的 API 路由管理方式。

Spring Cloud Gateway 作為 Spring Cloud 生態(tài)系統(tǒng)中的網(wǎng)關(guān),目標(biāo)是替代 Netflix Zuul,其不僅提供統(tǒng)一的路由方式,并且基于 Filter 鏈的方式提供了網(wǎng)關(guān)基本的功能,例如:安全,監(jiān)控/指標(biāo),和限流。

Spring Cloud Gateway是而且是基于WebFlux的響應(yīng)式編程,據(jù)說WebFlux的優(yōu)點也是比較明顯,下面列舉最主要的兩點:

? ? 1)非阻塞式

    其實在servlet3.1提供了非阻塞的API,WebFlux提供了一種比其更完美的解決方案。使用非阻塞的方式可以利用較小的線程或硬件資源來處理并發(fā)進(jìn)而提高其可伸縮性

  2) 函數(shù)式編程端點

    老生常談的編程方式了,Spring5必須讓你使用java8,那么函數(shù)式編程就是java8重要的特點之一,而WebFlux支持函數(shù)式編程來定義路由端點處理請求

二? SpringCloud Gateway工作流

下面來一張圖看看,SpringCloud Gateway的大體工作流程


三? 開始動手搭建網(wǎng)關(guān)

3.1 用IDEA+MAVEN開發(fā)的小伙伴,引入SpringCLoud Gateway是非常方便的,只要在工程的pom.xml加入下面的依賴即可

3.2? 引入依賴庫后,只要在application.yml加入一些配置,基本的靜態(tài)網(wǎng)關(guān)就成型了


其中uri,filters和predicates這兩個是動態(tài)網(wǎng)關(guān)非常重要的參數(shù)

上面的URI配置可以有兩種方式,一種是lb冒號后面跟注冊中心的服務(wù)名稱,當(dāng)然需要引入Eureka之類的注冊中心,另外一種是具體的URL地址。predicates斷言中的Path是網(wǎng)關(guān)攔截的一種匹配模式,如上圖如果請求的地址匹配到Path中配置的user就會進(jìn)行攔截然后轉(zhuǎn)發(fā)到目標(biāo)地址。

3.3 其他的斷言種的匹配規(guī)則如下面(功能還是很強(qiáng)大的,可以設(shè)置到某個時間點前后或者針對于請求的Header或者Cookie等生效)

路由斷言規(guī)則圖

3.4 實現(xiàn)動態(tài)網(wǎng)關(guān)的核心->動態(tài)獲取和刷新路由數(shù)據(jù)

動態(tài)獲取路由信息

主要就是實現(xiàn)RouteDefinitionRepository接口,當(dāng)網(wǎng)關(guān)啟動或者接受到RefreshRoutesEvent(一種AppliacationEvent)事件,就會觸發(fā)getRouteDefinitions的方法,這下是不是有點思路了呢?getRouteDefinitions方法里面如果從MySql或者Redis緩存讀取路由數(shù)據(jù),是不是就實現(xiàn)了路由數(shù)據(jù)的動態(tài)獲取。當(dāng)然為了方便相關(guān)人員操作,順便溫習(xí)了下前端Jquery+BootStrap,搭建了個怎刪改查的界面,來更新路由數(shù)據(jù),目前路由信息是存放在Mysql中。

路由表如下圖

路由表圖


路由增刪改查圖

到此為止就實現(xiàn)了網(wǎng)關(guān)路由信息的動態(tài)獲取和修改,是不是很簡單呀。但是不是還有個疑問?這里只是做到了動態(tài)從數(shù)據(jù)庫或者緩存中獲取路由列表,萬一路由信息再后臺被更改了,Gateway是如何感知到呢?

其實Gateway作者早已幫我們想到了,當(dāng)我們通過后臺界面更新了路由信息,只要給網(wǎng)關(guān)發(fā)個刷新路由的事件即可,網(wǎng)關(guān)就會自動觸發(fā)上面的getRouteDefinitions方法,從數(shù)據(jù)庫中重新讀取路由信息,這樣就實了基本的網(wǎng)關(guān)的動態(tài)刷新。

動態(tài)刷新

當(dāng)然如果網(wǎng)關(guān)是分布式多機(jī)器部署的話,刷新方式會有所不同,因為上面的刷新事件是正對于當(dāng)前機(jī)器,后續(xù)在更新Gateway分布式部署的情況。

網(wǎng)關(guān)里實現(xiàn)統(tǒng)一認(rèn)證,統(tǒng)一日志,限流降級,進(jìn)行灰度發(fā)布,等等很多功能,目前還在一步步實現(xiàn)中,下次有空再更新吧????。。。。。。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容