【问题标题】:how to use etcd in service discovery?如何在服务发现中使用 etcd?
【发布时间】:2017-09-24 02:30:33
【问题描述】:

我是 etcd 的初学者
我的目的是跟随
1.服务启动后注册自己
2.client查找服务并调用服务

下面的代码展示了如何找到服务并调用它

func ClientTestService() {
    cli, err := clientv3.New(clientv3.Config{
        Endpoints:   []string{endpoint},
        DialTimeout: time.Second * 5,
    })

    if err != nil {
        log.Println("connect etcd err:", err.Error())
        return
    }

    defer cli.Close()
    r := &naming.GRPCResolver{Client: cli}
    b := grpc.RoundRobin(r)

    conn, err := grpc.Dial(service_name, grpc.WithBalancer(b), grpc.WithInsecure())
    if err != nil {
        log.Println("dial err:", err.Error())
        return
    }

    defer conn.Close()
    c := calc.NewCalcClient(conn)
    req := calc.CalcRequest{IResult: 1, SResult: "req"}
    resp, err := c.CalcResult(context.Background(), &req)
    if err != nil {
        log.Println("calc err:", err)
        return
    }
    log.Println(resp.IResult, resp.SResult)
}

执行resp, err := c.CalcResult(context.Background(), &req)
后控制台输出“calc err: rpc error: code = Unavailable desc = there is no address available” 这意味着解析器无法从服务名称中找到服务的地址
我想有两种可能
1.调用服务需要先启动etcd“代理服务”或“网关”
2.需要手动从服务名中获取服务地址

以下代码显示注册服务

func RegisterService(w *sync.WaitGroup) {
    w.Add(1)
    defer func() {
        w.Done()
    }()

    cli, err := clientv3.New(clientv3.Config{
        Endpoints:   []string{endpoint},
        DialTimeout: time.Second * 5,
    })

    if err != nil {
        log.Println("etcd err:", err)
        return
    }

    cli.Delete(cli.Ctx(), service_name)
    r := &naming.GRPCResolver{Client: cli}
    for _, addr := range GetLocalAddrs() {
        service_node := addr + ":" + strconv.Itoa(port)
        err = r.Update(cli.Ctx(), service_name, gn.Update{Op: gn.Add, Addr: service_node})
        log.Println("register node :", service_name, service_node, err)
    }
}

我的理解是函数“ClientTestService”连接etcd服务器并将服务名称解析为服务地址并通过余额调用服务
但是当我调试这段代码然后发现它只是通过平衡调用etcd, etcd 中是否有我需要的功能?

【问题讨论】:

  • 我遇到了同样的问题。当客户端代码调用服务器方法时会发生错误。这是我从 etcd 日志中得到的:2017-08-13 20:04:22.571628 I | etcdserver/api/v3rpc: transport: http2Server.HandleStreams failed to read frame: read tcp 127.0.0.1:2379->127.0.0.1:49150: read: connection reset by peer]
  • @srxf 这是etcd v3.2在window系统上的一个bug 可以使用最新版本的etcd
  • 我正在使用在 x64 ubuntu linux 机器上运行的最新版本的 etcd v3.2.5。你已经让它工作了吗?
  • @srxf 是的,对我来说很好用
  • 也许我遗漏了什么,如果您能分享代码,我将不胜感激:)

标签: etcd etcd3


【解决方案1】:

尝试为 Dial 添加 grpc.WithBlock(),如下所示:

grpc.Dial(service_name, grpc.WithBalancer(b), grpc.WithInsecure(), grpc.WithBlock() )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 2016-05-16
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多