• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
孙龙 程序员
少时总觉为人易,华年方知立业难
博客园    首页    新随笔    联系   管理    订阅  订阅
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函数来检测当前的连接状态, 代码如下:

 

 

//初始化
func (e *EtcdRegistry) Init(ctx context.Context, opts ...registry.Option) (err error) {

    e.options = &registry.Options{}
    for _, opt := range opts {
        opt(e.options)
    }

    clientConfig := clientv3.Config{
        Endpoints:   e.options.Addrs,
        DialTimeout: e.options.Timeout,
    }
    e.client, err = clientv3.New(clientConfig)

    if err != nil {
        err = fmt.Errorf("init etcd failed, err:%v", err)
        return
    }
    //下面代码 是因为当etcd ip链接不同 不报错导致超时 阻塞的办法
    timeoutCtx, cancel := context.WithTimeout(context.Background(), 2 * time.Second)
    defer cancel()
    _, err =e.client.Status(timeoutCtx, clientConfig.Endpoints[0])
    fmt.Println(err)
    if err != nil {
        panic("xxxxxxxxxxxxxx")
        err = fmt.Errorf("error checking etcd status: %v", err)
        return
    }

    return
}

 

本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/13903521.html

posted on 2020-10-30 18:05  孙龙-程序员  阅读(738)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3