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獲取。