一、简介
搭建springcloud-nacos发现不加@EnableDiscoveryClient也可以把服务注册到注册中心,带这疑惑看了源码总结下。
服务注册时牵扯到的几个主要类:NacosDiscoveryAutoConfiguration、NacosAutoServiceRegistration、AbstractAutoServiceRegistration、Registration等
二、源码初探
(1)首先看几个类是如何注册到spring容器
NacosDiscoveryAutoConfiguration感觉就是配置类,NacosAutoServiceRegistration也会被加载(@Configuration\@Bean被ConfigurationClassPostProcessor解析,原理后续文章讲解,还没细看)
@Configuration @EnableConfigurationProperties @ConditionalOnNacosDiscoveryEnabled @ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) @AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class, AutoServiceRegistrationAutoConfiguration.class }) public class NacosDiscoveryAutoConfiguration { @Bean public NacosServiceRegistry nacosServiceRegistry( NacosDiscoveryProperties nacosDiscoveryProperties) { return new NacosServiceRegistry(nacosDiscoveryProperties); } @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) public NacosRegistration nacosRegistration( NacosDiscoveryProperties nacosDiscoveryProperties, ApplicationContext context) { return new NacosRegistration(nacosDiscoveryProperties, context); } @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) public NacosAutoServiceRegistration nacosAutoServiceRegistration( NacosServiceRegistry registry, AutoServiceRegistrationProperties autoServiceRegistrationProperties, NacosRegistration registration) { return new NacosAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration); } }
启动时@SpringBootApplication注解中的AutoConfigurationImportSelector类会加载实现EnableAutoConfiguration所有接口的类(基于spi机制中的spring.factories也会加载)
(2)执行流程
(a)启动项目刷新上下文时
跳过不重要代码部分,接着调用ServletWebServerApplicationContext

调用父类AbstractApplicationContext的refresh()方法

因为子类ServletWebServerApplicationContext重写了finishRefresh()方法,接着调用finishRefresh方法,注意此次调用监听器发布ServletWebServerInitializedEvent事件,

广播事件接着会调用AbstractAutoServiceRegistration

进入start()

跳过一部分代码,接着调用NacosServiceRegistry的registy(),服务基本信息都拿到

掉过部分代码(参数封装) 接着把服务注册到注册中心NamingProxy中调用,可以看到url是注册中心地址http://localhost:8848/nacos/v1/ns/instance/beat

三、总结
代码只是自己见解,不足之处望指出,也刚刚看源码
