【Spring Cloud 】 Nacos 服务注册过程 源码

1.Nacos客户端依赖项目版本

2.2.2.RELEASE

2. @EnableDiscoveryClient 控制服务注册功能

开启nacos客服端的服务注册需要在主启动类上添加 @EnableDiscoveryClient 注解

我们先看下 这个注解干了什么事情

image-20220328192658892

有一个属性 boolean autoRegister() default true; 且默认值是 true 也就是默认开启服务的自动注册

导入了一个 EnableDiscoveryClientImportSelector 选择器组件

继承了 SpringFactoryImportSelector ,看下它的的 selectImports方法

image-20220328205620753

从注解的属性中拿到 autoRegister 的值 默认为true 如果为true 则往容器中添加

org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration

image-20220328205907264

@EnableConfigurationProperties({AutoServiceRegistrationProperties.class})

使 AutoServiceRegistrationProperties 配置类生效

image-20220328193229478

都是有默认值的

也就是说 @EnableDiscoveryClient 注解可以不加 也能正常注册服务

如果添加了 @EnableDiscoveryClient 注解,并且给属性 autoRegister 设置值为 false 则不会添加nacos服务

或者可以设置

spring.cloud.service-registry.auto-registration.enabled= false   ///默认值为 true

3.自动配置机制

image-20220328193250359

  com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
  com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\
  com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
  com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
  com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
  com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
  com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
  com.alibaba.cloud.nacos.NacosServiceAutoConfiguration

其中添加了一个 NacosServiceRegistryAutoConfiguration 自动配置类

4. NacosServiceRegistryAutoConfiguration

image-20220328193354641

new NacosAutoServiceRegistration 对象

跟进去 NacosAutoServiceRegistration 类

5.NacosAutoServiceRegistration

com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration

public class NacosAutoServiceRegistration
      extends AbstractAutoServiceRegistration<Registration> 

继承了 AbstractAutoServiceRegistration 抽象类

体系结构如图

image-20220328193627564

image-20220328193824377

先初始化了父类 点进 super(serviceRegistry, autoServiceRegistrationProperties) 方法

注意调用父类构造方法的这个配置信息类 如果没有添加 @EnableDiscoveryClient 注解 容器中是不会有 AutoServiceRegistrationProperties 实例的

image-20220328193956208

6.AbstractAutoServiceRegistration

org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration

image-20220328194128411

注意这个抽象类实现了 ApplicationListener接口 重写了改接口的 void onApplicationEvent(E event) 方法 可以对Spring容器的启动事件进行监听 并且这里指定了类型 ApplicationListener

image-20220328194634156

org.springframework.boot.web.context.WebServerInitializedEvent

也就是监听WebServer的事件

6.1 onApplicationEvent 方法

回到 onApplicationEvent 方法 看下 AbstractAutoServiceRegistration.onApplicationEvent监听事件方法做了什么事

image-20220328195019756

调用了本类的 bind 方法

6.2 bind 方法

image-20220328195615271

在改方法中 将当前AbstractAutoServiceRegistration对象 port属性通过cas改成了 web容器的端口号

然后调用了 当前对象的start方法

6.3 start方法

image-20220328200113667

6.4 register()方法

image-20220328200134343

调用了 ServiceRegistry.register方法

ServiceRegistry是一个接口 只有一个实现类 NacosServiceRegistryimage-20220328200444670

7.NacosServiceRegistry

com.alibaba.cloud.nacos.registry.NacosServiceRegistry

7.1 register 方法

image-20220328201004426

简单看下 getNacosInstanceFromRegistration 生成 Instance

image-20220328201213381

image-20220328201406601

调用了 NamingService.registerInstance 方法

NamingService同样是一个接口 也只有一个实现类 NacosNamingService

8. NacosNamingService

8.1 registerInstance 方法

image-20220328201514946

调用了 serverProxy.registerService

这个 serverProxy 类型是 NamingProxy

9.NamingProxy

com.alibaba.nacos.client.naming.net.NamingProxy

9.1 registerService 方法

看下这个方法干了什么事情

image-20220328201814165

new 了一个 HashMap 自动初始化容器为16 封装了 11个参数 为什么11个参数设置默认大小为16 2️⃣ hashmap的容量是2的幂次方

最后调用本类的 reqApi 方法

注意调用该方法传的三个参数

  1. `UtilAndComs.nacosUrlInstance 常量类 此处值为 /nacos/v1/ns/instance

image-20220328202229020

  1. `params

​ hashmap封装的参数

  1. `“POST”

    ​ 简单的一个字符串 具体什么用看方法内干了什么

9.2 reqApi 方法

image-20220328202435324

调用了本类的重载方法

image-20220328203144550

调用了 本类的 callServer 方法

9.3callServer 方法

image-20220328203953073

最后调用了本类的 nacosRestTemplate.exchangeForm(url, header, params, body, method, String.class) 方法

nacosRestTemplate 的类型为 NacosRestTemplate

10 NacosRestTemplate

最终发送请求

image-20220328204214330

记住 发送请求的地址 http://xxxx:8848/nacos/v1/ns/instance

至此 Nacos客户端服务的注册流程结束

猜你喜欢

转载自blog.csdn.net/JAVAlife2021/article/details/123806777