go排坑之路:Etcd使用go module的灾难

最近研究基于Etcd的分布式锁,使用go mod导入包的时候,碰到了各种问题,很是头疼,这里做个记录,方便以后排查问题。

解决问题

etcd 版本问题

在写租约的时候,代码中只有Create方法,但是demo案例中,使用的是Grant方法,将其修改为Create方法后运行报错:rpc error: code = 1 desc = "context canceled"

这是本地的版本,直接使用了 go get github.com/coreos/etcd/clientv3 或者 go get go.etcd.io/etcd,默认拉取的是2.3.8,但是看一下远程的地址已经到了3以上,这个差距太大了。

试着换成最新的版本go get github.com/coreos/etcd/[email protected]出现以下错误:

grpc 版本问题

解决办法就是换一下grpc的版本

之后go mod tidy,出现如下问题:

bbolt 版本问题

解决办法就是换一下bbolt的版本

之后go mod tidy,又出现如下问题:

go-systemd版本问题

最终终于搞定了。

然而

最后看到鸟窝的博客:https://colobu.com/2020/04/09/accidents-of-etcd-and-go-module/

文中提到,作者计划于v3.5.0中解决这些问题。目前最新版本已经是v3.5.1

重新试了下最新版本go get go.etcd.io/etcd/client/v3

直接运行代码已经没有上面这些问题了。