原理
Consul Watch是Consul的一个特性,它允许客户端观察Consul键值存储中的变化并通过HTTP或DNS接口自动获取最新数据。其原理是客户端向Consul服务器注册一个watcher,并在监视的键值对发生变化时收到通知。Consul Watch可以用于实现服务发现、配置管理等场景。
代码示例1
package main
import (
"fmt"
consulapi "github.com/hashicorp/consul/api"
)
func main() {
config := consulapi.DefaultConfig()
client, err := consulapi.NewClient(config)
if err != nil {
panic(err)
}
params := make(map[string]interface{
})
params["type"] = "keyprefix"
params["prefix"] = "mykeyprefix/"
q := &consulapi.QueryOptions{
WaitIndex: 0}
for {
keys, meta, err := client.KV().Keys("mykeyprefix/", "", q)
if err != nil {
panic(err)
}
fmt.Printf("Got %d keys, meta=%+v\n", len(keys), meta)
q.WaitIndex = meta.LastIndex
select {
case <-q.WaitTime:
fmt.Println("Timed out")
default:
}
}
}
代码示例2
调用方法
// watch
go func() {
watch(kv, make(<-chan struct{
}))
}()
具体实现
// watch
func watch(kv *staert.KvSource, stop <-chan struct{
}) {
operation := func() {
events, err := kv.WatchTree("/xxxx", make(chan struct{
}), nil)
if err != nil {
log.Error(fmt.Errorf("WatchTree 监控失败: %v", err))
return
}
for {
select {
case <-stop:
return
case <-q.WaitTime:
log.Error("Timed out")
return
case _, ok := <-events:
if !ok {
log.Error("watchtree 通道已经被关闭")
return
}
}
}
}
// 方法请求
operation()
}