一、工程结构

- spring-cloud-consul-binder:consul消息总线
- spring-cloud-consul-config:consul配置中心
- spring-cloud-consul-core:consul核心模块,所有模块都依赖于core
- spring-cloud-consul-dependencies:consul依赖管理,就是个父POM
- spring-cloud-consul-discovery:consul服务注册与发现
- spring-cloud-consul-sample:样例代码
- 一些starter
二、spring-cloud-consul-core模块
2.1 工程结构

2.2 spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.consul.ConsulAutoConfiguration
三、ConsulAutoConfiguration
3.1 启用规则
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
@ConditionalOnConsulEnabled
public class ConsulAutoConfiguration {
3.2 注入了哪些Bean
- Consul配置文件,主要配置了consul的host,port等
@Bean
@ConditionalOnMissingBean
public ConsulProperties consulProperties() {
return new ConsulProperties();
}
- ConsulClient,与Consul服务端通信的客户端
@Bean
@ConditionalOnMissingBean
public ConsulClient consulClient(ConsulProperties consulProperties) {
final int agentPort = consulProperties.getPort();
final String agentHost = !StringUtils.isEmpty(consulProperties.getScheme())
? consulProperties.getScheme() + ":
: consulProperties.getHost();
if (consulProperties.getTls() != null) {
ConsulProperties.TLSConfig tls = consulProperties.getTls();
TLSConfig tlsConfig = new TLSConfig(tls.getKeyStoreInstanceType(),
tls.getCertificatePath(), tls.getCertificatePassword(),
tls.getKeyStorePath(), tls.getKeyStorePassword());
return new ConsulClient(agentHost, agentPort, tlsConfig);
}
return new ConsulClient(agentHost, agentPort);
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Endpoint.class)
protected static class ConsulHealthConfig {
@Bean
@ConditionalOnMissingBean
@ConditionalOnAvailableEndpoint
public ConsulEndpoint consulEndpoint(ConsulClient consulClient) {
return new ConsulEndpoint(consulClient);
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnEnabledHealthIndicator("consul")
public ConsulHealthIndicator consulHealthIndicator(ConsulClient consulClient) {
return new ConsulHealthIndicator(consulClient);
}
}
- SpringRetry拦截器
- 因为spring-retry的依赖是optional的,使用的话需要手动引入spring-retry
- 用途:1、consul服务注册会使用 2、consul配置中心会使用
- 默认配置:每1s重试一次,失败后*1.1s重试一次,最多6次,最大重试时长2s
@ConditionalOnClass({ Retryable.class, Aspect.class, AopAutoConfiguration.class })
@Configuration(proxyBeanMethods = false)
@EnableRetry(proxyTargetClass = true)
@Import(AopAutoConfiguration.class)
@EnableConfigurationProperties(RetryProperties.class)
@ConditionalOnProperty(value = "spring.cloud.consul.retry.enabled",
matchIfMissing = true)
protected static class RetryConfiguration {
@Bean(name = "consulRetryInterceptor")
@ConditionalOnMissingBean(name = "consulRetryInterceptor")
public RetryOperationsInterceptor consulRetryInterceptor(
RetryProperties properties) {
return RetryInterceptorBuilder.stateless()
.backOffOptions(properties.getInitialInterval(),
properties.getMultiplier(), properties.getMaxInterval())
.maxAttempts(properties.getMaxAttempts()).build();
}
}
四、总结
- SpringCloudConsul对于消息总线、服务注册与发现、配置中心都有支持
- 所有模块都依赖spring-cloud-consul-core模块
- spring-cloud-consul-core模块主要提供了一些公用的Bean,比如ConsulClient、RetryInterceptor