在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
是基于内存的路由定义仓库,同时也是唯一提供的实现类。我们可以根据需要自定义扩展,存放到其它的存储介质中。
public interface RouteDefinitionWriter {
Mono<Void> save(Mono<RouteDefinition> route);
Mono<Void> delete(Mono<String> routeId);
}
复制代码
CompositeRouteDefinitionLocator
此类主要是用于将我们不同来源的路由信息组合到一起供RouteDefinitionRouteLocator
来使用。
CachingRouteDefinitionLocator
RouteLocator
RouteLocator
接口中只有一个方法getRoutes
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
调用。
@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
获取。
近期评论