我是 etcd 的初学者,
我的目的是遵循
1.service 在服务启动后自行注册
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)
}
控制台输出“calc err: rpc error: code = Unavailable desc = there is no address available” 执行后resp, err := c.CalcResult(context.Background(), &req)
表示解析器无法从服务名称中找到服务地址
我猜有两种可能
1.调用服务需要启动etcd "proxy service" or "gateway" first
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中是否有我需要的功能?