Nacos 客户端服务注册源码解析
- Nacos 具有服务注册和配置中心,想要实现服务发现,一般需要加上
@EnableDiscoveryClient
注解,那么还是从注解入手。
/**
* 开启服务注册发现功能
* @author Spencer Gibb
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// 引入类,和@EnableFeignClients类似,原理就是EnableDiscoveryClientImportSelector这个类
@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {
// 默认自动注册服务
boolean autoRegister() default true;
}
- 进入
EnableDiscoveryClientImportSelector#selectImports
, 获取@EnableDiscoveryClient
注解上的autoRegister
属性,默认为true,那么会自动注入AutoServiceRegistrationConfiguration
配置类,进入AutoServiceRegistrationConfiguration
类,代码如下
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
matchIfMissing = true)
public class AutoServiceRegistrationConfiguration {
}
当 autoRegister = false 时,spring.cloud.service-registry.auto-registration.enabled
= false,
此时 AutoServiceRegistrationConfiguration
类就不会生效。
-
AutoServiceRegistrationAutoConfiguration
自动注册配置类,自动注入了AutoServiceRegistration
,这是一个接口,那么肯定将它的实现类注入到了IOC容器中,NacosAutoServiceRegistration
则是接口的具体实现。
-
当不添加
@EnableDiscoveryClient
, Nacos 也可以实现服务注册的功能,因为在依赖中引入了spring-cloud-starter-alibaba-nacos-discovery
的依赖,然后该依赖下的spring.factories, 会自动装配NacosDiscoveryAutoConfiguration
,NacosServiceRegistryAutoConfiguration
- 根据上述分析可以从两个点切入:注解或者spring.factories 中, 找到
NacosAutoServiceRegistration
, 它继承了
AbstractAutoServiceRegistration
抽象类,父类中实现了事件监听,那么这里的 onApplicationEvent, 肯定是核心。
@Override
@SuppressWarnings("deprecation")
public void onApplicationEvent(WebServerInitializedEvent event) {
// 绑定事件
bind(event);
}
-
接着执行
NacosAutoServiceRegistration#register
, 封装实例信息,然后调用 nacos 的namingService#registerInstance
,将实例注册到nacos 上
-
获取实例信息封装为 beatInfo 心跳对象,然后调用
beatReactor#addBeatInfo
,BeatReactor
心跳反应器,包括了 schedule 线程池,将 beatInfo 作为任务放入线程池中,每5s,向实例发送心跳检测,确认是否在线。然后继续向 nacos 注册服务。
-
随机选择一台 nacos 进行服务注册,然后将请求的服务跳转到了 nacos 服务端,调用 InstanceController#register