gRPC源码阅读及实践之 Resolver

本文深入探讨gRPC的Resolver扩展,通过源码阅读和实践,展示了如何实现一个基于etcd的服务发现机制。解释了Resolver的工作原理,包括如何注册和使用自定义Resolver,以及Resolver如何通知负载均衡器更新服务实例。

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

Resolver

gRPC 插件式编程之Resolver


随着微服务越来越盛行,服务间的通信也是绕不开的话题,gRPC 在众多 RPC 框架中算得上佼佼者,不仅其有一个好爸爸,grpc 在扩展方面也给开发者留
有足够的空间,今天我们将走进grpc 扩展之 Resolver,gRPC Resolver 提供了用户自行解析主机的扩展能力,我们在使用 gRPC 时,大家有没有想过,
为什么 gRPC 为什么支持以下几种格式的 target:

  • 直连, 链接 target 为目标服务的endpoint
  • dns 服务发现
  • unix

其中在进入连接之前,gRPC 会根据用户是否提供了 Resolver 来进行目标服务的 endpoint 解析,今天我们来尝试写一个最简单的 etcd 做服务发现的例子

说明

源码阅读的 gRPC 版本为 3.5.1

环境

  • etcd 安装
  • go

思路

  • 我们将为 server 服务,假设名称为 grpc-server 启动多个实例
  • grpc-server 为 key 向 etcd put 每个实例的 endpoint
    • 真正进入 etcd 的 key 为以 grpc-server + / + 随机值
  • 实现 resolver.Builder, 获取 target
  • 从 etcd 读取以 grpc-server 为 prefix 的 endpoints
  • 通知负载均衡器重新 pick 实例

实现

实现 resolver.Builder

type customBuilder struct {
   
   
    scheme string
}

func NewCustomBuilder(scheme string) resolver.Builder {
   
   
  return &customBuilder{
   
   
    scheme: scheme,
  }
}

func (b *customBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
   
   
  var address []resolver.Address
  key := target.URL.Host
  hosts := pool.GetOr(key, nil)
  fmt.Println
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值