網關 Spring-Cloud-Gateway 源碼解析——路由之RouteDefinitionLocator一覽
源碼精品專欄
本文主要基於 Spring-Cloud-Gateway 2.0.X M4
1. 概述
2. RouteDefinition
3. PredicateDefinition
4. FilterDefinition
5. RouteDefinitionLocator
6. CompositeRouteDefinitionLocator
666. 彩蛋
1. 概述
本文主要對路由定義定位器 RouteDefinitionLocator 做整體的認識。
在 《Spring-Cloud-Gateway 源碼解析 —— 網關初始化》 中,我們看到路由相關的組件 RouteDefinitionLocator / RouteLocator 的初始化。涉及到的類比較多,我們用下圖重新梳理下 :
RouteDefinitionLocator負責讀取路由配置( ) 。從上圖中我們可以看到,RouteDefinitionLocator介面有四種實現 :
PropertiesRouteDefinitionLocator,從配置文件( 例如,YML / Properties 等 ) 讀取。在 《Spring-Cloud-Gateway 源碼解析 —— 路由(1.2)之 PropertiesRouteDefinitionLocator 配置文件》「2. PropertiesRouteDefinitionLocator」 詳細解析。
RouteDefinitionRepository,從存儲器( 例如,內存 / Redis / MySQL 等 )讀取。在 《Spring-Cloud-Gateway 源碼解析 —— 路由(1.3)之 RouteDefinitionRepository 存儲器》 詳細解析。
DiscoveryClientRouteDefinitionLocator,從註冊中心( 例如,Eureka / Consul / Zookeeper / Etcd 等 )讀取。在 《Spring-Cloud-Gateway 源碼解析 —— 路由(1.4)之 DiscoveryClientRouteDefinitionLocator 註冊中心》 詳細解析。
CompositeRouteDefinitionLocator,組合多種RouteDefinitionLocator 的實現,為 RouteDefinitionRouteLocator 提供統一入口。在 本文 詳細解析。
另外,CachingRouteDefinitionLocator也是 RouteDefinitionLocator 的實現類,已經被 CachingRouteLocator 取代。
RouteLocator可以直接自定義路由( ) ,也可以通過 RouteDefinitionRouteLocator 獲取 RouteDefinition ,並轉換成 Route 。
重要,對於上層調用者 RoutePredicateHandlerMapping ,使用的是 RouteLocator 和 Route 。而 RouteDefinitionLocator 和 RouteDefinition 用於通過配置定義路由。那麼自定義 RouteLocator 呢?通過代碼定義路由。
推薦 Spring Cloud 書籍:
請支持正版。下載盜版,等於主動編寫低級 BUG。
程序猿DD —— 《Spring Cloud微服務實戰》
周立 —— 《Spring Cloud與Docker微服務架構實戰》
兩書齊買,京東包郵。
推薦 Spring Cloud 視頻:
Java 微服務實踐 - Spring Boot
Java 微服務實踐 - Spring Cloud
Java 微服務實踐 - Spring Boot / Spring Cloud
2. RouteDefinition
,路由定義。代碼如下 :
屬性,ID 編號,唯一。
屬性,謂語定義數組。請求通過 判斷是否匹配。在 Route 里,PredicateDefinition 轉換成 Predicate 。
屬性,過濾器定義數組。在 Route 里,FilterDefinition 轉換成 GatewayFilter 。
屬性,路由向的 URI 。
屬性,順序。當請求匹配到多個路由時,使用順序小的。
RouteDefinition 提供 字元串創建對象,代碼如下 :
參數,格式為 。舉個例子, 。創建的 RouteDefinition 如下圖 :
屬性,需要通過調用 方法進行設置。
屬性,需要通過調用 方法進行設置。
屬性,支持解析,但是如果此處單個PredicateDefinition 的 存在逗號( ) ,會被錯誤的分隔,例如說, 。
3. PredicateDefinition
,謂語定義。請求通過 判斷是否匹配。代碼如下 :
屬性,謂語定義名字。通過 對應到 的實現類。例如說, 對應到 QueryRoutePredicateFactory 。
屬性,參數數組。例如, / ,匹配請求的 為 。
PredicateDefinition 提供 字元串創建對象,代碼如下 :
參數,格式為 。舉個例子, 。創建的 PredicateDefinition 如下圖 :
4. FilterDefinition
FilterDefinition 和 PredicateDefinition 的代碼實現上基本一致。
,過濾器定義。代碼如下 :
屬性,過濾器定義名字。通過 對應到 的實現類。例如說, 對應到 AddRequestParameterGatewayFilterFactory 。
屬性,參數數組。例如, / ,添加請求參數 為 。
FilterDefinition 提供 字元串創建對象,代碼如下 :
參數,格式為 。舉個例子, 。創建的 FilterDefinition 如下圖 :
5. RouteDefinitionLocator
,路由定義定位器介面,定義獲得路由定義數組的方法。代碼如下 :
對 Reactor Flux 暫時不熟悉的同學,可以閱讀完本文 Google 進行學習。隨著 Spring 5 對響應式編程的推廣,厲害如你一定要去掌握。
在上文中,我們也看到了 RouteDefinitionLocator 的多個實現類,類圖如下 :
本文只解析 CompositeRouteDefinitionLocator 的源碼實現。其他的實現類會在後面文章詳細解析。
6. CompositeRouteDefinitionLocator
,組合多種RouteDefinitionLocator 的實現,為 RouteDefinitionRouteLocator 提供統一入口。代碼如下 :
方法,提供統一方法,將組合的 的路由定義全部返回。
666. 彩蛋
知識星球
RouteDefinition => Route
PredicateDefinition => Predication
FilterDefinition => GatewayFilter
等等的轉換,我們在後續路由相關的文章詳細解析。
胖友,分享一波朋友圈可好!
TAG:芋道源碼 |