当前位置:首页 > 数码 > etcd-的依赖问题最终得到解决-Go (etcd的英文全称)

etcd-的依赖问题最终得到解决-Go (etcd的英文全称)

admin8个月前 (04-16)数码62

几年前,我经常接触到一组微服务相关组件:gRPC、gRPC 网关、etcd、Protobuf 和 protoc-gen-go。一开始,它们都能很好地协同工作,并且随着新版本的发布而持续更新。

问题出现了。这些组件是由不同的开发人员或公司编写的,他们有着各自的想法、偏好和规范。因此,出现了不兼容的情况,甚至导致了严重的卡脖。

兼容性问题

当 etcd 是 v3.3/v3.4,gRPC 大于 v1.27 时,经常会遇到各种令人头痛的兼容性问题。以下列举几个常见的兼容性错误:

1. 找不到 gRPC/naming

在 gRPC-go 库中找不到 .golang.org/grpc/naming 包。原因之一是 go.etcd.io/etcd/client 引用到 gRPC-go 库中的实验包。在执行 gomodtidy 时,会遇到以下错误:

go: finding module for package google.golang.org/grpc/naming
go: finding module for package google.golang.org/grpc/examples/helloworld/helloworld
go: found google.golang.org/grpc/examples/helloworld/helloworld in google.golang.org/grpc/examples v0.0.0-20231026203026-8cb98464e599
go: finding module for package google.golang.org/grpc/naming
go: git.xxx.cn/xxx/xxx-common/jyimports go.etcd.io/etcd/client
tested by go.etcd.io/etcd/client.test imports 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 库早就声明过这是一个实验包,随时可能被删除,不应该依赖于它(即不提供支持)。

2. 找不到 etcd/clientv3/balancer/picker

这仍然是由于 gRPC-go 库中的实验包在新版本中被删除了。这将导致 etcd v3.3 出现以下错误信息:

undefined: balancer.PickOptions
undefined: resolver.BuildOption

具体错误信息如下:

$ go get go.etcd.io/etcd/clientv3github.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/picker/picker.go:39:53: undefined: balancer.PickOptions

3. 找不到 etcd/clientv3/naming

当 etcd 是 v3.5.0,grpc-gateway 是 v2.11.0 时,可能会遇到以下错误:

cannot find module providing package github.com/coreos/etcd/clientv3/naming/endpoints: google.golang.org/grpc@v1.49.0

在 grpc-gateway 中引用了该包,但在较新版本的 gRPC 中已将其删除。

4. 无法获得连接

在某些情况下,您可能会遇到以下错误:

write: connection is shutting down

这通常是由于 gRPC 库中的并发性问题造成的。例如,在关闭 gRPC 客户端时,可能会在关闭连接之前发送请求。这个问题可以通过以下代码片段来解决:

if err := conn.Close(); err != nil {
    log.Printf("Failed to close the connection: %v", err)
}

解决方案

解决这些兼容性问题的最佳方法是使用这些组件的最新稳定版本。这样做可以确保您使用受支持的 API 和功能,并避免兼容性问题。

如果您必须使用旧版本的组件,那么您需要仔细检查兼容性问题并相应地调整您的代码。您还可以使用以下资源来解决兼容性问题:

    Go
  • gRPC-go 问题跟踪器
  • etcd 问题跟踪器
  • Protobuf 问题跟踪器

结论

gRPC、gRPC 网关、etcd、Protobuf 和 protoc-gen-go 是复杂的组件,在使用时可能会遇到兼容性问题。了解这些问题并使用最新稳定版本可以帮助您避免卡脖并确保您的微服务平稳运行。


wine的循环依赖问题怎么解决

去下源代码自己编译呗,那还是1.4的,你可以去官网下个1.7滴~~先安装依赖的库:sudo apt-get install flex bison qt4-qmakesudo apt-get install libfreetype6-devsudo apt-get install libjpeg-dev libpng-dev libxslt-dev libxml2-dev sudo apt-get install libxrender-devsudo apt-get install libgl1-mesa-devsudo apt-get install libglu1-mesa-devsudo apt-get install freeglut3-devsudo apt-get install prelink sudo apt-get install libasound2-dev然后下载源代码进入解包目录:./configure

