etcd-的依赖问题最终得到解决-Go (etcd的英文全称)
几年前,我经常接触到一组微服务相关组件: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 和功能,并避免兼容性问题。
如果您必须使用旧版本的组件,那么您需要仔细检查兼容性问题并相应地调整您的代码。您还可以使用以下资源来解决兼容性问题:
- 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加载了错误版本的类。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。