参考文档:https://www.consul.io/docs/dynamic-app-config/watches#checks
watches是一个被动触发的动作,预定义有多个类型:
Key – 监视指定K/V键值对
Keyprefix – Watch a prefix in the KV store
Services – 监视服务列表
nodes – 监控节点列表
service – 监视服务实例
checks- 监视健康检查的值
event – 监视用户事件
我这里有个需求,希望在服务的健康检查为critical或者warning时自动启动backup容器来承载服务,至少要发送预警通知。于是就想到用warches的check类型。根据官方文档介绍,触发的动作可选script/http api,配置方式可选consul命令或config文件。我这里采用的是config文件+http api的方式
创建config文件
cd /usr/consul-config/
vi watch.json
#watch.json文件内容
{
"watches": [
{
"type": "checks",
"handler_type": "http",
"state": "critical",
"http_handler_config": {
"path": "http://localhost/consulwatches.php",
"method": "POST",
"timeout": "10s",
"header": { "Authorization": [ "token" ] }
}
}
]
}
path:需替换成自己的api链接
启动consul agent
consul agent -config-dir=/usr/consul-config/ -dev
-config-dir :agent启动时加载的config文件夹
其他要加的配置项自己随意
注册一个异常的服务进行测试
curl http://localhost:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
"ID": "ValidateCode123",
"Name": "ValidateCo3de",
"Tags": [],
"Address": "http://172.19.0.13/ValidateCodeService",
"Port": 80,
"EnableTagOverride": false,
"Check": {
"HTTP": "http://172.19.0.12/healthcheck",
"Interval": "10s"
}
}'
这个check属性一定要设置,不然触发不了;HTTP可随便填个ip,就是为了异常;
当healthcheck判定为critical时,就会访问http://localhost/consulwatches.php,携带参数为
[
{
* Node: "Pro.local",
* CheckID: "service:ValidateCode123",
* Name: "Service 'ValidateCode' check",
* Status: "critical",
* Notes: "",
* Output: "Get http://172.19.0.12/sysinfo_healthcheck.php: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)",
* ServiceID: "ValidateCode111",
* ServiceName: "ValidateCo3de",
* ServiceTags: [ ],
*
Definition: {
* Interval: "0s",
* Timeout: "0s",
* DeregisterCriticalServiceAfter: "0s",
* HTTP: "",
* Header: null,
* Method: "",
* TLSSkipVerify: false,
* TCP: ""
},
* CreateIndex: 11,
* ModifyIndex: 13
}
]
至此我们就可以在接口中做各种操作。