出现java.lang.NoSuchMethodErrorl怎么解决?

1、项目依赖bai复杂。 不使用maven管理项目依赖时更容易出现该问题。 处理的方法是: 如果使用maven,执行dumaven dependency:tree 人工排除。 2、运行环境问题。 一般java web程序都运行在容器中,tomcat等。 如果容器中已经存在了某个版本的jar包并已zhi经加载了某些类,而web项目中依赖了不同的版本。 处理方法:保证使用“干净”的容器运行程序,或者在maven依赖中将容器中已经存在的dao依赖设置为<scope>provided</scope>。 一般在项目依赖比较复杂或者java运行的环境有问题版时同一类型的jar包有不同版本存在,本质上说是JVM找不权到某个类的特定方法,也就是说JVM加载了错误版本的类。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Go

“etcd-的依赖问题最终得到解决-Go (etcd的英文全称)” 的相关文章

Templ-编写-Go-用户界面-HTML-如何在-中经常使用 (temple)

Templ-编写-Go-用户界面-HTML-如何在-中经常使用 (temple)

简介 templ[1]是一个在Go中编写用户界面的言语。经常使用templ,咱们可以创立可出现HTML片段的组件,并将它们组合起来创立屏幕、页面、文档或运行程序。 装置 咱们可以...

Go-言语中并发的弱小效劳 (go语言语法很奇怪啊)

Go-言语中并发的弱小效劳 (go语言语法很奇怪啊)

施展效率和照应才干 并发是现代软件开发中的一个基本概念,它使程序能够同时口头多个义务,提高效率和照应才干。在本文中,咱们将讨论并发在现代软件开发中的关键性,并深化了解Go处置并发义务的共同...

内存优化与渣滓搜集-深化探求优化程序性能的最佳通常-Go (内存优化与渣子有关吗)

内存优化与渣滓搜集-深化探求优化程序性能的最佳通常-Go (内存优化与渣子有关吗)

Go提供了智能化的内存治理机制,但在某些状况下须要更精细的微调从而防止出现OOM失误。本文将讨论Go的渣滓搜集器、运行程序内存优化以及如何防止OOM(Out-Of-Memory)失误。 Go...

的原因-Go-Map-语言不支持并发读写 (的原因英语)

的原因-Go-Map-语言不支持并发读写 (的原因英语)

在Go语言的设计中,为了防止数据竞态,不同于一些其他语言,map并没有提供内置的锁机制。这样设计的目的是为了鼓励开发者使用更加精细的同步措施,以适应不同的并发场景。 Map的数据结构...

14条超乎想象的Go接口最佳实践

14条超乎想象的Go接口最佳实践

近年来,越来越多的开发者开始关注 Go 语言,它以其高效、简洁和高并发性而闻名。在 Go 语言中,接口是一个非常强大的特性,它可以帮助我们定义和实现不同的行为。本文将介绍 Go 语言中接口设计的一...

并非你构想得那么便捷-Go中的switch的六种用法 (并非你构想得到的成语)

并非你构想得那么便捷-Go中的switch的六种用法 (并非你构想得到的成语)

Go以其繁复而著称,但并不是每团体都相熟这种言语中switch语句的多样性。首先,假设你对Go的switch语句还不相熟,它或许与其余言语相比有些不同。 上方是一个便捷的示例来展现它是什么...

b-Go-成功线程安保的缓存-sync.Map-中经常使用-b

b-Go-成功线程安保的缓存-sync.Map-中经常使用-b

缓存是提升现代运行程序性能的关键方面。它准许您存储并极速检索低廉操作的结果或经常访问的数据,缩小了重复从新计算或失掉数据的须要。在本文中,咱们将讨论如何经常使用sync.Map包在Go中成功线程安...