服务调用者要在众多的微服务中调用具体的服务提供者,必然涉及到负载均衡的问题,根据负载均衡的实现可以分为集中式LB、进程内LB和独立进程LB。
集中式LB
LB上有所有的服务地址配置,当服务消费者调用某个服务的时候,LB会根据负载均衡策略(随机、轮询等)将请求转发到具体的服务上。此外,服务调用者还需要知道LB的地址,通常的做法是运维在服务器上配置一个DNS域名或者IP,这个域名指向LB。
这种实现方式的问题每次调用都要访问LB,LB存在单点问题,无法水平扩展
进程内LB
为了解决每次服务调用都经过LB的不足,把LB放在客户端可以很好解决,这里多了一个注册表,服务提供方启动时,首先将服务地址注册到服务注册表,定期发送心跳包到服务注册表,检查存活状态。
服务消费方要访问某个服务时,经历以下过程:
- 服务消费者在启动时从服务注册表获取需要的服务注册信息
- 将服务提供者注册信息缓存在本地(客户端LB)
- 监听服务提供者注册信息的变更,如接收到服务注册中心的服务变更通知,则在本地缓存中更新服务的注册信息
- 根据本地缓存中的服务注册信息构建服务调用请求,并根据负载均衡策略(随机负载均衡