栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Nacos 客户端服务注册源码解析
  1. Nacos 具有服务注册和配置中心,想要实现服务发现,一般需要加上 @EnableDiscoveryClient注解,那么还是从注解入手。
@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#addBeatInfo, BeatReactor 心跳反应器,包括了 schedule 线程池,将 beatInfo 作为任务放入线程池中,每5s,向实例发送心跳检测,确认是否在线。然后继续向 nacos 注册服务。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/361928.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号