1.Nacos客户端依赖项目版本
2.2.2.RELEASE
2. @EnableDiscoveryClient 控制服务注册功能
开启nacos客服端的服务注册需要在主启动类上添加 @EnableDiscoveryClient 注解
我们先看下 这个注解干了什么事情
有一个属性 boolean autoRegister() default true; 且默认值是 true 也就是默认开启服务的自动注册
导入了一个 EnableDiscoveryClientImportSelector 选择器组件
继承了 SpringFactoryImportSelector ,看下它的的 selectImports方法
从注解的属性中拿到 autoRegister 的值 默认为true 如果为true 则往容器中添加
org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration
@EnableConfigurationProperties({AutoServiceRegistrationProperties.class})
使 AutoServiceRegistrationProperties 配置类生效
都是有默认值的
也就是说 @EnableDiscoveryClient 注解可以不加 也能正常注册服务
如果添加了 @EnableDiscoveryClient 注解,并且给属性 autoRegister 设置值为 false 则不会添加nacos服务
或者可以设置
spring.cloud.service-registry.auto-registration.enabled= false ///默认值为 true
3.自动配置机制
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
new NacosAutoServiceRegistration 对象
跟进去 NacosAutoServiceRegistration 类
5.NacosAutoServiceRegistration
com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration
public class NacosAutoServiceRegistration
extends AbstractAutoServiceRegistration<Registration>
继承了 AbstractAutoServiceRegistration 抽象类
体系结构如图
先初始化了父类 点进 super(serviceRegistry, autoServiceRegistrationProperties) 方法
注意调用父类构造方法的这个配置信息类 如果没有添加 @EnableDiscoveryClient 注解 容器中是不会有 AutoServiceRegistrationProperties 实例的
6.AbstractAutoServiceRegistration
org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration
注意这个抽象类实现了 ApplicationListener接口 重写了改接口的 void onApplicationEvent(E event) 方法 可以对Spring容器的启动事件进行监听 并且这里指定了类型 ApplicationListener
org.springframework.boot.web.context.WebServerInitializedEvent
也就是监听WebServer的事件
6.1 onApplicationEvent 方法
回到 onApplicationEvent 方法 看下 AbstractAutoServiceRegistration.onApplicationEvent监听事件方法做了什么事
调用了本类的 bind 方法
6.2 bind 方法
在改方法中 将当前AbstractAutoServiceRegistration对象 port属性通过cas改成了 web容器的端口号
然后调用了 当前对象的start方法
6.3 start方法
6.4 register()方法
调用了 ServiceRegistry.register方法
ServiceRegistry是一个接口 只有一个实现类 NacosServiceRegistry
7.NacosServiceRegistry
com.alibaba.cloud.nacos.registry.NacosServiceRegistry
7.1 register 方法
简单看下 getNacosInstanceFromRegistration 生成 Instance
调用了 NamingService.registerInstance 方法
NamingService同样是一个接口 也只有一个实现类 NacosNamingService
8. NacosNamingService
8.1 registerInstance 方法
调用了 serverProxy.registerService
这个 serverProxy 类型是 NamingProxy
9.NamingProxy
com.alibaba.nacos.client.naming.net.NamingProxy
9.1 registerService 方法
看下这个方法干了什么事情
new 了一个 HashMap 自动初始化容器为16 封装了 11个参数 为什么11个参数设置默认大小为16 2?? hashmap的容量是2的幂次方
最后调用本类的 reqApi 方法
注意调用该方法传的三个参数
- `UtilAndComs.nacosUrlInstance 常量类 此处值为 /nacos/v1/ns/instance
- `params
? hashmap封装的参数
-
`“POST” ? 简单的一个字符串 具体什么用看方法内干了什么
9.2 reqApi 方法
调用了本类的重载方法
调用了 本类的 callServer 方法
9.3callServer 方法
最后调用了本类的 nacosRestTemplate.exchangeForm(url, header, params, body, method, String.class) 方法
nacosRestTemplate 的类型为 NacosRestTemplate
10 NacosRestTemplate
最终发送请求
记住 发送请求的地址 http://xxxx:8848/nacos/v1/ns/instance
至此 Nacos客户端服务的注册流程结束
|