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

自定义RouteLocator

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

CompositeRouteLocator

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

CachingRouteLocator

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你想禁用Spring Cloud Gateway中的Swagger资源,可以在Gateway中添加一个过滤器来实现。 首先,在你的Gateway应用程序中,你需要创建一个过滤器类。这个过滤器将使用Spring Cloud Gateway中的RouteLocator来查找Swagger资源,然后将它们过滤掉。下面是一个示例过滤器类: ```java @Component public class SwaggerResourceFilter implements GlobalFilter, Ordered { @Autowired private RouteLocator routeLocator; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String requestPath = request.getPath().toString(); // 获取所有的路由 List<Route> routes = routeLocator.getRoutes().collectList().block(); // 遍历路由,查找是否包含Swagger资源 for (Route route : routes) { String routePath = route.getUri().toString(); if (requestPath.startsWith(routePath) && route.getMetadata().containsKey("swagger")) { // 如果请求路径包含Swagger资源,直接返回 return Mono.empty(); } } // 如果请求路径不包含Swagger资源,继续执行过滤器链 return chain.filter(exchange); } @Override public int getOrder() { return -1; } } ``` 在这个过滤器类中,我们首先使用RouteLocator获取所有的路由,然后遍历这些路由,查找是否包含Swagger资源。如果请求路径包含Swagger资源,直接返回,否则继续执行过滤器链。 接下来,在你的Gateway配置文件中,添加以下代码来注册这个过滤器类: ```yaml spring: cloud: gateway: default-filters: - SwaggerResourceFilter ``` 这将会在Gateway启动时自动注册这个过滤器类。当你访问Swagger资源时,Gateway将会过滤掉这些资源,从而禁用它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

壹氿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值