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

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

admin3个月前 (04-16)数码37

几年前,我经常接触到一组微服务相关组件: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的英文全称)” 的相关文章

中-Goroutines-成功轻量级并发的高效并发原语-Go

中-Goroutines-成功轻量级并发的高效并发原语-Go

并发是现代软件开发的一个基本概念,使程序能够同时口头多个义务。在Go编程畛域,了解Goroutines是至关关键的。本文将片面概述Goroutines,它们的轻量级特性,如何经常使用go关键字创立...

在-使用-应用-中构建高性能-Echo-Web-Go (在使用应急法压缩时间时,不一定)

在-使用-应用-中构建高性能-Echo-Web-Go (在使用应急法压缩时间时,不一定)

Echo是一个高性能且易用的框架,用于构建Go语言编写的Web应用。它具备灵活的路由功能、方便的请求处理、强大的中间件支持和简单的JSON操作,非常适合快速开发API服务和Web应用。 快速...

Go-内存调配优化-在结构体中充沛应用内存 (go 内存)

Go-内存调配优化-在结构体中充沛应用内存 (go 内存)

在经常使用Golang启动内存调配时,咱们须要遵照一系列规定。在深化了解这些规定之前,咱们须要先了解变量的对齐形式。 Golang的unsafe包中有一个函数Alignof,签名如下: f...

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

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

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

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

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

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

内存效率-多用途-语言中使用切片代替数组的优点-动态大小-Go (内存使用效率)

内存效率-多用途-语言中使用切片代替数组的优点-动态大小-Go (内存使用效率)

引言 在 Go 语言中,数组是一种固定长度的数据结构,而切片则是一种可变长度的数据结构。虽然数组和切片都可以存储相同类型的数据元素,但切片在使用上有其独到的优势,本文将通过介绍切片的特性来解释为...

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

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

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