SpringCloudConsul源码分析(一)spring-cloud-consul-core模块

985 阅读1分钟

一、工程结构

  • 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
// ConsulAutoConfiguration 生效的条件
// 1、spring.cloud.consul.enabled matchIfMissing = true
// 2、ConsulClient.class存在
@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()
				: 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);
	}
  • actuator健康检查相关
	@Configuration(proxyBeanMethods = false)
	@ConditionalOnClass(Endpoint.class)
	protected static class ConsulHealthConfig {

		@Bean
		@ConditionalOnMissingBean
		@ConditionalOnAvailableEndpoint
		/**
		 * 暴露/actuator/consul
		 */
		public ConsulEndpoint consulEndpoint(ConsulClient consulClient) {
			return new ConsulEndpoint(consulClient);
		}

		@Bean
		@ConditionalOnMissingBean
		@ConditionalOnEnabledHealthIndicator("consul")
		/**
		 * 暴露/actuator/health/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