當前位置:
首頁 > 最新 > 網關 Spring-Cloud-Gateway 源碼解析——路由之RouteDefinitionLocator一覽

網關 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:芋道源碼 |