Nacos注冊原理源碼解讀


一、簡介

  搭建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

    

三、總結

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

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM