首页 > 解决方案 > etcd 错误:超出上下文截止日期

问题描述

当我使用 shell 时它返回 ok,但是当我使用 golang 时它返回err: context deadline exceeded.

为什么?

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "time"
)
func main()  {
    cli,err := clientv3.New(clientv3.Config{
        Endpoints: []string{"http://192.168.11.34:2379"},
        DialTimeout: 5*time.Second,
    })
    if err != nil{
        panic(err)
    }
    fmt.Println("connect etcd success!")
    defer cli.Close()

    ctx,cancel := context.WithTimeout(context.Background(),time.Second*5)
    _,err = cli.Put(ctx,"mac","leave")
    defer  cancel()
    if err !=nil{
        fmt.Println("put etcd err:",err.Error())
        return
    }
}
connect etcd success!
{"level":"warn","ts":"2021-02-08T17:10:46.490+0800","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-5b14f6c4-2395-4a15-9ebb-cadf5985fb06/192.168.11.34:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: all SubConns are in TransientFailure, latest connection error: connection error: desc = \"transport: Error while dialing dial tcp 192.168.11.34:2379: connect: connection refused\""}
put etcd err: context deadline exceeded

标签: gogrpcetcd

解决方案


创建客户端并不能保证连接已建立。它可能会延迟到第一个实际失败的请求。

请确保您的服务器是可访问的。


推荐阅读