实现方案选择
负载均衡处理方案有三种:
- 负载均衡软件 HAProxy, LVS 等
- 客户端进程内负载均衡
- 客户端机器部署独立负载均衡进程 类似QConf-agent
参考负载均衡方案:
https://segmentfault.com/a/1190000008672912
gRPC go client 实现
gRPC go client 采用第二种方式,客户端进程内实现负载均衡。
其基本实现原理:
- 服务启动后gRPC客户端向命名服务器发出名称解析请求,名称将解析为一个或多个IP地址,每个IP地址标示它是服务器地址还是负载均衡器地址,以及标示要使用那个客户端负载均衡策略或服务配置。
- 客户端实例化负载均衡策略,如果解析返回的地址是负载均衡器地址,则客户端将使用grpclb策略,否则客户端使用服务配置请求的负载均衡策略。
- 负载均衡策略为每个服务器地址创建一个子通道(channel)。
- 当有rpc请求时,负载均衡策略决定那个子通道即grpc服务器将接收请求,当可用服务器为空时客户端的请求将被阻塞。
实现代码:https://github.com/liyue201/grpc-lb
当前导出服务实现方式:
客户端:
实现grpc.naming.Resolver接口,实现grpc.naming.Watcher接口,使用grpc自带的RoundRobin Balancer。Resolver使用服务名,返回Watcher,Watcher来提供对etcd 服务key变化的监听。
服务端: