etcd
- etcd-client的服务发现,均衡算法,强依赖于grpc的版本。在下面三个版本周期,具备3种不同的算法。
grpc-1.10:
- 对一条请求而言,向a,b,c三个(app)服务节点同时发送连接建立,返回最快的连接(假定是a)。a节点请求因为错误失败了,则就失败了,该请求不会重试而是直接fail。
grpc-1.7:
- 对一条请求而言,向a,b,c三个(app)服务节点,同时发送建立连接,返回最快的连接。a节点发生错误了,会有重试机制。重试也不行后就会标记a不健康,并且会维护一个unhealthy list( a在里面),在一个续约周期内,该破损节点,会一直不被使用。
以上,
两个版本的失败重试策略,在grpc版本迭代时,兼容性差,bug多。他们就推出了grpc-1.23
grpc-1.23:
- 对一条请求而言,a,b,c三个服务节点,同时加建立连接,三个连接全部返回。请求会以轮训的机制来随机获取一个节点使用。在一个续约周期内,如果a损毁,那么他就会一直保持损毁,而请求不会一直失败。因为a损毁时,他就会向b去重试。直到下一次a没法送续约从连接list里移除。
至此,使用etcd,一定要明确gprc的版本,它要求以下包同时正确(因为使用时,IDE容易自动提示不同的包,两个包版本不一致的话,万一你同时使用了两个包源,就蛋疼了。):
- “google.golang.org/grpc”
- “github.com/grpc/grpc-go”