当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-11-02 09:08:50 358观看
导读大家好,我是煎鱼。前几年非常高频的接触到这一堆微服务相关组件:grpc + grpc-gateway + etcd + protobuf + protoc-gen-go,一开始都是相安无事,逐步跟进新版本。这不,幺蛾子就来了。写这些组件的开发大佬(或公司)都不在一起,

大家好,我是煎鱼。rga28资讯网——每日最新资讯28at.com

前几年非常高频的接触到这一堆微服务相关组件:grpc + grpc-gateway + etcd + protobuf + protoc-gen-go,一开始都是相安无事,逐步跟进新版本。rga28资讯网——每日最新资讯28at.com

这不,幺蛾子就来了。写这些组件的开发大佬(或公司)都不在一起,各自为政,各有各的想法、喜欢、规范...因此会出互相不兼容,甚至出现了卡脖子的情况。rga28资讯网——每日最新资讯28at.com

图片图片rga28资讯网——每日最新资讯28at.com

各种兼容问题

当 etcd 是 v3.3/v3.4,grpc > v1.27 时,经常会遇到各种看着脑壳痛的兼容性问题。rga28资讯网——每日最新资讯28at.com

至少但不限于如下几个场景。只是例举几个比较常见的三个兼容错误。rga28资讯网——每日最新资讯28at.com

找不到 grpc/naming

找不到 grpc-go 库中的google.golang.org/grpc/naming 包。原因是什么?原因之一是 go.etcd.io/etcd/client 引用到 grpc-go 库中的实验包。rga28资讯网——每日最新资讯28at.com

在 go mod tidy 时,会遇到如下报错:rga28资讯网——每日最新资讯28at.com

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 乱删库,做了不兼容变更。rga28资讯网——每日最新资讯28at.com

想着找官方解决一下问题。印象很深刻,人家 grpc-go 表示:我这库早就声明了是实验性,随时可能删除,你不应该依赖他。(不会支持的意思)rga28资讯网——每日最新资讯28at.com

找不到 etcd/clientv3/balancer/picker

还是由于 grpc-go 库的实验包在新版本去掉了。会导致 etcd v3.3 出现:undefined: balancer.PickOptions 和 undefined: resolver.BuildOption 的相关错误信息:rga28资讯网——每日最新资讯28at.com

$ 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:rga28资讯网——每日最新资讯28at.com

图片图片rga28资讯网——每日最新资讯28at.com

最终合并了。(但是 etcd v3.5 当年发布的太慢了,没等到...)rga28资讯网——每日最新资讯28at.com

找不到 grpc.SupportPackageIsVersion6

protoc-gen-go 与 grpc 版本不兼容。会出现如下报错:rga28资讯网——每日最新资讯28at.com

Getting error undefined: grpc.SupportPackageIsVersion6 and undefined: grpc.ClientConnInterface

本身这个问题,只需要升级 grpc >= 1.27 就可以了。但如果你使用了 etcd sdk,又会前面的 etcd 版本依赖问题,程序会陷入麻烦的升又升不得,降也降不了。rga28资讯网——每日最新资讯28at.com

最后还是将 protoc(protoc-gen-go) 降级为 v1.3.2,grpc 保持在 v1.26,这样 etcd v3.3 的依赖才能正常使用。rga28资讯网——每日最新资讯28at.com

背后缘由

细心的同学会发现,归根到底还是和 etcd v3.3 扯上关系,grpc 就没法升级到 v1.27 以上。其他所有关联的 protoc、grpc-gateway 的版本都没法继续推进。rga28资讯网——每日最新资讯28at.com

当你想用 go module 来做各种兼容管理时,会发现 etcd v3.3 根本没有 go module...rga28资讯网——每日最新资讯28at.com

etcd v3.4 虽然有 go.mod,但也无法拉取和使用(原因详见:etcd-io/etcd/issues/11154[1])。rga28资讯网——每日最新资讯28at.com

图片图片rga28资讯网——每日最新资讯28at.com

etcd 官方的响应也是不太积极的。猜测是积重难返,比较难解决。rga28资讯网——每日最新资讯28at.com

解决方案

社区等了许多年,现在终于有了解决办法。etcd v3.5 已经正式支持了 go module!rga28资讯网——每日最新资讯28at.com

etcd 将之前的模块按功能做了领域划分,把之前各种的低版本依赖、循环依赖等问题都处理了。rga28资讯网——每日最新资讯28at.com

如下图所示:rga28资讯网——每日最新资讯28at.com

图片图片rga28资讯网——每日最新资讯28at.com

图片图片rga28资讯网——每日最新资讯28at.com

拆分为了 api、client、raft、server、etcdctl、bbolt 等独立的 Go 模块。不会像老版本一样交叉影响。rga28资讯网——每日最新资讯28at.com

如果你是新项目,建议无脑使用 etcd v3.5 以上版本。千万别用 v3.3/v3.4 及更低的!rga28资讯网——每日最新资讯28at.com

比较无奈的一点

可能有的同学以为皆大欢喜了?其实并不。rga28资讯网——每日最新资讯28at.com

他的模块化改造成功仅限于 etcd v3.5 的版本。而历史项目,如果你是使用 etcd v2 store,那么很抱歉。rga28资讯网——每日最新资讯28at.com

etcd 老版本(v3.3/v3.4 等)是没有变动的,在 v3.5 的新版本(包含最新的文档)中都在开始在逐步去除 etcd v2 的相关支持。rga28资讯网——每日最新资讯28at.com

图片图片rga28资讯网——每日最新资讯28at.com

如果仍然在使用 etcd v2 的同学,建议进行数据迁移用 v3。这样可以避免很多技术上的问题。rga28资讯网——每日最新资讯28at.com

迁移不方便的话,除了各种 replace 和锁版本外。如果你使用的 etcd 功能非常基础,也可以自己实现一个简易版的 SDK。rga28资讯网——每日最新资讯28at.com

总结

etcd 的这个历史问题已经存在了好几年,一直处理的慢慢吞吞。甚至影响到了 Go 生态圈的一些技术选型问题。rga28资讯网——每日最新资讯28at.com

前几天有同学反馈 tidb 里引用了 cloud.google.com/go/pubsub 库,而该库又依赖了 grpc 的较高的版本。从而导致原有卡在 grpc v1.26 的应用又出现了问题。才回过头来看看。rga28资讯网——每日最新资讯28at.com

在新版本中,etcd 的依赖问题终于解决了。真的是,这值得被我们记住!虽然他老版本依然没处理...rga28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-16509-0.htmlGo etcd 的依赖问题终于解决了......

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Istio:微服务开发的终极利器,你还在为繁琐的通信和部署流程烦恼吗?

下一篇: 聊一聊 Python 的换行以及转义

标签:
  • 热门焦点
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 2023 年的 Node.js 生态系统

    随着技术的不断演进和创新,Node.js 在 2023 年达到了一个新的高度。Node.js 拥有一个庞大的生态系统,可以帮助开发人员更快地实现复杂的应用。本文就来看看 Node.js 最新的生
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
Top