golang使用etcd版本问题

报错:如下与新版本的grpc包冲突,当前引入的etcd版本为旧版本。

go: common/modules/etcd imports
    go.etcd.io/etcd/clientv3 tested by
    go.etcd.io/etcd/clientv3.test imports
    github.com/coreos/etcd/auth imports
    github.com/coreos/etcd/mvcc/backend imports
    github.com/coreos/bbolt: github.com/coreos/bbolt@v1.3.6: parsing go.mod:
    module declares its path as: go.etcd.io/bbolt
            but was required as: github.com/coreos/bbolt

网上解决方式:

go mod init
 
go mod edit -replace github.com/coreos/bbolt@v1.3.4=go.etcd.io/bbolt@v1.3.4
 
go mod edit -replace google.golang.org/grpc@v1.29.1=google.golang.org/grpc@v1.26.0
 
go mod tidy

 最后,经过通过升级Etcd依赖版本解决,正确方法如下:最后,经过通过升级Etcd依赖版本解决,正确方法如下:

# 替换之前
import(
    "go.etcd.io/etcd/clientv3"
)
# 替换之后
import(
    "go.etcd.io/etcd/client/v3"
)

最后执行 go mod tidy

除此之外包冲突可能使用到的有 :

	clientv3 "go.etcd.io/etcd/client/v3"
    "github.com/coreos/etcd/mvcc/mvccpb"
    //引入go.etcd.io/etcd/clientv3 时对应 "go.etcd.io/etcd/mvcc/mvccpb"
    //引入"go.etcd.io/etcd/client/v3" 时对应 "github.com/coreos/etcd/mvcc/mvccpb"
)

但还是有问题,最终上面的那两个mvccpb都是旧版本指向同一一个版本,解决

只需要导入"go.etcd.io/etcd/api/v3/mvccpb"即可,它不会额外添加包,直接导入不用更新mod

// go.etcd.io/etcd/clientv3导包为v3.3.27 已经过时最终不更新版本

// go.etcd.io/etcd/client/v3导包 v.3.5.17 新版本

// github.com/coreos/etcd v3.3.27+incompatible // indirect

### 使用 GoLangEtcd 的基本概念 GoLang 是一种高效的编程语言,广泛用于构建分布式系统和微服务架构。Etcd 是一个分布式的键值存储工具,通常被用来保存配置数据、元数据以及实现分布式锁等功能。两者结合可以很好地支持现代云原生应用的需求。 以下是关于如何在 Go使用 Etcd 的一些核心知识点: #### 安装依赖库 要开始使用 Etcd,在项目中需要引入官方的客户端库 `go.etcd.io/etcd/clientv3`。可以通过以下命令安装该库: ```bash go get go.etcd.io/etcd/clientv3 ``` 此操作会下载并安装必要的包来连接到 Etcd 集群[^1]。 #### 连接到 Etcd 实例 下面是一个简单的代码片段展示如何创建与 Etcd 的连接,并执行基础的操作(如写入和读取键值对): ```go package main import ( "context" "fmt" "log" clientv3 "go.etcd.io/etcd/client/v3" ) func main() { cli, err := clientv3.New(clientv3.Config{ Endpoints: []string{"localhost:2379"}, // 替换为实际的 Etcd 地址 DialTimeout: 5 * time.Second, }) if err != nil { log.Fatalf("无法连接至 Etcd:%v", err) } defer cli.Close() ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) _, err = cli.Put(ctx, "key1", "value1") // 设置 key-value 对 cancel() if err != nil { log.Fatal(err) } fmt.Println("成功设置键值对") getResp, err := cli.Get(context.TODO(), "key1") // 获取指定 Key 值 if err != nil { log.Fatal(err) } for _, ev := range getResp.Kvs { fmt.Printf("%s : %s\n", ev.Key, ev.Value) // 打印获取的结果 } } ``` 上述程序展示了如何向 Etcd 存储数据并通过其检索出来[^4]。 #### 最佳实践建议 当开发涉及 Etcd 的应用程序时,应考虑采用某些最佳实践以提高性能和可靠性。例如,合理管理上下文超时时间能够防止长时间阻塞调用;利用事务机制保障一致性等[^2]。 #### 处理复杂场景下的 Pub/Sub 模型 如果希望基于 Etcd 构建发布订阅模式,则可借助 Watch API 来监听特定路径的变化情况。如下所示即为一段简单演示代码: ```go rChan := cli.Watch(context.Background(), "/some/path/") for wresp := range rChan { for _, evt := range wresp.Events { fmt.Printf("Type: %s Key:%q OldValue:%q NewValue:%q\n", evt.Type, string(evt.Kv.Key), string(evt.PrevKv.Value), string(evt.Kv.Value)) } } ``` 这里我们监视某个目录下发生的所有事件,并打印相关信息[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值