一、简介
Ribbon是Netflix出品的一套负载均衡组件,提供了许多Rule规则从负载均衡列表中选取合适的server实例。当实例出现问题时候,Ribbon本身具有自动移除问题实例的功能。
二、核心组件介绍
1.ILoadBalancer
它是定义负载均衡选择服务的核心方法的接口,它的默认实现类是ZoneAwareLoadBalancer,它的核心方法如下:
package com.netflix.loadbalancer;
import java.util.List;
public interface ILoadBalancer {
public void addServers(List<Server> newServers);
//选择一个服务
public Server chooseServer(Object key);
public void markServerDown(Server server);
@Deprecated
public List<Server> getServerList(boolean availableOnly);
public List<Server> getReachableServers();
//获取所有服务列表
public List<Server> getAllServers();
}
2.IRule
定义Ribbon中负载均衡策略的接口,它的默认实现类是ZoneAvoidanceRule,它是基于ZoneAvoidancePredicate计算出哪个Zone的服务最差,然后从服务列表剔除,AvailabilityPredicate是过滤掉正在处于熔断状态的服务,上述两个断言过滤出来的服务再通过轮询方式从服务获取一个。
除了这个类,还有一个实现类是RandomRule它是一个随机的负载均衡策略的实现,即从多个服务器中随机获取一个服务实例。
另一个实现类是RoundRobinRule,它是轮询的机制,每个服务实例都同等被调用,在选择过程中最多有10次的重试机制。
3.IClientConfig
定义Ribbon中管理管理配置的接口,例如指定Ribbon客户端的连接超时时间、读取超时时间等等,默认实现类是DefaultClientConfigImpl。
4.IPing
检查服务是否可用的方法,常见的是通过HTTP、TCP方式。
5.ServerList
维护着一组Server实例列表,在应该程序运行过程中,Ribbon通过ServerList中的服务实例供负载均衡选择,ServerList维护的实例列表可能在运行过程中发生动态变化。
ServerList提供了两个重要方法,代码如下:
package com.netflix.loadbalancer;
import java.util.List;
public interface ServerList<T extends Server> {
//第一次获取的Server列表
public List<T> getInitialListOfServers();
//更新Server列表
public List<T> getUpdatedListOfServers();
}
6.ServerListUpdater
ServerListUpdater有多个方法,其中有个start方法开启定时任务调用UpdateAction来更新服务实例列表,它的实现类是PollingServerListUpdater,此对象会启动一个定时线程池定时执行更新策略,当服务有新的实例添加进来会动态更新。
三、工作流程
下面是一张Ribbon简单的执行流程图:
流程先从ILoadBalancer执行开始,选择服务实例过程如下
1.通过ServerList获取当前可用的服务实例列表。
2.通过ServerListFilter将步骤1获取的服务实例进行一次过滤返回满足条件的服务实例列表。
3.通过IRule规则,结合服务实例的统计信息,返回满足条件的某一个服务实例。
总结:
本篇主要简单的介绍一下Ribbon的概念和核心组件的作用以及它们执行的执行流程,下一篇文章开始我将开始分析SpringBoot整合Ribbon的源码,可以一步步看出这些核心组件是怎么加载到容器中的,又是怎么相互调用返回可用的服务实例列表,好了,我是爱编程的程序员老徐,如果喜欢我的文章请点赞,我们下期见