Spring Cloud Gateway原始碼解析-03-RouteDefinitionLocator、RouteLocator解析

語言: CN / TW / HK

SCG初始化解析之Route、Predicate、Filter的構建原理中我們已經瞭解過RouteDefinitionLocator,先來了解下這兩個介面涉及的類關係。
在這裡插入圖片描述

RouteDefinitionLocator

RouteDefinitionLocator介面中只有一個方法就是#getRouteDefinitions,通過方法名稱可以看出來,該方法是用來獲取所有的RouteDefinition的,在第一節我們瞭解到,路由資訊可以從配置檔案中來,並且對應的實現類為PropertiesRouteDefinitionLocator,SCG其實還支援從其他源獲取路由資訊,比如配置中心,對應的類為DiscoveryClientRouteDefinitionLocator(後邊的文章會進行詳細講解),從SCG的官方文件上還可以看到在未來的版本中將會基於資料庫(如Redis、MongoDB和Cassandra)來獲取路由,在2.2.6.RELEASE版本中,可以看到有一個介面RouteDefinitionRepository,但是隻有一個實現類InMemoryRouteDefinitionRepository,估計未來版本會新增基於資料庫的實現。

RouteDefinitionRepository

在這裡插入圖片描述

InMemoryRouteDefinitionRepository

InMemoryRouteDefinitionRepository實現了RouteDefinitionRepository介面,RouteDefinitionRepository繼承了RouteDefinitionLocatorRouteDefinitionWriter,在RouteDefinitionWriter中定義了兩個方法save和delete,用於新增和刪除路由資訊。

InMemoryRouteDefinitionRepository是基於記憶體的路由定義倉庫,同時也是唯一提供的實現類。我們可以根據需要自定義擴充套件,存放到其它的儲存介質中。

```json public interface RouteDefinitionWriter {

Mono<Void> save(Mono<RouteDefinition> route);

Mono<Void> delete(Mono<String> routeId);

} ```

CompositeRouteDefinitionLocator

此類主要是用於將我們不同來源的路由資訊組合到一起供RouteDefinitionRouteLocator來使用。

CachingRouteDefinitionLocator

看名稱是做快取用的,但這個版本並沒有使用。

RouteLocator

在這裡插入圖片描述
RouteLocator介面中只有一個方法getRoutes

```json public interface RouteLocator {

Flux<Route> getRoutes();

} ```

通過方法名可以看出是用來獲取所有的路由。

RouteDefinitionRouteLocator

RouteDefinitionRouteLocator是用來將RouteDefinitionLocatorGatewayFilterFactoryRoutePredicateFactory組裝起來並生成Route,RouteDefinitionLocator就是CompositeRouteDefinitionLocator

自定義RouteLocator

通過RouteLocatorBuilder,也就是SCG的API驅動來自定義路由資訊。

CompositeRouteLocator

用來將RouteDefinitionRouteLocator和自定義RouteLocator組合合併。

CachingRouteLocator

通過名稱看是做快取的,那是怎麼做快取的呢?在上邊的CompositeRouteLocator中的getRoutes方法中,其實是呼叫RouteDefinitionRouteLocator或者自定義的RouteLocatorgetRoutes方法,但是RouteDefinitionRouteLocator並沒有在初始化時將Route組裝好,因此在CachingRouteLocator初始化時會呼叫每個RouteLocatorgetRoutes組裝好所有的Route並快取,供RoutePredicateHandlerMapping呼叫。

json @Bean @Primary @ConditionalOnMissingBean(name = "cachedCompositeRouteLocator") public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) { return new CachingRouteLocator( new CompositeRouteLocator(Flux.fromIterable(routeLocators))); }

總結

可以發現,RouteDefinitionLocator的作用是匯聚不同源的路由資訊RouteDefinitionRouteLocator可以直接自定義路由,還可以通過RouteDefinitionLocator獲取所有的配置的RouteDefinition,最終轉換成Route供呼叫方RoutePredicateHandlerMapping獲取。