Nacos 客户端自动注册
SpringBoot使用Nacos客户端,会加入以下依赖,如下图所示:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
然后在启动时,会加载项目中所有的META-INF/spring.factories文件,如下图所示:
然后会加载这些配置类,其中 NacosServiceRegistryAutoConfiguration 包含了关键逻辑,如下图所示:
在该配置类中,加载一个 NacosAutoServiceRegistration 的bean 到spring容器中,如下图所示:
从它的类继承关系图,可以看出它是一个 ApplicationListener,即监听器
它监听的事件类型为:WebServerInitializedEvent
spring容器启动完毕后发布该事件,下图可见:
当事件发布,NacosAutoServiceRegistration 会执行onApplicationEvent方法,该方法NacosAutoServiceRegistration 未实现,在它的父类AbstractAutoServiceRegistration中,如下图所示:
经过一系列调用,最终调用到 this.serviceRegistry.register(getRegistration())
,serviceRegistry有一个实现类,也是由最开始的自动配置类生成的 NacosServiceRegistry,如下图所示:
最终会调用到 namingService.registerInstance,向服务端注册服务实例,调用的是NacosNamingService 的 registerInstance方法,如下图所示:
调用serviceProxy.registerService,开始注册服务实例,其实就是构建请求参数,然后发起http请求到服务端,如下图所示:
后面就是构建请求参数、请求头等内容,不过多赘述,最终调用nacos-server的 /v1/ns/instance
public String reqApi(String api, Map<String, String> params, Map<String, String> body, List<String> servers,
String method) throws NacosException {
params.put(CommonParams.NAMESPACE_ID, getNamespaceId());
if (