聊聊spring-cloud的ConsulAutoConfiguration

6次阅读

共计 5328 个字符,预计需要花费 14 分钟才能阅读完成。

本文主要研究一下 spring cloud 的 ConsulAutoConfiguration

ConsulAutoConfiguration

spring-cloud-consul-core-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/ConsulAutoConfiguration.java

@Configuration
@EnableConfigurationProperties
@ConditionalOnConsulEnabled
public class ConsulAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public ConsulProperties consulProperties() {return new ConsulProperties();
    }

    @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);
    }

    @Configuration
    @ConditionalOnClass(Endpoint.class)
    protected static class ConsulHealthConfig {

        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnEnabledEndpoint
        public ConsulEndpoint consulEndpoint(ConsulClient consulClient) {return new ConsulEndpoint(consulClient);
        }

        @Bean
        @ConditionalOnMissingBean
        @ConditionalOnEnabledHealthIndicator("consul")
        public ConsulHealthIndicator consulHealthIndicator(ConsulClient consulClient) {return new ConsulHealthIndicator(consulClient);
        }

    }

    @ConditionalOnClass({Retryable.class, Aspect.class, AopAutoConfiguration.class})
    @Configuration
    @EnableRetry(proxyTargetClass = true)
    @Import(AopAutoConfiguration.class)
    @EnableConfigurationProperties(RetryProperties.class)
    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();}

    }

}
  • ConsulAutoConfiguration 注册了 ConsulClient、ConsulEndpoint、ConsulHealthIndicator

ConsulEndpoint

spring-cloud-consul-core-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/ConsulEndpoint.java

@Endpoint(id = "consul")
public class ConsulEndpoint {

    private ConsulClient consul;

    public ConsulEndpoint(ConsulClient consul) {this.consul = consul;}

    @ReadOperation
    public ConsulData invoke() {ConsulData data = new ConsulData();
        // data.setKeyValues(kvClient.getKeyValueRecurse());
        Response<Map<String, Service>> agentServices = this.consul.getAgentServices();
        data.setAgentServices(agentServices.getValue());

        Response<Map<String, List<String>>> catalogServices = this.consul
                .getCatalogServices(QueryParams.DEFAULT);

        for (String serviceId : catalogServices.getValue().keySet()) {
            Response<List<CatalogService>> response = this.consul
                    .getCatalogService(serviceId, QueryParams.DEFAULT);
            data.getCatalogServices().put(serviceId, response.getValue());
        }

        Response<List<Node>> catalogNodes = this.consul
                .getCatalogNodes(QueryParams.DEFAULT);
        data.setCatalogNodes(catalogNodes.getValue());

        return data;
    }

    /**
     * Represents Consul data related to catalog entries and agent servies.
     */
    public static class ConsulData {Map<String, List<CatalogService>> catalogServices = new LinkedHashMap<>();

        Map<String, Service> agentServices;

        List<Node> catalogNodes;

        public ConsulData() {}

        public Map<String, List<CatalogService>> getCatalogServices() {return this.catalogServices;}

        public void setCatalogServices(Map<String, List<CatalogService>> catalogServices) {this.catalogServices = catalogServices;}

        public Map<String, Service> getAgentServices() {return this.agentServices;}

        public void setAgentServices(Map<String, Service> agentServices) {this.agentServices = agentServices;}

        public List<Node> getCatalogNodes() {return this.catalogNodes;}

        public void setCatalogNodes(List<Node> catalogNodes) {this.catalogNodes = catalogNodes;}

        @Override
        public String toString() {return new ToStringCreator(this)
                    .append("catalogServices", this.catalogServices)
                    .append("agentServices", this.agentServices)
                    .append("catalogNodes", this.catalogNodes).toString();}

    }

}
  • ConsulEndpoint 有个 ReadOperation,返回的是 ConsulData,包含了 agentServices、agentServices、catalogNodes

ConsulHealthIndicator

spring-cloud-consul-core-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/consul/ConsulHealthIndicator.java

public class ConsulHealthIndicator extends AbstractHealthIndicator {

    private ConsulClient consul;

    public ConsulHealthIndicator(ConsulClient consul) {this.consul = consul;}

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {final Response<String> leaderStatus = this.consul.getStatusLeader();
        final Response<Map<String, List<String>>> services = this.consul
                .getCatalogServices(QueryParams.DEFAULT);
        builder.up().withDetail("leader", leaderStatus.getValue()).withDetail("services",
                services.getValue());
    }

}
  • ConsulHealthIndicator 继承了 AbstractHealthIndicator,其 doHealthCheck 会调用 ConsulClient.getStatusLeader 获取 leaderStatus,以及 ConsulClient.getCatalogServices 获取 catalogServices 信息

小结

  • ConsulAutoConfiguration 注册了 ConsulClient、ConsulEndpoint、ConsulHealthIndicator
  • ConsulEndpoint 有个 ReadOperation,返回的是 ConsulData,包含了 agentServices、agentServices、catalogNodes
  • ConsulHealthIndicator 继承了 AbstractHealthIndicator,其 doHealthCheck 会调用 ConsulClient.getStatusLeader 获取 leaderStatus,以及 ConsulClient.getCatalogServices 获取 catalogServices 信息

doc

  • ConsulAutoConfiguration
正文完
 0