
一、說明
網關的核心概念就是路由配置和路由規則,而作為所有請求流量的入口,在實際生産環境中為了保證高可靠和高可用,是盡量要避免重新開機的,是以實作動态路由是非常有必要的;本文主要介紹
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
事件即刻,gateway會自動監聽該事件并調用
RefreshRoutesEvent
方法更新路由資訊
getRouteDefinitions
3.2. 建立配置類
DynamicRouteConfig類可檢視:
DynamicRouteConfig.java 3.3. 添加 Nacos
路由配置
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推薦閱讀