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

下一章:Go操作etcd的实现示例

etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。类似项目有zookeeper和consul。etcd具有以下特点:完全复制:集群中的每个节点都 ...