golang etcd clientv3.New()不报超时错误的问题解决

正常来说,clietntv3的初始化代码如下:

config := clientv3.Config{
   Endpoints: []string{"localhost:2379"},
   DialTimeout: 2*time.Second,
}
client, err := clientv3.New(config)
if err != nil{
   panic(fmt.Errorf("ectd client init failed! err: %s ", err.Error()))
}

但是,如果使用新版本的客户端( v3.3.x) 。当我们指定到了一个无效的etcd服务端地址时, 即使设置了DialTimeout选项,clientv3.New()函数依然不会抛出任何错误。直到执行后续的etcd命令时候,才会抛出错误。
貌似是新版本使用的新的均衡器带来的问题。
在这里插入图片描述
目前正确的使用方法是在New()函数后使用Status函数来检测当前的连接状态, 代码如下:

clientConfig := clientv3.Config{
	Endpoints:   []string{"http://" + *etcdHost},
	DialTimeout: 2 * time.Second,
}

etcd, err := clientv3.New(clientConfig)
if err != nil {
	return nil, errors.Wrap(err, "could not connect to etcd")
}

timeoutCtx, cancel := context.WithTimeout(context.Background(), 2 * time.Second)
defer cancel()
_, err = etcd.Status(timeoutCtx, clientConfig.Endpoints[0])
if err != nil {
	return nil, errors.Wrapf(err, "error checking etcd status: %v", err)
}

详见这条issue https://github.com/etcd-io/etcd/issues/9877

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值