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

重寫
getRouteDefinitions方法實現路由信息的讀取
配置Nacos監聽器,監聽路由配置信息的變化

路由變化只需要往
ApplicationEventPublisher推送一個RefreshRoutesEvent事件即刻,gateway會自動監聽該事件並調用getRouteDefinitions方法更新路由信息
3.2. 創建配置類
DynamicRouteConfig類可查看:DynamicRouteConfig.java

3.3. 添加Nacos路由配置

新增配置項:
- Data Id:scg-routes
- Group:SCG_GATEWAY
- 配置內容:
[
{
"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": []
}
]
添加兩條路由數據
四、測試
啟動網關通過 /actuator/gateway/routes 端點查看當前路由信息

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

