Golang 连接ETCD 监控数据变化
Golang代码连接etcd, 并监听指定key的动态变化
package main
import (
"context"
"fmt"
"github.com/coreos/etcd/clientv3"
"time"
)
func main() {
cli, err := clientv3.New(clientv3.Config{
// etcd服务端地址数组,可以配置一个或者多个
Endpoints: []string{"192.168.3.110:2379", "192.168.3.111:2379", "192.168.3.112:2379"},
// 连接超时时间,5秒
DialTimeout: 5 * time.Second,
})
if err != nil {
// 错误处理
fmt.Println("connect failed, err:", err)
return
}
// 建立客户端成功
fmt.Println("connect success")
// 延迟关闭客户端,记得用完后关闭客户端
defer cli.Close()
// 设置5秒超时,访问 etcd 有超时控制
// 获取上下文,设置请求超时时间为5秒
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
// 设置 key
_, err = cli.Put(ctx, "/hello", "world")
//操作完毕,取消 etcd
cancel()
if err != nil {
fmt.Println("put failed, err:", err)
return
}
// 取值,设置超时为 1 秒
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
resp, err := cli.Get(ctx, "/hello")
cancel()
if err != nil {
fmt.Println("get failed, err:", err)
return
}
for _, ev := range resp.Kvs {
fmt.Printf("%s : %s\n", ev.Key, ev.Value)
}
// 监控key=/beyond 的值
//rch := cli.Watch(context.Background(), "/beyond")
通过channel遍历key的值的变化
//for wresp := range rch {
// for _, ev := range wresp.Events {
// fmt.Printf("%s %q : %q\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
// }
//}
// 监控以/abc为前缀的所有key的值
abc := cli.Watch(context.Background(), "/abc", clientv3.WithPrefix())
// 通过channel遍历key的值的变化
for wresp := range abc {
for _, ev := range wresp.Events {
fmt.Printf("%s %q : %q\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
}
}
}