consul比较常用的健康检查方式为http健康检查方式,也还有使用TTL方式来进行健康检查的,下面从spring-cloud-consul-discovery这个SDK来着手分析。
- 构建ConsulAutoRegistration,这里的工作是组成服务注册的报文,有一个setCheck方法,来设置check参数:
进入setCheck方法后,有一个createCheck方法,在这个方法中,如果spring.cloud.consul.discovery.heartbeat.enabled=true,则采用TTL方式来进行健康检查,默认过期时间为30s,可以通过spring.cloud.consul.discovery.heartbeat.ttlValue来进行人工配置。spring.cloud.consul.discovery.heartbeat.enabled配置项默认值为false,如果没有配置,则为HTTP健康检查方式。从该方法可以看到,在spring-cloud-consul-discovery中,支持的检查方式有两种,分别为HTTP和TTL,默认为HTTP健康检查方式。
- 服务注册成功之后,把服务id封装为ConsulHeartbeatTask放入线程池,持续请求consul发送心跳
进入ttlScheduler.add(String instanceId)方法,把instanceId封装为ScheduledFuture放入线程池定时执行
调用consul的/v1/agent/check/pass/${checkId}接口来向consul发送心跳
查看consul官网,对于该接口的描述是:This endpoint is used with a TTL type check to set the status of the check to passing and to reset the TTL clock.
也就是说,该接口是将TTL健康检查的check状态设置为passing,如果在指定的TTL时间内,状态没有设置成功,证明发送心跳失败,该服务健康状态就为失败。
PS:Tags中的secure=false到底是什么意思?
在createTag的时候,会执行这样一步操作:
tags.add(“secure=” + Boolean.toString(properties.getScheme().equalsIgnoreCase(“https”)));
也就是说,如果properties中的scheme属性是http,则返回false,如果是https,则返回true。在properties中,scheme的默认值为http,一般不会特地去设置scheme属性,所以Tags中展示出来的一般都是secure=false