Nacos 客户端服务注册源码解析

Nacos 客户端服务注册源码解析

  1. 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;
}
  1. 进入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类就不会生效。

  1. AutoServiceRegistrationAutoConfiguration 自动注册配置类,自动注入了 AutoServiceRegistration,这是一个接口,那么肯定将它的实现类注入到了IOC容器中,NacosAutoServiceRegistration则是接口的具体实现。

  2. 当不添加 @EnableDiscoveryClient, Nacos 也可以实现服务注册的功能,因为在依赖中引入了 spring-cloud-starter-alibaba-nacos-discovery 的依赖,然后该依赖下的spring.factories, 会自动装配 NacosDiscoveryAutoConfiguration,NacosServiceRegistryAutoConfiguration


  1. 根据上述分析可以从两个点切入:注解或者spring.factories 中, 找到 NacosAutoServiceRegistration, 它继承了
    AbstractAutoServiceRegistration 抽象类,父类中实现了事件监听,那么这里的 onApplicationEvent, 肯定是核心。
@Override
@SuppressWarnings("deprecation")
public void onApplicationEvent(WebServerInitializedEvent event) {
    
    
    // 绑定事件
    bind(event);
}
  1. 接着执行 NacosAutoServiceRegistration#register, 封装实例信息,然后调用 nacos 的 namingService#registerInstance,将实例注册到nacos 上

  2. 获取实例信息封装为 beatInfo 心跳对象,然后调用 beatReactor#addBeatInfoBeatReactor 心跳反应器,包括了 schedule 线程池,将 beatInfo 作为任务放入线程池中,每5s,向实例发送心跳检测,确认是否在线。然后继续向 nacos 注册服务。

  3. 随机选择一台 nacos 进行服务注册,然后将请求的服务跳转到了 nacos 服务端,调用 InstanceController#register

猜你喜欢

转载自blog.csdn.net/LarrYFinal/article/details/121064542