Ectd go使用方法
etcd 是一个分布式、高可用的一致性键值存储系统,提供可靠的分布式键值存储、配置共享和服务发现等功能。
1. 连接客户端
用程序访问etcd首先要创建client,它需要传入一个Config配置,这里传了2个选项:
- Endpoints:etcd的多个节点服务地址。
- DialTimeout:创建client的首次连接超时时间,这里传了5秒,如果5秒都没有连接成功就会返回err;一旦client创建成功,我们就不用再关心后续底层连接的状态了,client内部会重连。
config := clientv3.Config{ Endpoints: []string{"127.0.0.1:2379"}, DialTimeout: 5 * time.Second, }
2. 使用范例
package main import ( "context" "github.com/coreos/etcd/clientv3" "github.com/coreos/etcd/mvcc/mvccpb" "log" "time" ) func main() { // 客户端配置 config := clientv3.Config{ Endpoints: []string{"127.0.0.1:2379"}, DialTimeout: 5 * time.Second, } // 建立连接 client, err := clientv3.New(config) if err != nil { log.Println(err) return } defer client.Close() // 检测状态 timeoutCtx,_ := context.WithTimeout(context.Background(), 2 * time.Second) _, err = client.Status(timeoutCtx, config.Endpoints[0]) if err != nil { log.Println(err) return } // 设置KV putResp, err := client.Put(timeoutCtx, "/test", "put value") if err != nil { log.Println(err) return } log.Printf("设置成功,原值为:%v\n", putResp.PrevKv) // 查询KV getResp, err := client.Get(timeoutCtx, "/test") if err != nil { log.Println(err) return } log.Printf("查询成功,所有键值为:%v\n", getResp.Kvs) // 模拟KV变化 go func() { for { client.Put(timeoutCtx, "/test", "put value") client.Delete(timeoutCtx, "/test") time.Sleep(1 * time.Second) } }() // 创建监控 watchChan := clientv3.NewWatcher(client).Watch(timeoutCtx, "/test") // 处理KV事件 for watchResp := range watchChan { for _, event := range watchResp.Events { switch event.Type { case mvccpb.PUT: log.Println("修改:", string(event.Kv.Value)) case mvccpb.DELETE: log.Println("删除:", string(event.Kv.Key)) } } } }
3. 问题解决
如果编译中出现以下问题:
# github.com/coreos/etcd/clientv3/balancer/resolver/endpoint ../../go/pkg/mod/github.com/coreos/etcd@v3.3.27+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:114:78: undefined: resolver.BuildOption ../../go/pkg/mod/github.com/coreos/etcd@v3.3.27+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:182:31: undefined: resolver.ResolveNowOption # github.com/coreos/etcd/clientv3/balancer/picker ../../go/pkg/mod/github.com/coreos/etcd@v3.3.27+incompatible/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions ../../go/pkg/mod/github.com/coreos/etcd@v3.3.27+incompatible/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
可以在 mod 文件中添加以下内容:
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。类似项目有zookeeper和consul。etcd具有以下特点:完全复制:集群中的每个节点都 ...