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

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

路由變化只需要往
ApplicationEventPublisher推送一個RefreshRoutesEvent事件即刻,gateway會自動監(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ù)
?
四、測試
啟動網(wǎng)關(guān)通過 /actuator/gateway/routes 端點(diǎn)查看當(dāng)前路由信息

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