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