《我修复的印象最深的一个bug》--etcd 客户端的使用姿势

简介: 《我修复的印象最深的一个bug》--etcd 客户端的使用姿势

记录一个 etcd 客户端使用的bug,当时折腾了好久。


本文将会按照安装的过程一步步讲述遇到问题以及如何解决。


etcd clientv3 客户端

首先是 etcd clientv3 的初始化,我们根据指定的 etcd 节点,建立客户端与 etcd 集群的连接。


cli,err :=clientv3.New(clientv3.Config{
Endpoints:[]string{"localhost:2379"},
DialTimeout: 5*time.Second,
    })

实例化一个 client,这里需要传入的两个参数:

  • Endpoints:etcd 的多个节点服务地址,因为我是单点本机测试,所以只传 1 个。
  • DialTimeout:创建 client 的首次连接超时,这里传了 5 秒,如果 5 秒都没有连接成功就会返回 err;值得注意的是,一旦 client 创建成功,我们就不用再关心后续底层连接的状态了,client 内部会重连。

Go mod 包依赖冲突处理

我使用了 Go Module 管理依赖。引入相应的第三方依赖,主要是 clientv3 `go.etcd.io/etcd/clientv3`。根据 go.mod 文件来处理依赖关系:


$Gomodtidy


命令执行完,报了如下的错误:

go: github.com/keets2012/etcd-book-code/clientimportsgo.etcd.io/etcd/clientv3testedbygo.etcd.io/etcd/clientv3.testimportsgithub.com/coreos/etcd/authimportsgithub.com/coreos/etcd/mvcc/backendimportsgithub.com/coreos/bbolt: github.com/coreos/bbolt@v1.3.5: parsinggo.mod:
moduledeclaresitspathas: go.etcd.io/bboltbutwasrequiredas: github.com/coreos/bbolt


