在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获取。