前边我们讲了命令行模式下的 etcd 的操作,今天我们来说一下 golang 当中欧冠如何去操作 etcd, 还是那句话不可能总结的那么全,只是起到一个带入的作用,遇到了便可深入研究,起码你得知道有这么一回事!真正使用到了之后估计你也忘的差不多了,那个时候回头翻一遍再百度谷歌一下子就解决了,我们在使用 golang 操作 etcd 的时候需要引入包,执行命令:
go get go.etcd.io/etcd/clientv3
如果你的 grpc 版本太新可能会报错:
# github.com/coreos/etcd/clientv3/balancer/picker
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\err.go:37:44: undefined: balancer.PickOptions
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
# github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:114:78: undefined: resolver.BuildOption
F:\Go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:182:31: undefined: resolver.ResolveNowOption
只需要执行命令:
replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
然后重新 go get 一下就 OK 啦!
提供一下解决文档:www.cnblogs.com/wind-zhou/p/128316… (天下文章一大抄抄抄)
我们还是直接看代码:
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
"strconv"
"time"
)
func main(){
//服务列表 切片类型
endpoints := []string{
"127.0.0.1:2379",
}
client3,err := clientv3.New(
clientv3.Config{
Endpoints: endpoints,
//你还可以设置更过的参数 如果开启了auth验证 也可以配置username和password
},
)
// conn fail
if err != nil {
panic(err.Error())
}
// conn success
// 第一种:etcdctl put 写入
response, err := client3.Put(context.TODO(), "hello", "hushaoliang&hujiacheng")
if err != nil {
panic(err.Error())
}
fmt.Println(response)
fmt.Println("=============================================================================================")
// 第二种:etcdctl get 获取
getResponse, err := client3.Get(context.TODO(), "hello")
if err != nil {
panic(err.Error())
}
for _,kv := range getResponse.Kvs {
fmt.Println(kv)
fmt.Println(string(kv.Key) + "-------" + string(kv.Value))
}
fmt.Println("=============================================================================================")
// 第三种:etcdctl get --prefix 获取带前缀的key的值
getAll, err := client3.Get(context.TODO(), "web", clientv3.WithPrefix())
if err != nil {
panic(err.Error())
}
for _,kv1 := range getAll.Kvs {
fmt.Println(kv1)
fmt.Println(string(kv1.Key) + "--------" + string(kv1.Value))
}
fmt.Println("=============================================================================================")
// 第四种:etcdctl del 刪除元素
deleteResponse, err := client3.Delete(context.TODO(), "hello")
if err != nil {
panic(err.Error())
}
fmt.Println(deleteResponse)
fmt.Println("=============================================================================================")
// 第五种:etcdctl watch 监控一个key的变化
//通过channel管道进行的监控 所以无时无刻不在监控 所以呢主进程不会死掉的!
watch := client3.Watch(context.TODO(), "mine")
for wc := range watch {
//读取watch返回值里面的事件
for _,w := range wc.Events {
fmt.Println(string(w.Kv.Key),string(w.Kv.Value),w.Type.String())
}
}
fmt.Println("=====================程序会卡在这不动 一直监控着watch监控的key值的变化 下边的测试需要你关闭watch监控哈===========================")
// 第六种:etcdctl lease grant 100 租赁时长是60s 60s之后就自动过期了!
grantResponse, err := client3.Grant(context.TODO(), 60)
if err != nil {
panic(err.Error())
}
if _, err := client3.Put(context.TODO(), "wocao", "nidaye", clientv3.WithLease(grantResponse.ID));err != nil {
panic(err.Error())
}
fmt.Println("ok")
//测试租赁是否成功 租赁时长是60s 60s之后就自动过期了!
i := 0
for {
ps, err := client3.Get(context.TODO(), "wocao")
if err != nil {
panic(err.Error())
}
for _,kv := range ps.Kvs {
fmt.Println(string(kv.Key) + "----" + string(kv.Value))
}
i += 5
fmt.Println(strconv.Itoa(i)+"s")
time.Sleep(5 * time.Second)
}
fmt.Println("=============================================================================================")
}
网上好的总结的文档多的是,比这敲一遍掌握了就是你自己的了,下边给大家推荐一篇好的博文:zhuanlan.zhihu.com/p/111800017 golang 当中操作 etcd 的详细案例!