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