系列文章
- 01-基本特性及核心概念
- 02-初始化解析之Route、Predicate、Filter的构建原理
- 03-RouteDefinitionLocator、RouteLocator解析
- 04-路由匹配RoutePredicateHandlerMapping
- 06-内置Predicate
- 07-过滤器解析之GlobalFilter
- 08-过滤器-GatewayFilter
- 09-结合注册中心实现动态路由
- 10-自定义Predicate实现黑名单
- 11-扩展RouteDefinitionRepository实现基于Redis的动态路由
创作不易,如果对您有帮助,麻烦辛苦下小手点个关注,有任何问题都可以私信交流哈。
祝您虎年虎虎生威。
在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
获取。