gRPC负载均衡方案

来源:互联网 发布:cef js 交互 编辑:程序博客网 时间:2024/05/21 14:50

实现方案选择

负载均衡处理方案有三种:
- 负载均衡软件 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变化的监听。

服务端:
服务端启动时将自己的ip地址注册到etcd,注册为指定服务名。
服务端定时刷新注册的key,防止key过期。

gRPC PHP client 实现

php语言的特殊性,实现类似grpc go client方式的负载均衡有些困难,可以简化实现。

由于php属于工作在nginx+fpm模式下的worker,生命周期在一次请求后就结束,不容易实现对注册中心key的watch功能。

php可以获取到注册中心提供的服务地址,可以直接使用随机或者轮训的方式实现负载均衡。