上一篇文章简单地介绍了SpringCloudGateway配合Eureka来实现服务的注册与发现,本篇我们进入的SCG的源码来看看它是如何实现的。
首先来弄明白,服务发现是何时启动的,其实在SCG的启动文件里有服务发现的引导类:

进入到GatewayDiscoveryClientAutoConfiguration,可以发现如下代码,看到配置就明白了,只要我们在配置文件中设置这spring.cloud.gateway.discovery.locator.enabled=true,则服务注册发现就会注入DiscoveryClientRouteDefinitionLocator这个bean到容器
@Configuration(proxyBeanMethods = false)
@Deprecated
@ConditionalOnProperty(value = "spring.cloud.discovery.reactive.enabled",
havingValue = "false")
public static class BlockingDiscoveryClientRouteDefinitionLocatorConfiguration {
@Bean
@ConditionalOnProperty(name = "spring.cloud.gateway.discovery.locator.enabled")
public DiscoveryClientRouteDefinitionLocator discoveryClientRouteDefinitionLocator(
DiscoveryClient discoveryClient, DiscoveryLocatorProperties properties) {
return new DiscoveryClientRouteDefinitionLocator(discoveryClient, properties);
}
查看DiscoveryClientRouteDefinitionLocator实现了RouteDefinitionLocator接口,则其最终会注入到RoutePredicateHandlerMapping,这样我们就明白了其实服务注册也是跟我们在配置文件配置的route规则,以及在java类中写的bulider.routes()是一样的处理逻辑。服务注册发现也是一个route,只不过其predicate和访问目标服务的方式比较特殊。我们可以debug源码,验证我们的分析,如下图所示,可以看到服务注册发现确实就是一个route。

本文详细解读了SpringCloudGateway如何配合Eureka实现服务注册与发现的过程,通过源码分析揭示其与route规则及bulider.routes()的相似逻辑,并展示了服务注册作为特殊route的工作原理。
1007

被折叠的 条评论
为什么被折叠?



