首页 > 编程语言 >Nacos源码(三):SpringCloud-Nacos客户端注册源码分析

Nacos源码(三):SpringCloud-Nacos客户端注册源码分析

时间:2023-11-29 10:14:58浏览次数:40  
标签:SpringCloud Nacos NacosServiceRegistry 源码 NacosAutoServiceRegistration 注册 public

1、服务注册源码入口

  在笔记(二):Nacos环境搭建中提到Nacos作为注册中心,在服务启动类中可通过添加可选配置注解@EnableDiscoveryClient,那么就先从这个注解入手,开启SpringCloud的Nacos注册中心的源码分析。

  EnableDiscoveryClient注解详情:

0

  EnableDiscoveryClientImportSelector详情:

  添加了AutoServicRegistrationConfiguration,详情如下:

0

  1、加载配置类AutoServiceRegistrationProperties

  2、判断AutoServicRegistrationConfiguration配置类生效条件,自动注册的属性配置默认为true。

   AutoServiceRegistrationProperties、AutoServicRegistrationConfiguration都是spring-cloud-commons包下的,根据SpringBoot自动装配的特性,需要自动装配的内容:spring.factories详情如下:

0

  AutoServiceRegistrationAutoConfiguration详情如下:

   在加载AutoServiceRegistrationAutoConfiguration时,需要导入AutoServicRegistrationConfiguration获取默认的配置信息,有个关键的对象属性AutoServiceRegistration。

  AutoServiceRegistration接口的实现类如下:

0

  NacosAutoServiceRegistration是Nacos注册的核心。

2、SpringBoot自动装配Nacos注册所需Bean

  Nacos的服务注册功能,需要添加如下依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

  找到spring-cloud-starter-alibaba-nacos-discovery依赖中的自动装配文件META-INF/spring.factories文件。

  SpingBoot的自动装配首先会来加载EnableAutoConfiguration对应的类,找到含有"Auto"关键字,因为要了解客户端的服务注册,所以目标类可以锁定在 NacosServiceRegistryAutoCofiguration 类中。

   NacosServiceRegistryAutoCofiguration 中的bean在Spring容器启动时自动注入,其中最核心的是NacosAutoServiceRegistration。

0

  NacosServiceRegistry、NacosRegistration 用来构建 NacosAutoServiceRegistration 的bean。

  通过这种方式,也可以获取Nacos注册的核心类 - NacosAutoServiceRegistration。

3、Nacos与Spring的整合

  NacosAutoServiceRegistration的类继承关系如下:

0

  NacosAutoServiceRegistration的父类AbstractAutoServiceRegistration实现了ApplicationListener接口。在Spring启动过程中,            AbstractApplicationContext#finishRefresh()过程会触发ApplicationListener接口的onApplicationEvent方法,如下:

0

  AbstractAutoServiceRegistration#onApplicationEvent 方法,详情如下:

public void onApplicationEvent(WebServerInitializedEvent event) {
    this.bind(event);
}

public void bind(WebServerInitializedEvent event) {
    ApplicationContext context = event.getApplicationContext();
    if (!(context instanceof ConfigurableWebServerApplicationContext) || !"management".equals(((ConfigurableWebServerApplicationContext)context).getServerNamespace())) {
        this.port.compareAndSet(0, event.getWebServer().getPort());
        this.start();
    }
}

  AbstractAutoServiceRegistration#start 调用注册服务方法:

public void start() {
    // ...
    // Nacos服务注册
    this.register();
    // ...
}

private final ServiceRegistry<R> serviceRegistry;
// 注册服务
protected void register() {
    this.serviceRegistry.register(this.getRegistration());
}

  ServiceRegistry是一个接口,具体的实现类是哪个呢? ServiceRegistry 在 NacosAutoServiceRegistration 有参构造器中被初始化的,这里要看下 NacosServiceRegistryAutoCofiguration 中 NacosAutoServiceRegistration 是如何被实例化的。

@AutoConfigureAfter({AutoServiceRegistrationConfiguration.class, AutoServiceRegistrationAutoConfiguration.class, NacosDiscoveryAutoConfiguration.class})
public class NacosServiceRegistryAutoConfiguration {
    public NacosServiceRegistryAutoConfiguration() {
    }
    
    // 实际注册的bean
    @Bean
    public NacosServiceRegistry nacosServiceRegistry(NacosServiceManager nacosServiceManager, NacosDiscoveryProperties nacosDiscoveryProperties) {
        return new NacosServiceRegistry(nacosServiceManager, nacosDiscoveryProperties);
    }
    
    // Nacos信息,包含Nacos地址、心跳间隔、心跳超时时间、IP移除超时时间等
    @Bean
    @ConditionalOnBean({AutoServiceRegistrationProperties.class})
    public NacosRegistration nacosRegistration(ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers, NacosDiscoveryProperties nacosDiscoveryProperties, ApplicationContext context) {
        return new NacosRegistration((List)registrationCustomizers.getIfAvailable(), nacosDiscoveryProperties, context);
    }
    
