史上最强Nacos源码分析(自动注册)
Nacos可以实现服务的注册和发现,主要是因为Nacos的server端提供了对外的API接口。
https://nacos.io/zh-cn/docs/open-api.html
图1 Nacos官网API
图2 服务注册API
图3 服务启动-注册流程
众所周知,SpringCloud是基于SpringBoot实现开发的,Nacos实现自动注册服务就要从SpringBoot启动说起。基于SpringBoot开发的服务是通过@SpringBootApplication注解进行自动装配的:
图4 SpringBoot启动
@SpringBootApplication 引入了@EnableAutoConfiguration注解:
图5 @SpringBootApplication
@EnableAutoConfiguration引入了AutoConfigurationImportSelector选择器:
图6 @EnableAutoConfiguration
AutoConfigurationImportSelector实现了DeferredImportSelector接口,在spring ioc容器初始化过程中会调用DeferredImportSelector这类接口的selectImports方法:
图7 AutoConfigurationImportSelector
图8 selectImports
getCandidateConfigurations方法读取类路径下META-INF/spring.factories中的配置信息
图9 getCandidateConfigurations
图10 LoadFactoryNames
图11 spring.factories定义
在依赖中我们引入了spring-cloud-starter-alibaba-nacos-discovery,在META-INF/spring.factories中,研究Nacos启动注册可以从NacosDiscoveryAutoConfiguration入手
图12 spring.factories
NacosDiscoveryAutoConfiguration注入了3个Bean,其中nacosAutoServiceRegistration的父类是AbstractAutoServiceRegistration。
图13 NacosDiscoveryAutoConfiguration
在AbstractAutoServiceRegistration中监听了WebServerInitializedEvent.class事件,当事件触发时会调用bind中的start:
图14 AbstractAutoServiceRegistration监听WebServerInitializedEvent
WebServerInitializedEvent事件监听了tomcat启动状态
图15 WebServerInitializedEvent
图16 WebServer
可以看到tomcat启动过程中,被监听到了,并在控制台显示
图17 TomcatWebServer
图18 控制台启动tomcat
start调用register
org.springframework.cloud.client.serviceregistry
图19 AbstractAutoServiceRegistration#start
org.springframework.cloud.client.serviceregistry
图20 AbstractAutoServiceRegistration#register
而register实现了ServiceRegistry接口
org.springframework.cloud.client.serviceregistry
图21 ServiceRegistry#register
这个实现了ServiceRegistry的register正是3个Bean中第一个Bean NacosServiceRegistry实例化出的结果。在这个register中调用了namingService.registerInstance接口:
org.springframework.cloud.alibaba.nacos.registry
图22 NacosServiceRegistry#register
com.alibaba.nacos.api.naming
图23 NamingService#registerInstance
registerInstance实现了该接口,并调用了serverProxy.registerService
com.alibaba.nacos.client.naming
图24 NacosNamingService#registerInstance
registerService调用了reqAPI
com.alibaba.nacos.client.naming.net
图25 NamingProxy#registerService
reqAPI对拼接的url进行调用
图26 reqAPI拼接url
图27 reqAPI
reqAPI调用了callServer
图28 reqAPI调用callServer
callServer调用了HttpClient.request,将拼接好的url同其他参数一起发送给Nacos的server端,完成服务的注册
图29 callServer调用HttpClient发送请求
图30 HttpClient发送请求