一、簡介
搭建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

三、總結
代碼只是自己見解,不足之處望指出,也剛剛看源碼