    // 该bean利用Spring的事件,完成Naocs服务注册
    @Bean
    @ConditionalOnBean({AutoServiceRegistrationProperties.class})
    public NacosAutoServiceRegistration nacosAutoServiceRegistration(NacosServiceRegistry registry, AutoServiceRegistrationProperties autoServiceRegistrationProperties, NacosRegistration registration) {
        return new NacosAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration);
    }
}

  通过 NacosServiceRegistryAutoCofiguration 中装配的bean,我们知道 NacosServiceRegistry 是 AbstractAutoServiceRegistration 中 ServiceRegistry 属性的实现类。

  服务注册的的调用,NacosServiceRegistry#register 详情如下:

public void register(Registration registration) {
    // ...
    // 获取NamingService服务
    NamingService namingService = this.namingService();
    String serviceId = registration.getServiceId();
    String group = this.nacosDiscoveryProperties.getGroup();
    // 构建instance实例
    Instance instance = this.getNacosInstanceFromRegistration(registration);
    // ...
    // 向服务端注册服务
    namingService.registerInstance(serviceId, group, instance);
    // ...            
}

4、整体流程图

0

  1、SpringBoot自动装配,Nacos注册相关bean做实例化,如 NacosAutoServiceRegistration、NacosServiceRegistry 的实例化;

  2、利用Spring的事件,在Spring启动过程中,监听Nacos注册事件,调用 NacosServiceRegistry#registry()方法;

  3、创建NamingService、Instance实例,调用Nacos-Client的 NamingClientProxy 注册服务,默认使用gRPC协议注册。

 

标签:SpringCloud,Nacos,NacosServiceRegistry,源码,NacosAutoServiceRegistration,注册,public
From: https://www.cnblogs.com/RunningSnails/p/17863858.html

相关文章

  • 3. Linux 源码编译 001
    重点:rpm-i-e-qi-ql-qf-qa--scripts。yuminstallremoveinfolistrepolistprovides。配置系统源。搭建私有仓库服务器。源码编译安装。ubuntudpkgapt/etc/apt/sources.list。1)介绍源码编译虽然有很多开源项目将软件打成RPM包,供人们使用,但并不是所有源代......
  • 基于springboot的课程作业管理系统-计算机毕业设计源码+LW文档
    一、 研究目的和意义当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。尤其对于复杂的信息管理,计算机能......
  • 基于springboot的社区团购系统-计算机毕业设计源码+LW文档
    1、立论依据(课题来源、选题依据和背景情况、课题研究目的、理论意义和实际应用价值)(1)课题来源、选题依据和背景情况 本课题来自于自拟项目。 近年来,全球经济的高速发展,在一定程度上,促进了互联网技术的发展,信息化管理行业在生活中占据着越来越重要的地位,使得人们的生活方式发......
  • 在idea中无法查看org.springframework.cglib.core.Signature.java 源码
    一、现象1.点击ideaDownloadSource,没有变化;ChouseSource也无济于事。2.打开下载的源码包,惊奇的发现确实没有对应的源码。3.问题发生在哪儿?原来是这些包原本不属于spring,spring在编译的时候直接修改了包名称。 ......
  • springboot010大学生入学审核系统的设计与实现-计算机毕业设计源码+LW文档
    研究背景如今,互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等[1]。互联网成了信息传播的主要途径,社会上各种各样的信息都想尽办法通过互联网进行传播,互联网对社会产生的影响越来越大[2......
  • mvn spring-boot:run启动项目时报: parse data from Nacos error 错误
    springboot 项目, 通过命令: mvnspring-boot:run 启动时, 在读取nacos配置时, 提示报错如下:c.a.c.n.c.NacosPropertySourceBuilder:parsedatafromNacoserror,dataId:application-dev.yaml,data:spring:xxx.....(此处省略nacos配置)org.yaml.snakeyaml.error.YA......
  • springcloud~spring-cloud-starter-alibaba-nacos-discovery-2021.0.1.0配置方式变更
    nacos的配置方式发生改变,之前的方式不再适用,我们需要进行调整包依赖pom.xml代码,引入基础pom依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.1.0<</ve......
  • SpringCloud——网关过滤工厂GatewayFilterFactory
    目录GatewayFilter工厂AddRequestHeaderAddRequestHeadersIfNotPresentAddRequestParameterAddResponseHeaderGatewayFilter工厂网关过滤器工厂GatewayFilterFactory允许以某种方式修改传入的HTTP请求或返回的HTTP响应。其作用域是某些特定路由。SpringCloudGateway包括......
  • Netty源码学习6——netty编码解码器&粘包半包问题的解决
    系列文章目录和关于我零丶引入经过《Netty源码学习4——服务端是处理新连接的&netty的reactor模式和《Netty源码学习5——服务端是如何读取数据的》的学习,我们了解了服务端是如何处理新连接并读取客户端发送的数据的:netty的reactor:主reactor中的NioEventLoop监听accept事件,然......
  • SpringCloud——自定义断言工厂
    目录场景:用户的请求头中需要有指定的用户名和密码才能访问。断言工厂参考系统AfterRoutePredicateFactory写法。packagecom.zjw.factory;importlombok.Getter;importlombok.Setter;importorg.springframework.cloud.gateway.handler.predicate.AbstractRoutePredi......