Spring Cloud Gateway源码解析-03-RouteDefinitionLocator、RouteLocator解析

语言: CN / TW / HK

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继承了RouteDefinitionLocatorRouteDefinitionWriter,在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是用来将RouteDefinitionLocatorGatewayFilterFactoryRoutePredicateFactory组装起来并生成Route,RouteDefinitionLocator就是CompositeRouteDefinitionLocator

自定义RouteLocator

通过RouteLocatorBuilder,也就是SCG的API驱动来自定义路由信息。

CompositeRouteLocator

用来将RouteDefinitionRouteLocator和自定义RouteLocator组合合并。

CachingRouteLocator

通过名称看是做缓存的,那是怎么做缓存的呢?在上边的CompositeRouteLocator中的getRoutes方法中,其实是调用RouteDefinitionRouteLocator或者自定义的RouteLocatorgetRoutes方法,但是RouteDefinitionRouteLocator并没有在初始化时将Route组装好,因此在CachingRouteLocator初始化时会调用每个RouteLocatorgetRoutes组装好所有的Route并缓存,供RoutePredicateHandlerMapping调用。

json @Bean @Primary @ConditionalOnMissingBean(name = "cachedCompositeRouteLocator") public RouteLocator cachedCompositeRouteLocator(List<RouteLocator> routeLocators) { return new CachingRouteLocator( new CompositeRouteLocator(Flux.fromIterable(routeLocators))); }

总结

可以发现,RouteDefinitionLocator的作用是汇聚不同源的路由信息RouteDefinitionRouteLocator可以直接自定义路由,还可以通过RouteDefinitionLocator获取所有的配置的RouteDefinition,最终转换成Route供调用方RoutePredicateHandlerMapping获取。