简单梳理源码,欢迎大家讨论,评论,指正。
consul健康检查ttl模式下提到了一个check/pass的接口,这个是应用自己上报的,但是应用时如何上报的呢,本文会进行一下分析。
consul TTL 健康检查源码分析
首先是配置application.yml,heartbeat中的enabled参数设置为true
cloud:
consul:
discovery:
heartbeat:
enabled: true
ttl-value: 5
ttl-unit: s
preferIpAddress: true
我用的包是spring-cloud-consul-discovery-1.3.3RELEASE.jar
在org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistryAutoConfiguration这个configuration中定义了ttl上报的定时任务ttlScheduler这个类
@Configuration
@ConditionalOnConsulEnabled
@ConditionalOnProperty(value = "spring.cloud.service-registry.enabled", matchIfMissing = true)
@AutoConfigureBefore(ServiceRegistryAutoConfiguration.class)
public class ConsulServiceRegistryAutoConfiguration {
@Autowired(required = false)
private TtlScheduler ttlScheduler;
@Bean
@ConditionalOnMissingBean
public ConsulServiceRegistry consulServiceRegistry(ConsulClient consulClient, ConsulDiscoveryProperties properties,
HeartbeatProperties heartbeatProperties) {
return new ConsulServiceRegistry(consulClient, properties, ttlScheduler, heartbeatProperties);
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty("spring.cloud.consul.discovery.heartbeat.enabled")
public TtlScheduler ttlScheduler(ConsulClient consulClient, HeartbeatProperties heartbeatProperties) {
return new TtlScheduler(heartbeatProperties, consulClient);
}
org.springframework.cloud.consul.serviceregistry.ConsulServiceRegistry中初始化了ttlScheduler
org.springframework.cloud.consul.discovery.TtlScheduler这个类定义了一个定时任务
启用一个线程
线程的run方法中就是checkpass
定时任务时间间隔interval
我们可以计算一下定时任务上报的时间间隔:我们参数配置是5s
interval=5 * 2 /3 = 3.333
max=(3.333,1)=3.333
ttlMinus1=5-1=4
min=(4,3.3333)=3.333
最后转换成ms,上报时间就是3333ms,3秒多