欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud Alibaba 教程 | Nacos(二)

程序员文章站 2022-03-23 16:23:45
...

源码解析客户端注册过程

nacos作为注册中心,包含了nacos服务端(注册中心服务)和nacos客户端,nacos注册中心服务上面一讲已经介绍过了它是一个用Java语言编写开源web项目,并且拥有自己的管理台,对于nacos注册中心服务我们后面文章会单独抽出来讲解,这篇文章我们先来源码解析我们自己编写的微服务项目(nacos客户端)是如何被注册到nacos注册中心的。
Spring Cloud Alibaba 教程 | Nacos(二)

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

我们自己开发的微服务使用Nacos注册中心时需要加入alibaba-nacos-discovery依赖,
spring-cloud-starter-alibaba-nacos-discovery直接依赖了spring-cloud-alibaba-nacos-discovery模块。
Spring Cloud Alibaba 教程 | Nacos(二)
spring-cloud-alibaba-nacos-discovery模块使用了SpringBoot的starter机制(不了解的同学可以看这篇文章:https://www.cnblogs.com/lanqie/p/11172293.html)指定了自动配置类NacosDiscoveryAutoConfiguration
Spring Cloud Alibaba 教程 | Nacos(二)
进入到NacosDiscoveryAutoConfiguration这个类,这是一个配置类,负责实例化三个对象NacosRegistration、NacosServiceRegistry、NacosAutoServiceRegistration。这三个对象是Spring Cloud Nacos Discovery 遵循了 spring cloud common 标准,分别对应实现了Registration 、ServiceRegistry、AutoServiceRegistration这三个接口。
Spring Cloud Alibaba 教程 | Nacos(二)

NacosRegistration

NacosRegistration实现Registration接口和ServiceInstance接口,在nacos中它代表了一个服务实例,它描述了关于实例的id、名称、ip、端口和元数据等等这些信息。
Spring Cloud Alibaba 教程 | Nacos(二)

NacosServiceRegistry

NacosServiceRegistry则负责实现Spring Cloud标准接口ServiceRegistry的五个方法

  • void register(R registration);
  • void deregister(R registration);
  • void close();
  • void setStatus(R registration, String status);
  • T getStatus(R registration);

并且依赖了NamingService这个接口实例对象(NacosNamingService实现了该接口),NacosNamingService负责发起远程HTTP(HTTPS)调用,并将实例信息发送到注册中心服务,完成服务注册,稍后会详细分析。
Spring Cloud Alibaba 教程 | Nacos(二)

NacosAutoServiceRegistration

NacosAutoServiceRegistration继承了抽象类AbstractAutoServiceRegistration,AbstractAutoServiceRegistration实现了标准接口AutoServiceRegistration(该接口是一个空接口),并且实现了ApplicationListener应用监听接口去监听WebServerInitializedEvent事件,WebServerInitializedEvent事件代表了应用初始化完成。同时NacosAutoServiceRegistration对象还依赖了NacosRegistration和ServiceRegistry这两个对象。
Spring Cloud Alibaba 教程 | Nacos(二)
Spring Cloud Alibaba 教程 | Nacos(二)
所以当应用启动并且初始化完成之后,会回调onApplicationEvent方法,紧接着进入到bind方法里面,然后调用了start()方法,在start()方法里面调用了register方法。
Spring Cloud Alibaba 教程 | Nacos(二)
Spring Cloud Alibaba 教程 | Nacos(二)
最终通过依赖的serviceRegistry对象调用它的标准方法register(),注册Registration实例。
Spring Cloud Alibaba 教程 | Nacos(二)

NacosNamingService

进入到NacosServiceRegistry的register方法,获取到serviceId和instance之后,调用namingService的registerInstance(String serviceName, Instance instance)方法。
Spring Cloud Alibaba 教程 | Nacos(二)
接着进入到NacosNamingService类的registerInstance方法,在通过serverProxy发起实例注册之前,实例化了BeatInfo对象,并且通过BeatReactor先发送心跳数据到注册中心。
Spring Cloud Alibaba 教程 | Nacos(二)
进入到NamingProxy的registerService()方法,在该方法里面构造HTTP(HTTPS)的请求参数,其中请求方式是HttpMethod.POST,UtilAndComs.NACOS_URL_INSTANCE值为目标地址注册中心对应处理注册的Controller的URL路径,值为:/nacos/v1/ns/instance。
Spring Cloud Alibaba 教程 | Nacos(二)
Spring Cloud Alibaba 教程 | Nacos(二)

BeatReactor

BeatReactor负责实例和注册中心的心跳维持,构造方法依赖了NamingProxy发起远程HTTP(HTTPS)调用,通过threadCount创建ScheduledExecutorService任务线程池服务类。实例注册的时候调用了addBeatInfo()方法,通过ScheduledExecutorService执行BeatTask任务

Spring Cloud Alibaba 教程 | Nacos(二)
BeatTask任务通过serverProxy发送心跳信息给注册中心,之后立马通过executorService在period间隔时长之后再次执行BeatTask任务,如此循环达到和注册中心服务维持心跳的作用。
Spring Cloud Alibaba 教程 | Nacos(二)
默认心跳间隔时长是5秒。
Spring Cloud Alibaba 教程 | Nacos(二)
Spring Cloud Alibaba 教程 | Nacos(二)

关注公众号了解更多原创博文

Spring Cloud Alibaba 教程 | Nacos(二)