Spring Cloud Gateway源碼解析-03-RouteDefinitionLocator、RouteLocator解析
在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
繼承了RouteDefinitionLocator
和RouteDefinitionWriter
,在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
是用來將RouteDefinitionLocator
、GatewayFilterFactory
和RoutePredicateFactory
組裝起來並生成Route,RouteDefinitionLocator
就是CompositeRouteDefinitionLocator
自定義RouteLocator
通過RouteLocatorBuilder
,也就是SCG的API驅動來自定義路由信息。
CompositeRouteLocator
用來將RouteDefinitionRouteLocator
和自定義RouteLocator
組合合併。
CachingRouteLocator
通過名稱看是做緩存的,那是怎麼做緩存的呢?在上邊的CompositeRouteLocator
中的getRoutes
方法中,其實是調用RouteDefinitionRouteLocator
或者自定義的RouteLocator
的getRoutes
方法,但是RouteDefinitionRouteLocator
並沒有在初始化時將Route組裝好,因此在CachingRouteLocator
初始化時會調用每個RouteLocator
的getRoutes
組裝好所有的Route並緩存,供RoutePredicateHandlerMapping
調用。
json
@Bean
@Primary
@ConditionalOnMissingBean(name = "cachedCompositeRouteLocator")
public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) {
return new CachingRouteLocator(
new CompositeRouteLocator(Flux.fromIterable(routeLocators)));
}
總結
可以發現,RouteDefinitionLocator
的作用是匯聚不同源的路由信息RouteDefinition
,RouteLocator
可以直接自定義路由,還可以通過RouteDefinitionLocator
獲取所有的配置的RouteDefinition
,最終轉換成Route
供調用方RoutePredicateHandlerMapping
獲取。