etcd用于grpc命名解析与服务发现

本文介绍如何利用gRPC的Resolver与Watcher接口配合Etcd实现服务注册与发现。通过示例代码展示了服务端如何注册服务到Etcd集群,客户端如何通过gRPC连接指定的服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命名解析与服务发现

grpc提供了两个接口:(google.golang.org/grpc/naming)

  • Resolver:命名解析

    type Resolver interface {
        // 创建目标服务监视器
        Resolve(target string) (Watcher, error)
    }
  • Watcher:服务发现

    type Watcher interface {
        // 堵塞监听节点变化信息
        Next() ([]*Update, error)
        Close()
    }

etcd3 默认实现的Resolver和Watcher

包:github.com/coreos/etcd/clientv3/naming

参考etcd源码:naming包


核心代码

  1. server端,注册服务到etcd集群中:
    // 连接etcd集群
    cli, err := clientv3.New(clientv3.Config{
        // etcd集群成员节点列表
        Endpoints:   []string{"127.0.0.1:2379"},
        DialTimeout: 5 * time.Second,
    })
    if err != nil {
        fmt.Println("[测] connect etcd err:", err)
        return
    }

    // 创建命名解析
    r := &naming.GRPCResolver{Client: cli}
    // 将本服务注册添加etcd中,服务名称为myService,服务地址为本机8001端口
    r.Update(context.TODO(), "myService", naming.Update{Op: naming.Add, Addr: "192.168.0.101:8001"})

    // TODO
    // 服务在8001启动...
    // ...
  1. client端,连接服务
    // 连接etcd集群
    cli, err := clientv3.New(clientv3.Config{
        // etcd集群成员节点列表
        Endpoints:   []string{"127.0.0.1:2379"},
        DialTimeout: 5 * time.Second,
    })
    if err != nil {
        fmt.Println("[测] connect etcd err:", err)
        return
    }

    r := &etcdnaming.GRPCResolver{Client: cli}
    b := grpc.RoundRobin(r)

    conn, err := grpc.Dial("myService", grpc.WithBalancer(b), grpc.WithBlock())
    if err != nil {
        panic(err)
    }

    // TODO
    // 使用conn创建具体服务的client,如userCli := protos.NewIUserServiceClient(conn)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值