上文我们分析到 loadBalancer 根据具体的算法选择相应的server。
protected Server getServer(ILoadBalancer loadBalancer) { if (loadBalancer == null) { return null; } return loadBalancer.chooseServer("default"); // TODO: better handling of key }
loadBalancer是定义软件负载均衡器操作的接口,共有以下几个实现类

本文便从loadBalancer开始分析ribbon具体的负载均衡策略
LoadBalancer
首先看AbstractLoadBalancer 定义了几个基础的方法
public abstract class AbstractLoadBalancer implements ILoadBalancer { public enum ServerGroup{ //所有服务实例 ALL, //正常服务的实例 STATUS_UP, //停止服务的实例 STATUS_NOT_UP } /** * 选择具体的服务实例,key为null,忽略key的条件判断 */public Server chooseServer() { return chooseServer(null); } /** * 定义了根据分组类型来获取不同的服务实例的列表。 */ public abstract List<Server> getServerList(ServerGroup serverGroup); /** * 定义了获取LoadBalancerStats对象的方法,LoadBalancerStats对象被用来存储负载均衡器中 * 各个服务实例当前的属性和统计信息。这些信息非常有用,我们可以利用这些信息来观察负载均衡 * 的运行情况,同时这些信息也是用来制定负载均衡策略的重要依据。 */public abstract LoadBalancerStats getLoadBalancerStats(); }
再看BaseLoadBalancer
BaseLoadBalancer定义了两个数组分别用来缓存所有服务实例和正常服务实例
@Monitor(name = PREFIX + "AllServerList", type = DataSourceType.INFORMATIONAL) protected volatile List<Server> allServerList = Collections .synchronizedList(new ArrayList<Server>()); @Monitor(name = PREFIX + "UpServerList", type = DataSourceType.INFORMATIONAL)

