Go etcd 的依赖问题终于解决了......

大家好,我是煎鱼 。
前几年非常高频的接触到这一堆微服务相关组件:grpc + grpc-gateway + etcd + protobuf + protoc-gen-go,一开始都是相安无事,逐步跟进新版本 。
这不 , 幺蛾子就来了 。写这些组件的开发大佬(或公司)都不在一起 , 各自为政 , 各有各的想法、喜欢、规范...因此会出互相不兼容,甚至出现了卡脖子的情况 。

Go etcd 的依赖问题终于解决了......

文章插图
图片
各种兼容问题当 etcd 是 v3.3/v3.4,grpc > v1.27 时,经常会遇到各种看着脑壳痛的兼容性问题 。
至少但不限于如下几个场景 。只是例举几个比较常见的三个兼容错误 。
找不到 grpc/naming找不到 grpc-go 库中的google.golang.org/grpc/naming 包 。原因是什么?原因之一是 go.etcd.io/etcd/client 引用到 grpc-go 库中的实验包 。
在 go mod tidy 时,会遇到如下报错:
go: finding module for package google.golang.org/grpc/naminggo: finding module for package google.golang.org/grpc/examples/helloworld/helloworldgo: found google.golang.org/grpc/examples/helloworld/helloworld in google.golang.org/grpc/examples v0.0.0-20231026203026-8cb98464e599go: finding module for package google.golang.org/grpc/naminggo: git.xxx.cn/xxx/xxx-common/jy imports go.etcd.io/etcd/client tested by go.etcd.io/etcd/client.test imports Github.com/coreos/etcd/integration imports github.com/coreos/etcd/proxy/grpcproxy imports google.golang.org/grpc/naming: module google.golang.org/grpc@latest found (v1.59.0), but does not contAIn package google.golang.org/grpc/naming看到最后的 but does not contain package google.golang.org/grpc/naming 。以为是 grpc-go 乱删库,做了不兼容变更 。
想着找官方解决一下问题 。印象很深刻,人家 grpc-go 表示:我这库早就声明了是实验性,随时可能删除,你不应该依赖他 。(不会支持的意思)
找不到 etcd/clientv3/balancer/picker还是由于 grpc-go 库的实验包在新版本去掉了 。会导致 etcd v3.3 出现:undefined: balancer.PickOptions 和 undefined: resolver.BuildOption 的相关错误信息:
$ go get go.etcd.io/etcd/clientv3# github.com/coreos/etcd/clientv3/balancer/resolver/endpoint../../go/pkg/mod/github.com/coreos/etcd@v3.3.18+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:114:78: undefined: resolver.BuildOption../../go/pkg/mod/github.com/coreos/etcd@v3.3.18+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.18+incompatible/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions../../go/pkg/mod/github.com/coreos/etcd@v3.3.18+incompatible/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions 不得不说,这个 BUG 我还给 etcd 提了 issues 和 pr:
Go etcd 的依赖问题终于解决了......

文章插图
图片
最终合并了 。(但是 etcd v3.5 当年发布的太慢了,没等到...)
找不到 grpc.SupportPackageIsVersion6protoc-gen-go 与 grpc 版本不兼容 。会出现如下报错:
Getting error undefined: grpc.SupportPackageIsVersion6 and undefined: grpc.ClientConnInterface本身这个问题,只需要升级 grpc >= 1.27 就可以了 。但如果你使用了 etcd sdk,又会前面的 etcd 版本依赖问题 , 程序会陷入麻烦的升又升不得,降也降不了 。
最后还是将 protoc(protoc-gen-go) 降级为 v1.3.2,grpc 保持在 v1.26,这样 etcd v3.3 的依赖才能正常使用 。
背后缘由细心的同学会发现,归根到底还是和 etcd v3.3 扯上关系,grpc 就没法升级到 v1.27 以上 。其他所有关联的 protoc、grpc-gateway 的版本都没法继续推进 。
当你想用 go module 来做各种兼容管理时,会发现 etcd v3.3 根本没有 go module...
etcd v3.4 虽然有 go.mod,但也无法拉取和使用(原因详见:etcd-io/etcd/issues/11154[1]) 。
Go etcd 的依赖问题终于解决了......

文章插图
图片
etcd 官方的响应也是不太积极的 。猜测是积重难返 , 比较难解决 。
解决方案社区等了许多年,现在终于有了解决办法 。etcd v3.5 已经正式支持了 go module!
etcd 将之前的模块按功能做了领域划分,把之前各种的低版本依赖、循环依赖等问题都处理了 。
如下图所示:
Go etcd 的依赖问题终于解决了......

文章插图
图片
Go etcd 的依赖问题终于解决了......

文章插图
图片


推荐阅读