SpringCloud starter-consul-discovery自動(dòng)注冊(cè)

一、概述

springcloud引入consul的依賴(lài)后,做了些什么呢,這里簡(jiǎn)單跟蹤下。

二、怎么找到入口

1 引入依賴(lài)

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

2 查看spring.factories文件

springboot的使用了類(lèi)似java SPI的方式引入依賴(lài),我們引入了上面的maven依賴(lài)后,進(jìn)入jar包,查看spring.factories文件,這個(gè)文件定義了consul啟動(dòng)時(shí)候加載的配置及初始化方法。

  • 文件位置


    image.png
  • 文件內(nèi)容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.consul.discovery.RibbonConsulAutoConfiguration,\
org.springframework.cloud.consul.discovery.configclient.ConsulConfigServerAutoConfiguration,\
org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration,\
org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistryAutoConfiguration,\
org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.consul.discovery.configclient.ConsulDiscoveryClientConfigServiceBootstrapConfiguration

其中 org.springframework.cloud.bootstrap.BootstrapConfiguration下面的配置等同于bootstrap.yml(或者bootstrap.properties),優(yōu)先于application.yml(或者application.properties)
org.springframework.boot.autoconfigure.EnableAutoConfiguration下面的配置等同于普通的config
這里的配置大部分都是加載application.yml中的consul相關(guān)的配置,并實(shí)例化成bean,這里不做過(guò)多解釋?zhuān)祷乇疚牡哪康模合到y(tǒng)啟動(dòng)后,這個(gè)starter怎么向consul進(jìn)行注冊(cè)!

3 向consul發(fā)起注冊(cè)請(qǐng)求

直入主題,我們看下spring.factoties中的 org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration,import啥的都省略了,注釋直接寫(xiě)到源碼里了

  • ConsulAutoServiceRegistrationAutoConfiguration.java
@Configuration
@ConditionalOnBean(AutoServiceRegistrationProperties.class)
@ConditionalOnMissingBean(type = "org.springframework.cloud.consul.discovery.ConsulLifecycle")
@ConditionalOnConsulEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
// 在注冊(cè)這個(gè)bean之前,需要下面兩個(gè)配置文件預(yù)先加載,主要是裝載了consul的配置
@AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
        ConsulServiceRegistryAutoConfiguration.class })
public class ConsulAutoServiceRegistrationAutoConfiguration {

    @Autowired
    AutoServiceRegistrationProperties autoServiceRegistrationProperties;
    // 將加載的配置匯總成一個(gè)bean :ConsulAutoServiceRegistration
    @Bean
    @ConditionalOnMissingBean
    public ConsulAutoServiceRegistration consulAutoServiceRegistration(
            ConsulServiceRegistry registry,
            AutoServiceRegistrationProperties autoServiceRegistrationProperties,
            ConsulDiscoveryProperties properties,
            ConsulAutoRegistration consulRegistration) {
        return new ConsulAutoServiceRegistration(registry,
                autoServiceRegistrationProperties, properties, consulRegistration);
    }
/*
  這里是向consul發(fā)起注冊(cè)請(qǐng)求的入口?。。?!
  ConsulAutoServiceRegistrationListener繼承了SmartApplicationListener
  會(huì)在系統(tǒng)啟動(dòng)后執(zhí)行
*/
    @Bean
    public ConsulAutoServiceRegistrationListener consulAutoServiceRegistrationListener(
            ConsulAutoServiceRegistration registration) {
        return new ConsulAutoServiceRegistrationListener(registration);
    }

    @Bean
    @ConditionalOnMissingBean
    public ConsulAutoRegistration consulRegistration(
            AutoServiceRegistrationProperties autoServiceRegistrationProperties,
            ConsulDiscoveryProperties properties, ApplicationContext applicationContext,
            ObjectProvider<List<ConsulRegistrationCustomizer>> registrationCustomizers,
            ObjectProvider<List<ConsulManagementRegistrationCustomizer>> managementRegistrationCustomizers,
            HeartbeatProperties heartbeatProperties) {
        return ConsulAutoRegistration.registration(autoServiceRegistrationProperties,
                properties, applicationContext, registrationCustomizers.getIfAvailable(),
                managementRegistrationCustomizers.getIfAvailable(), heartbeatProperties);
    }

    @Configuration
    @ConditionalOnClass(ServletContext.class)
    protected static class ConsulServletConfiguration {

        @Bean
        public ConsulRegistrationCustomizer servletConsulCustomizer(
                ObjectProvider<ServletContext> servletContext) {
            return new ConsulServletRegistrationCustomizer(servletContext);
        }

    }

}

  • UML圖例
    注冊(cè)流程
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容