看起来 coreos 维护的 bbolt 库声明它的 module 名称是 go.etcd.io/bbolt ,结果在使用它的时候使用的 package path 是 github.com/coreos/bbolt ,导致不一致( etcd#11720 , etcd#11739 )、 etcd#11749 。

显然是 etcd 使用的是错误的 bbolt 的路径。冷静下来,考虑解决办法。幸好,go module 提供 replace 的方法,我们可以使用下面的方法替换:

replacegithub.com/coreos/bbolt=>go.etcd.io/bboltv1.3.5


然而这样替换之后,还是会出现如下的错误:

go: go.etcd.io/bbolt@v1.3.5usedfortwodifferentmodulepaths (github.com/coreos/bboltandgo.etcd.io/bbolt)


按照错误的描述,我们需要再加上一条 replace,使其成为不同的依赖路径。

replacego.etcd.io/bboltv1.3.5=>github.com/coreos/bboltv1.3.5


现在我们再执行 `go mod tidy`,bbolt 的问题已经解决了,但是新问题又来了:

github.com/keets2012/etcd-book-code/clientimportsgo.etcd.io/etcd/clientv3testedbygo.etcd.io/etcd/clientv3.testimportsgithub.com/coreos/etcd/integrationimportsgithub.com/coreos/etcd/proxy/grpcproxyimportsgoogle.golang.org/grpc/naming: modulegoogle.golang.org/grpc@latestfound (v1.32.0), butdoesnotcontainpackagegoogle.golang.org/grpc/naming


搜一下 issue,你会看到 etcd#11563 、 etcd#11650 、 etcd#11707

Etcd 的代码和新版本的 grpc(v1.27.0)冲突,再次施展替换大法,让项目使用老的 grpc:

replace (
google.golang.org/grpc=>google.golang.org/grpcv1.26.0)


再次执行依赖之间的关系,终于不再报错。检查我们的 go.mod 文件,发现很多的 indirect 引用的库,居然还有两个 etcd :

github.com/coreos/etcdv3.3.25+incompatiblego.etcd.io/etcdv3.3.25+incompatiblegithub.com/coreos/bboltv1.3.5// indirect


github.com/coreos/bbolt 之所以显示为 indirect 是因为我们的代码中还没有引用这个 package。当引用之后,就可以看到 indirect 标记没了。

我们的项目中引入了 go.etcd.io/etcd,为什么还会有一个 github.com/coreos/etcd?这两个路径的代码应该也是一样。

由此可以判断肯定是某个库引用 github.com/coreos/etcd 了。我们来搜索下是哪个库?go mod 还提供了其他的命令:

gomodwhy依赖//解释为什么需要包或模块gomodgraph依赖//输出 module 需求图


$Gomodwhygithub.com/coreos/etcdgo: findingmoduleforpackagegithub.com/spf13/cobrago: findingmoduleforpackagegithub.com/spf13/pflaggo: foundgithub.com/spf13/cobraingithub.com/spf13/cobrav1.0.0go: foundgithub.com/spf13/pflagingithub.com/spf13/pflagv1.0.5


或者使用 Go mod graph 查找,执行如下的命令筛选:


Gomodgraph|grepgithub.com/coreos/etcdgithub.com/keets2012/etcd-book-codegithub.com/coreos/etcd@v3.3.25+incompatiblegithub.com/spf13/viper@v1.4.0github.com/coreos/etcd@v3.3.10+incompatible


可以看到是与 github.com/spf13/viper@v1.4.0 相关,github.com/coreos/etcd 使用了 github.com/spf13/cobra@v1.0.0 库, cobra 又使用 viper 的 1.4.0 版本,而 viper@v1.4.0 又使用了 etcd@v3.3.10+incompatible。造成了循环依赖,对于引入依赖来说已经面目全非,原先 go.etcd.io/etcd,现在却成了 github.com/coreos/etcd。

由于 Go module 的一些 bug,以及开源项目使用 Go module 的错误姿势,go module 模式下导致使用 Etcd 代码库困难重重。这里我们已经解决了 etcd clientv3 依赖引入的问题。



目录
相关文章
|
4月前
|
人工智能 网络安全 Python
一篇普通的bug日志——bug的尽头是next吗?
[bug 1] TypeError: ‘method’ object is not subscriptable 问题代码:
96 0
一篇普通的bug日志——bug的尽头是next吗?
|
Java 中间件 程序员
最网最全bug定位套路,遇见bug再也不慌了
最网最全bug定位套路,遇见bug再也不慌了
288 0
|
测试技术
如何处理不能复现的bug?软件测试工程师避坑指南
软件测试工作中常常会遇到不能复现的bug,遇到这种情况其实很正常,但是很多测试新手都按照自己的想法处理,没有提交bug,或者匆匆关闭bug。线上出现问题,就只能自己背锅了。
493 0
|
消息中间件 存储 调度
生产环境一个问题让我直接“懵”了
生产环境一个问题让我直接“懵”了
生产环境一个问题让我直接“懵”了
|
缓存 Linux 数据库
Linux安装软件时90%的人会遇到这个报错,如何解决?
Linux安装软件时90%的人会遇到这个报错,如何解决?
167 0
Linux安装软件时90%的人会遇到这个报错,如何解决?
|
Web App开发 运维 安全
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
本文记录了目前修复的千千万万个项目的BUG中印象最深的一次BUG,由于问题事件BEX引发的谷歌浏览器闪退崩溃的异常问题.这个BUG因为其不可复现性导致特别难以发现和解决,正是由于这一次的BUG解决过程,让我了解到了一位攻城狮在项目开发维护过程中实际经验的重要性,多思考,多实践,多多积累经验,才是一位攻城狮的成长之路.
30695 2
印象最深的一个bug——排查修复问题事件BEX引发的谷歌浏览器闪退崩溃异常
|
JSON 前端开发 数据格式
我修复的印象最深的一个bug:数据内有超长整数末尾变0
接口请求json解析时,数字超过一定位数,数据内有超长整数末尾变0的处理方法
我修复的印象最深的一个bug:数据内有超长整数末尾变0
|
Java 数据安全/隐私保护 测试技术
我修复的印象最深的一个bug,一个导致CPU和内存异常到无法响应的BUG
系统上线一段时间后,客户反映接口响应特别慢,甚至没有响应,第一时间依次检查了网络、服务器资源使用情况,发现服务器CPU和内存占用率都非常的高,经过一阵紧张的排查,最终发现问题出现的根源,这就是我修复的印象最深的一个bug就是由于String的用法不当所造成的。
473 0
我修复的印象最深的一个bug,一个导致CPU和内存异常到无法响应的BUG
|
安全 Oracle 关系型数据库
我修复印象比较深的bug
Oracle WebLogic T3反序列化漏洞
264 0
我修复印象比较深的bug
|
网络虚拟化
【俺修复的印象最深的bug】一名在校网工处理的一个无语的网络Bug
【以及经过脱敏处理,无重要信息泄露】本人在校大学生,网络水平还行,是学校信息中心常驻外援工程师,hhhhhhhhhhhhh。 某次在食堂吃晚饭的时候一个电话把我call过去,说新配置一新机房网络,网联不通,弄了一下午了看不出问题。
1648 0
【俺修复的印象最深的bug】一名在校网工处理的一个无语的网络Bug