golang使用etcd,使用的库为:
github.com/coreos/etcd/clientv3
或者
go.etcd.io/etcd
这两个库其实都是一样的
直接说坑所在,上代码
package main
import (
"context"
"log"
"time"
"github.com/coreos/etcd/clientv3"
)
func main() {
conf := clientv3.Config{
Endpoints: []string{"127.0.0.1:2379"},
DialTimeout: 5 * time.Second,
}
client, err := clientv3.New(conf)
if err != nil {
log.Panic(err)
}
defer client.Close()
kv := clientv3.NewKV(client)
lease := clientv3.NewLease(client)
resp, err := lease.Create(context.TODO(), 3)
if err != nil {
log.Println("lease.Create:", err)
return
}
kv.Put(context.TODO(), "stb", "jdy", clientv3.WithLease(clientv3.LeaseID(resp.ID)))
}
出现错误
rpc error: code = 1 desc = "context canceled"
注意这里面的一个函数,lease.Create,当使用租约的时候,就出现问题了。而且很多资料里面都是使用和原生一样的grant方法。可是这里只有这么一个create方法。
查看mod版本以及远程v3的版本,果然发现了问题。
这是本地的版本,直接使用了 go get github.com/coreos/etcd/clientv3
或者
go get go.etcd.io/etcd
他这里默认拉取的是2.3.8,但是看一下远程的地址
https://pkg.go.dev/go.etcd.io/etcd@v2.3.8+incompatible/clientv3?tab=versions
版本已经到了3以上,这个差距太大了吧
试着换成最新的版本
go get github.com/coreos/etcd/clientv3@v3.3.25
出现以下错误
解决办法就是换一下grpc的版本,资料来源:https://github.com/etcd-io/etcd/issues/11931
执行:go get google.golang.org/grpc@v1.26.0
这时候,再去看执行租约的代码
已经是正常我们熟悉的原生函数名称了
再次执行代码,成功
总结:
1.不要直接使用go get去获取这个包,要加上最新的版本号,不然拉取的是很老的版本
2.grpc的版本使用1.26.0,详细的去看上述那个issues里面的讨论
有疑问加站长微信联系(非本文作者)