consul配置watch handler
consul有兩種方式注冊watch handler
- 通過agent配置
- 通過consul watch命令行
如果想通過HTTP API注冊handle,目前還不支持破停,不知道啥時候能支持金拒。
- 通過agent配置注冊
- 第一步,創(chuàng)建consul-watch.json
{
"watches": [
{
"type": "key",
"key": "foo/bar/baz",
"handler_type": "http",
"http_handler_config": {
"path":"http://10.0.2.15:8080/watch",
"method": "POST",
"header": {"x-foo":["bar", "baz"]},
"timeout": "10s",
"tls_skip_verify": false
}
}
]
}
把這個文件放置到consul的配置目錄下面。
在這個例子中,我們監(jiān)聽KV值foo/bar/baz,然后把事件通知到endpoint:http://10.0.2.15:8080/watch
第二步拴袭,在地址http://10.0.2.15:8080/watch,啟動handler處理程序曙博。
第三步拥刻,觸發(fā)更新操作(包括創(chuàng)建)
$ curl --request PUT --data "value1" http://localhost:8500/v1/kv/foo/bar/baz
在handler能收到HTTP請求,內(nèi)容如下:
----- Request Start ----->
/watch
Host: 10.0.2.15:8080
User-Agent: Go-http-client/1.1
Content-Length: 112
Content-Type: application/json
X-Consul-Index: 16
X-Foo: bar
X-Foo: baz
Accept-Encoding: gzip
Connection: close
{"Key":"foo/bar/baz","CreateIndex":14,"ModifyIndex":16,"LockIndex":0,"Flags":0,"Value":"dmFsdWUx","Session":""}
<----- Request End -----
我們看到在數(shù)據(jù)域能夠包含所有key信息父泳,包括key和value域般哼。
還有一種watch一個prefix的例子:
{
"watches": [
{
"type": "keyprefix",
"prefix": "foo2/",
"handler_type": "http",
"http_handler_config": {
"path":"http://10.0.2.15:8080/watch"
}
}
]
}
注冊所有foo2/開頭的key。
$ curl --request PUT --data "value1" http://localhost:8500/v1/kv/foo2/bar
收到HTTP消息:
----- Request Start ----->
/watch
Host: 10.0.2.15:8080
User-Agent: Go-http-client/1.1
Content-Length: 111
Content-Type: application/json
X-Consul-Index: 24
Accept-Encoding: gzip
Connection: close
[{"Key":"foo2/bar","CreateIndex":24,"ModifyIndex":24,"LockIndex":0,"Flags":0,"Value":"dmFsdWUx","Session":""}]
<----- Request End -----
- 通過consul watch命令注冊
目前我看到的只能是handler是一個外部可執(zhí)行程序的方式惠窄,還沒有看到handler是一個endpoint的場景蒸眠。
估計以后會支持吧。
其原理是注冊一個可執(zhí)行腳本睬捶,在watch事件觸發(fā)的時候黔宛,把從consul收到的json內(nèi)容以stdin的方式傳遞給腳本。然后用戶可以在腳本里面處理自己的行為了擒贸。
第一步:創(chuàng)建處理腳本
$ cat consul-watch-handler.sh
#!/usr/bin/env sh
while read line
do
echo "line: "$line
done
第二步:通過watch命令注冊handler
$ consul watch -type=keyprefix -prefix=foo3/ /consul-watch-handler.sh
這個地方有一點疑問臀晃,watch命令行并不會退出,感覺好詫異介劫,為什么不退出呢(當然可以用&符號來后臺運行的方式)徽惋;個人覺得注冊完了之后,注冊事件本身已經(jīng)完成了座韵,命令應該退出险绘,后面的處理消息屬于監(jiān)聽事件行為,而不是注冊事件行為誉碴,只要監(jiān)聽到事件發(fā)生宦棺,把通知回調(diào)到腳本就行了。
第三步:觸發(fā)update
$ curl --request PUT --data "value1" http://localhost:8500/v1/kv/foo3/bar
第四步:查看consul-watch-handler.sh的輸出
line: [{"Key":"foo3/bar","CreateIndex":113,"ModifyIndex":169,"LockIndex":0,"Flags":0,"Value":"dmFsdWUx","Session":""}]