使用conful作为服务注册时,为了感知服务的健康状态,确定服务是否正常,我们需要向consul注册健康检查点,从而定时来感知服务的健康状态。consul提供了两种方式来注册健康检查方式,一种是服务主动向consul告知健康状态,还有一种是被动式,由consul主动来检查服务端健康状态。
一、consul主动检查服务健康状态
1.Script check(Script+ Interval)
通过执行外部应用进行健康检查:这种外部程序具有退出代码,并可能产生一些输出;脚本按照指预置时间间隔(参数interval指定)来调用脚本执行,脚本执行超时时间由timeout参数配置。
下面是consul每隔10s执行脚本"/usr/local/bin/check_mem.py",脚本执行超时时间是1s.
{
"check": {
"id": "mem-util",
"name": "Memory utilization",
"script": "/usr/local/bin/check_mem.py",
"interval": "10s",
"timeout": "1s"
}
}
2.HTTP check(HTTP+ Interval)
这种检查将按照预设的时间间隔创建一个HTTP “get”请求。HTTP响应代码来标示服务所处状态:任何2xx代码视为正常,429表示警告——有很多请求;其他值表示失败。
下面是consul每个10s发送http get请求http://localhost:5000/health,请求超时时间是1s,来检测服务健康状态。
{
"check": {
"id": "api",
"name": "HTTP API on port 5000",
"http": "http://localhost:5000/health",
"interval": "10s",
"timeout": "1s"
}
}
3.TCP check(TCP + Interval)
将按照预设的时间间隔与指定的IP/Hostname和端口创建一个TCP连接。服务的状态依赖于TCP连接是否成功——如果连接成功,则状态是“success”;否则状态是“critical”。
下面是consul每隔10s创建一个tcp连接,连接超时时间为1s,来检测服务的监控状态。
{
"check": {
"id": "ssh",
"name": "SSH TCP on port 22",
"tcp": "localhost:22",
"interval": "10s",
"timeout": "1s"
}
}
一、服务主动向consul汇报健康状态
1.TTL check:(Timeto Live生存时间)
这种checks为给定TTL保留了最后一种状态,checks的状态必须通过HTTP接口周期性更新,如果外部接口没有更新状态,那么状态就会被认定为不正常。
这种机制,服务需要服务周期性汇报健康状态。比如,一个健康的APP可以周期性的将状态put到HTTP端;如果app出问题了,那么TTL将过期,健康检查将进入Critical状态。TTL checks同时会将其最后已知状态更新至磁盘,这允许Agent通过重启后恢复到已知的状态。通过TTL端上一次check来维持健康状态的有效性。
{
"check": {
"id": "web-app",
"name": "Web App Status",
"notes": "Web app does a curl internally every 10 seconds",
"ttl": "30s"
}
}