vlambda博客
学习文章列表

史上最强Nacos源码分析(自动注册)

Nacos可以实现服务的注册和发现,主要是因为Nacos的server端提供了对外的API接口。


https://nacos.io/zh-cn/docs/open-api.html

图1  Nacos官网API


史上最强Nacos源码分析(自动注册)

图2  服务注册API


史上最强Nacos源码分析(自动注册)

图3  服务启动-注册流程


众所周知,SpringCloud是基于SpringBoot实现开发的,Nacos实现自动注册服务就要从SpringBoot启动说起。基于SpringBoot开发的服务是通过@SpringBootApplication注解进行自动装配的:


史上最强Nacos源码分析(自动注册)

图4  SpringBoot启动


@SpringBootApplication 引入了@EnableAutoConfiguration注解:


史上最强Nacos源码分析(自动注册)

图5  @SpringBootApplication


@EnableAutoConfiguration引入了AutoConfigurationImportSelector选择器:


史上最强Nacos源码分析(自动注册)

图6  @EnableAutoConfiguration


AutoConfigurationImportSelector实现了DeferredImportSelector接口,在spring ioc容器初始化过程中会调用DeferredImportSelector这类接口的selectImports方法:


史上最强Nacos源码分析(自动注册)

图7  AutoConfigurationImportSelector


史上最强Nacos源码分析(自动注册)

图8  selectImports


getCandidateConfigurations方法读取类路径下META-INF/spring.factories中的配置信息


史上最强Nacos源码分析(自动注册)

图9  getCandidateConfigurations


史上最强Nacos源码分析(自动注册)

图10  LoadFactoryNames


史上最强Nacos源码分析(自动注册)

图11  spring.factories定义


在依赖中我们引入了spring-cloud-starter-alibaba-nacos-discovery,在META-INF/spring.factories中,研究Nacos启动注册可以从NacosDiscoveryAutoConfiguration入手


史上最强Nacos源码分析(自动注册)

图12  spring.factories


NacosDiscoveryAutoConfiguration注入了3个Bean,其中nacosAutoServiceRegistration的父类是AbstractAutoServiceRegistration。

史上最强Nacos源码分析(自动注册)

图13  NacosDiscoveryAutoConfiguration


在AbstractAutoServiceRegistration中监听了WebServerInitializedEvent.class事件,当事件触发时会调用bind中的start:


史上最强Nacos源码分析(自动注册)

图14  AbstractAutoServiceRegistration监听WebServerInitializedEvent


WebServerInitializedEvent事件监听了tomcat启动状态


史上最强Nacos源码分析(自动注册)

图15  WebServerInitializedEvent


史上最强Nacos源码分析(自动注册)

图16  WebServer


可以看到tomcat启动过程中,被监听到了,并在控制台显示


史上最强Nacos源码分析(自动注册)

图17  TomcatWebServer


史上最强Nacos源码分析(自动注册)

图18  控制台启动tomcat


start调用register

org.springframework.cloud.client.serviceregistry

史上最强Nacos源码分析(自动注册)

图19  AbstractAutoServiceRegistration#start


org.springframework.cloud.client.serviceregistry

史上最强Nacos源码分析(自动注册)

图20  AbstractAutoServiceRegistration#register


而register实现了ServiceRegistry接口


org.springframework.cloud.client.serviceregistry

史上最强Nacos源码分析(自动注册)

图21  ServiceRegistry#register


这个实现了ServiceRegistry的register正是3个Bean中第一个Bean NacosServiceRegistry实例化出的结果。在这个register中调用了namingService.registerInstance接口:


 org.springframework.cloud.alibaba.nacos.registry

史上最强Nacos源码分析(自动注册)

图22  NacosServiceRegistry#register


com.alibaba.nacos.api.naming

史上最强Nacos源码分析(自动注册)

图23  NamingService#registerInstance


registerInstance实现了该接口,并调用了serverProxy.registerService


com.alibaba.nacos.client.naming

史上最强Nacos源码分析(自动注册)

图24  NacosNamingService#registerInstance


registerService调用了reqAPI


com.alibaba.nacos.client.naming.net

史上最强Nacos源码分析(自动注册)

图25  NamingProxy#registerService


reqAPI对拼接的url进行调用


史上最强Nacos源码分析(自动注册)

图26  reqAPI拼接url


史上最强Nacos源码分析(自动注册)

图27  reqAPI


reqAPI调用了callServer


史上最强Nacos源码分析(自动注册)

图28  reqAPI调用callServer


callServer调用了HttpClient.request,将拼接好的url同其他参数一起发送给Nacos的server端,成服务的注册

 


史上最强Nacos源码分析(自动注册)

图29  callServer调用HttpClient发送请求


图30  HttpClient发送请求