etcd clientv3 源码解读 - grpc负载均衡原理

本文深入解析etcd clientv3中gRPC的负载均衡原理,包括resolver的职责——将目标地址解析为服务列表,clientconn作为连接池的角色,以及balancer如何维护和选择连接。介绍了gRPC客户端的基本原理,如何注册和使用自定义的balancer、resolver和picker。文章详细阐述了在DialContext过程中的步骤,如设置resolver builder、构建resolver、启动resolver以及balancer的初始化和地址处理。
摘要由CSDN通过智能技术生成

1.  几个会反复出现的术语的理解

  • resolver:解析器,可以粗暴理解为从一个字符串映射到一堆服务。比如经典的dns就是完成一个域名到一堆ip的映射解析,在etcd中,它自己定义了一个endpoint的解析器。有自己的格式,最终也是映射到服务地址。
  • clientconns: 连接池。可以粗暴理解为这个池子缓存着与每个resolver解析后的地址的连接,数据哪里来呢? 原始数据会根据resolver解析完存进来,然后后面介绍的balancer会小心的维护这个池子。
  • balancer:均衡器。它最操心。它要watch连接池里有没有要变化的,有的话就更新。另外,它还以某种机制(比如最简单的rr)从conns里面拿连接用,当有连接不可用时,自己默默的换一个可用的,并且更新conns的状态,不用上层操心(对上层透明)

2. 基本原理

    基本原理是gRPC的client端为它要访问的target地址维护了ClientConn

    同时grpc提供注册机制,可以注册自己的balancer,resolver,picker。这些注册要在初始化的时候完成。

 

3. 注册自己的均衡器相关的重要的接口

type Balancer

type Balancer interface {
    //当grpc检测到sc的连接状态发生改变时,balancer的策略,一般来说,balancer需要重新聚合下所有的subconn,更新自己的cache,方便picker使用,并且通告给grpc。
    HandleSubConnStateChange(sc SubConn, state connectivity.State)
    //这个接口油grpc调用,用来发送地址变更消息给balancers。balancer可以重建conns或者删除失效的conns。
    HandleResolvedAddrs([]resolver.Address, error)
    //关闭这个balancer。可以不关闭连接池中的数据。
    Close()
}

type Builder   // 用来创建balancer

type Builder interface {
    // Build creates a new balancer with the ClientConn.
    Build(cc ClientConn, opts BuildOptions) Balancer
    // Name returns the name of balancers built by this builder.
    // It will be used to pick balancers (for example in service config).
    Name() string
}

type Picker   //用来选clientconn

type Picker interface {
    // Pick returns t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值