如何在服务发现中使用etcd?

时间:2017-04-26 15:24:38

标签: etcd etcd3

我是etd的初学者 我的目的是以下几 1.服务开始后服务注册 2.客户端查找服务并调用服务

以下代码展示测试如何查找服务并调用它

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)
}

console output" calc err:rpc error:code = Unavailable desc =没有可用的地址"执行resp, err := c.CalcResult(context.Background(), &req)后 这意味着解析器无法从服务名称中找到服务地址 我猜有两种可能 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中有功能吗?

1 个答案:

答案 0 :(得分:-2)

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

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