SpringCloud之Ribbon客户端负载应用及原理分析
SpringCloud之Ribbon客户端负载原理分析(一)-LoadBalancerInterceptor原理分析
SpringCloud之Ribbon客户端负载原理分析(二)-RibbonLoadBalancerClient原理分析
SpringCloud之Ribbon客户端负载原理分析(三)-ILoadBalancer原理分析
本文主要内容:
上一篇文章分析了RibbonLoadBalancerClient,其中它会通过ILoadBalancer去获取一个服务实例,而ILoadBalancer是实现客户端负载的核心类,下面就来分析ILoadBalancer的原理。
本文核心内容:
-
ILoadBalancer负载均衡器基本介绍
-
ILoadBalancer的实现类DynamicServerListLoadBalancer及核心组件功能介绍,包括:
-
服务列表路由规则(IRule)
-
服务状态处理(IPing)
-
服务列表存储(ServerList)
-
服务列表更新(SercerListUpdate)
-
服务列表过滤(ServerListFilter)
-
-
DynamicServerListLoadBalancer的初始化过程
-
当引入Eureka注册中心后,DynamicServerListLoadBalancer的初始化会产生什么变化?
ILoadBalancer原理分析
我们首先看一下ILoadBalancer的相关类图及源码。
1、ILoadBalancer相关类图:
2、ILoadBalancer接口源码
public interface ILoadBalancer {
void addServers(List<Server> var1); //新增服务
Server chooseServer(Object var1); //选择一个服务实例
void markServerDown(Server var1); //服务标记为不可用
@Deprecated
List<Server> getServerList(boolean var1); //获取服务列表
List<Server> getReachableServers(); //可用服务
List<Server> getAllServers(); //全部服务
}
DynamicServerListLoadBalancer是ILoadBalancer一个实现类,其内部实现了客户端负载的核心功能。我们通过分析它来了解客户端负载的实现原理
3、DynamicServerListLoadBalancer动态服务列表负载均衡器
首先,在DynamicServerListLoadBalance构造方法中,我们发现需要传入几个核心组件:
- IClientConfig:客户端配置,存储配置项参数
- IRule :负载均衡规则,Netflflix Ribbon实现了几个基本的负载实现,默认使用轮训规则,同时我们可以继承该接口,自定义实现负载规则
- IPing :用于判断指定服务实例是否存活
- ServerList:服务实例列表
- ServerListFilter:服务实例列表过滤器
- ServerListUpdater :服务实例列表更新器
DynamicServerListLoadBalancer部分源码: 在其构造方法中,还会调用一个restOfInit()去完成服务列表的获取和更新
// 构造方法
public DynamicServerListLoadBalancer(IClientConfig clientConfig, IRule rule, IPing ping,
ServerList<T> serverList, ServerListFilter<T> filter,
ServerListUpdater serverListUpdater) {
super(clientConfig, rule, ping);
this.serverListImpl = serverList