当Consul中注册的服务信息发生变化的时候,我们除了定时通过接口去查询最新的服务信息之外,consul还提供了watch机制,通过监控consul数据的变化,主动通知。
目前conusl watch支持两种通知方式:可执行程序和Http接口。
consul watch支持监控的数据类型:
- services
- service
- nodes
- key
- keyprefix
也就是说,consul支持监控服务、键值数据、节点信息,只要发生变化,就通知我们。
1.基本用法
我们以监控键值数据的变化为例子,介绍watch机制的用法。
watch监控的配置信息是跟consul的配置文件放在一起的,通过配置文件中的watches字段,设置监控信息。
说明:watches的配置,大致用法就是通过type,配置监控数据的类型,然后根据不同数据类型配置不同的参数,最后选择一种通知方式进行配置。
1.1. 通过可执行程序通知
当我们监控的数据发生变化,consul agent会调用我们配置的可执行程序(命令、脚本等等),并且通过标准输入,以Json格式传入通知的参数, 我们只要在程序中根据参数处理业务即可。
例子:
下面是我们consul agent的配置,文件保存在/etc/consul.d/server.json
提示:我们前面安装部署章节,部署consul集群的时候,consul的配置文件,使用的不是Json格式,实际上consul的配置文件是支持json格式的,字段的含义是一样的,区别就是数据格式换了下。
{
"datacenter": "dc1",
"data_dir": "/Users/jogin/Documents/work/local/consul/data",
"ui": true,
"watches": [{
"type": "key",
"key": "foo/bar/baz",
"handler_type": "script",
"args": ["/usr/bin/my-service-handler.sh", "-redis"]
}]
}
参数说明:
- datacenter - 数据中心的名字
- data_dir - consul数据存放目录
- ui - 开启consul ui
- watches - 配置监控信息,如果监控的数据发生变化,则根据配置执行通知。
上面这些都是consul的基本配置,具体可以参考安装与部署章节,里面生产环境部署。
watches参数说明:
- type - 监控的数据类型
- key - 监控的键值数据的Key
- handler_type - 通知类型,支持script和http
- args - 配置通知类型为script的,执行命令,是一个数组,第一个元素是命令,后面第2个到第N个元素是命令的参数。
例子的watches配置的意思就是:
监控key=foo/bar/baz的键值数据,如果数据发生变化,就调用/usr/bin/my-service-handler.sh -redis 命令, 这个命令可以通过标准输入,接收变化的数据。
启动consul,就会加载watches配置。
例如:以开发模式启动
consul agent -config-dir=/etc/consul.d/ -dev
1.2. 通过http接口通知
通过http接口通知数据变化,大体上配置跟上面一样,区别是多了一些http接口的配置参数。
例子:
{
"datacenter": "dc1",
"data_dir": "/Users/jogin/Documents/work/local/consul/data",
"ui": true,
"watches": [{
"type": "key",
"key": "foo/bar/baz",
"handler_type": "http",
"http_handler_config": {
"path": "https://localhost:8000/watch",
"method": "POST",
"header": {
"x-foo": ["bar", "baz"]
},
"timeout": "10s",
"tls_skip_verify": false
}
}]
}
我们关注watches字段的配置信息,下面是参数说明:
- type - watch监控类型是key
- key - 监控foo/bar/baz这个key
- handler_type - 通知类型, http
- http_handler_config - 配置http通知信息。
http_handler_config参数说明:
- path - 通知Url
- method - http请求方法
- header - 自定义Http请求头,没有可以忽略
- timeout - 超时时间,10秒
- tls_skip_verify - 是否跳过tls验证
这个例子的意思,就是当key=foo/bar/baz的键值数据发生变化,就通过https://localhost:8000/watch通知我们。
2.监控服务
上面介绍了watch的基本用法,我们也可以监控服务信息的变化,例如当有人注册新的服务或者服务不可用的时候,通知我们。
我们忽略掉,consul agent的配置,单独看watches的配置。
监控所有的服务的配置
{
"watches": [{
"type": "services",
"handler_type": "http",
"http_handler_config": {
...忽略...
}
}]
}
监控单个服务的配置
{
"watches": [{
"type": "service",
"service": "要监控的服务名",
"handler_type": "http",
"http_handler_config": {
...忽略...
}
}]
}
3.监控键值数据
前面介绍过基本Key的监控,其实我们还可以通过key的前缀,批量监控一批key,只要key的前缀相同,这些Key下面的数据发生变化,都会发送通知。
{
"watches": [{
"type": "keyprefix",
"prefix": "foo/",
"args": ["/usr/bin/my-service-handler.sh", "-redis"]
}]
}
监控类型为:keyprefix
通过prefix字段,配置key的前缀。
这个配置的意思就是:以foo/开头的Key, 数据发生变化,都会执行args参数,配置的命令。
4.监控节点变化
我们也可以监控consul集群节点的变化信息。
{
"watches": [{
"type": "nodes",
"handler_type": "http",
"http_handler_config": {
...忽略...
}
}]
}
没有其他额外的参数,type=nodes即可,当节点信息发生变化,会根据配置的方式通知。