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