上一篇文章简单地介绍了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。