
一、說明
網(wǎng)關(guān)的核心概念就是路由配置和路由規(guī)則,而作為所有請(qǐng)求流量的入口,在實(shí)際生產(chǎn)環(huán)境中為了保證高可靠和高可用,是盡量要避免重啟的,所以實(shí)現(xiàn)動(dòng)態(tài)路由是非常有必要的;本文主要介紹 Spring Cloud Gateway 實(shí)現(xiàn)的思路,并且以Nacos為數(shù)據(jù)源來講解
PS:關(guān)于 Spring Cloud Zuul 的動(dòng)態(tài)路由請(qǐng)看文章《Spring Cloud Zuul的動(dòng)態(tài)路由怎樣做?集成Nacos實(shí)現(xiàn)很簡(jiǎn)單》
?
二、實(shí)現(xiàn)要點(diǎn)
要實(shí)現(xiàn)動(dòng)態(tài)路由只需關(guān)注下面4個(gè)點(diǎn)
- 網(wǎng)關(guān)啟動(dòng)時(shí),
動(dòng)態(tài)路由的數(shù)據(jù)怎樣加載進(jìn)來 -
靜態(tài)路由與動(dòng)態(tài)路由以那個(gè)為準(zhǔn),ps:靜態(tài)路由指的是配置文件里寫死的路由配置 - 監(jiān)聽
動(dòng)態(tài)路由的數(shù)據(jù)源變化 - 數(shù)據(jù)有變化時(shí)怎樣
通知gateway刷新路由
?
三、具體實(shí)現(xiàn)
Spring Cloud Gateway 中加載路由信息分別由以下幾個(gè)類負(fù)責(zé)
- PropertiesRouteDefinitionLocator:從配置文件中讀取路由信息(如YML、Properties等)
- RouteDefinitionRepository:從存儲(chǔ)器中讀取路由信息(如內(nèi)存、配置中心、Redis、MySQL等)
- DiscoveryClientRouteDefinitionLocator:從注冊(cè)中心中讀取路由信息(如Nacos、Eurka、Zookeeper等)
?
我們可以通過自定義 RouteDefinitionRepository 的實(shí)現(xiàn)類來實(shí)現(xiàn)動(dòng)態(tài)路由的目的
?
3.1. 實(shí)現(xiàn)動(dòng)態(tài)路由的數(shù)據(jù)加載
創(chuàng)建一個(gè)Nacos的RouteDefinitionRepository實(shí)現(xiàn)類
NacosRouteDefinitionRepository類可查看:NacosRouteDefinitionRepository.java

重寫
getRouteDefinitions方法實(shí)現(xiàn)路由信息的讀取
?
配置Nacos監(jiān)聽器,監(jiān)聽路由配置信息的變化

路由變化只需要往
ApplicationEventPublisher推送一個(gè)RefreshRoutesEvent事件即刻,gateway會(huì)自動(dòng)監(jiān)聽該事件并調(diào)用getRouteDefinitions方法更新路由信息
?
3.2. 創(chuàng)建配置類
DynamicRouteConfig類可查看:DynamicRouteConfig.java

?
3.3. 添加Nacos路由配置

新增配置項(xiàng):
- Data Id:scg-routes
- Group:SCG_GATEWAY
- 配置內(nèi)容:
[
{
"id": "csdn",
"predicates": [{
"name": "Path",
"args": {
"pattern": "/csdn/**"
}
}],
"uri": "https://www.csdn.net/",
"filters": []
},
{
"id": "github",
"predicates": [{
"name": "Path",
"args": {
"pattern": "/github/**"
}
}],
"uri": "http://github.com/",
"filters": []
}
]
添加兩條路由數(shù)據(jù)
?
四、測(cè)試
啟動(dòng)網(wǎng)關(guān)通過 /actuator/gateway/routes 端點(diǎn)查看當(dāng)前路由信息

可以看到
Nacos里配置的兩條路由信息
?
完整的Spring Cloud Gateway代碼請(qǐng)查看
https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-gateway/sc-gateway
?
推薦閱讀
- 日志排查問題困難?分布式日志鏈路跟蹤來幫你
- zuul集成Sentinel最新的網(wǎng)關(guān)流控組件
- Spring Cloud Zuul的動(dòng)態(tài)路由怎樣做?集成Nacos實(shí)現(xiàn)很簡(jiǎn)單
- Spring Cloud開發(fā)人員如何解決服務(wù)沖突和實(shí)例亂竄?
- Spring Cloud同步場(chǎng)景分布式事務(wù)怎樣做?試試Seata
- Spring Cloud異步場(chǎng)景分布式事務(wù)怎樣做?試試RocketMQ
?
掃碼關(guān)注有驚喜!
