一、概述
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è)流程

