AbstractLoadBalance
AbstractLoadBalance是ILoadBalancer接口的抽象实现。在该抽象类中定义了一个关于服务实例的分组枚举类ServerGroup,它包含了三种不同类型。
- ALL:所有服务实例。
- STATUS_UP:正常服务实例。
- STATUS_NOT_UP:停止服务实例。
另外还实现了一个chooseServer()函数,该函数通过调用接口中的chooseServer(Object key)实现,其中参数为null,表示在选择具体的服务实例的时候忽略key的条件判断。
最后还定义了两个抽象函数: - getServerList(ServerGroup serverGroup):定义了根据分组类型来获取不同的服务实例的列表。
- getLoadBalancerStats():定义了获取LoadBalancerStats对象的方法,LoadBalancerStats对象用来存储负载均衡器中各个服务实例当前的属性和统计信息。我们可以利用这些信息来观察负载均衡器的运行情况,同事这些信息也是用来制定负载均衡器策略的重要依据。
public abstract class AbstractLoadBalancer implements ILoadBalancer {
public enum ServerGroup{
ALL,
STATUS_UP,
STATUS_NOT_UP
}
/**
* delegate to {@link #chooseServer(Object)} with parameter null.
*/
public Server chooseServer() {
return chooseServer(null);
}
/**
* List of servers that this Loadbalancer knows about
*
* @param serverGroup Servers grouped by status, e.g., {@link ServerGroup#STATUS_UP}
*/
public abstract List<Server> getServerList(ServerGroup serverGroup);
/**
* Obtain LoadBalancer related Statistics
*/
public abstract LoadBalancerStats getLoadBalancerStats();
}
BaseLoadBalancer
BaseLoadBalancer类是Ribbon负载均衡器的基础实现类,在该类中定义了很多关于服务在均衡器相关的基础内容。
- 定义并维护了两个存储服务实例的server对象的列表。一个用于存储所有服务实例的列表,一个用于存储正常服务的实例列表。
@Monitor(name = PREFIX + "AllServerList", type = DataSourceType.INFORMATIONAL)
protected volatile List<Server> allServerList = Collections
.synchronizedList(new ArrayList<Server>());
@Monitor(name = PREFIX + "UpServerList", type = DataSourceType.INFORMATIONAL)
protected volatile List<Server> upServerList = Collections
.synchronizedList(new ArrayList<Server>());
- 定义了用来存储负载均衡器各服务实例属性和统计信息的LoadBalancerStats对象。
- 定义了检车服务实例是否正常服务的IPing对象。在BaseLoadBalancer中默认为null,需要在构造时注入它的具体实现。
- 定义了检查服务实例操作的执行策略对象IPingStrategy,在BaseLoadBalancer中默认使用了该类中定义的静态内部类SerialPingStrategy实现。
- 定义了负载均衡的处理规则IRule对象,从BaseLoadBalancer中chooseServer(Object key)的实现源码可以看出,负载均衡器实际将服务实例选择任务委托给了IRule实例中的choose函数来实现,而在这里默认初始化了RoundRobinRule为IRule的实现对象。RoundRobinRule实现了最基本且常用的线性负载均衡规则。
public Server chooseServer(Object key) {
if (counter == null) {
counter = createCounter();
}
counter.increment();
if (rule == null) {
return null;
} else {
try {
return rule.choose(key);
} catch (Exception e) {
logger.warn("LoadBalancer [{}]: Error choosing server for key {}", name, key, e);
return null;
}
}
}
- 启动ping任务:在BaseLoadBalancer的默认构造函数中,会直接启动一个用于定时检查Server是否健康的任务。该任务默认的执行时间是10秒。
- 实现了ILoadBalancer接口定义的负载均衡器应具备以下一系列基本操作。
- addServers:想负载均衡器中增加新的服务实例列表,该实现将原本已经维护着的所有服务实例清单allServerList和新传入的服务实例清单newServers都加入到newList中,然后通过调用setServersList函数对newList进行处理,在BaseLoadBalancer中实现的时候会使用新的列表覆盖旧的列表。
public void addServer(Server newServer) {
if (newServer != null) {
try {
ArrayList<Server> newList = new ArrayList<Server>();
newList.addAll(allServerList);
newList.add(newServer);
setServersList(newList);
} catch (Exception e) {
logger.error("LoadBalancer [{}]: Error adding newServer {}", name, newServer.getHost(), e);
}
}
}
- chooseServer(Object key):挑选一个具体的服务实例。
- markServerDown(Server server):标记某个服务实例暂停服务。
public void markServerDown(Server server) {
if (server == null || !server.isAlive()) {
return;
}
logger.error("LoadBalancer [{}]: markServerDown called on [{}]", name, server.getId());
server.setAlive(false);
// forceQuickPing();
notifyServerStatusChangeListener(singleton(server));
}
- getReachableServers():获取可用的服务实例列表。
public List<Server> getReachableServers() {
return Collections.unmodifiableList(upServerList);
}
- getAllServers():获取所有的服务实例列表。
public List<Server> getAllServers() {
return Collections.unmodifiableList(allServerList);
}
DynamicServerListLoadBalancer
DynamicServerLIstLoadBalancer类继承于BaseLoadBalancer类,它是对基础负载均衡器的扩展。在该负载均衡器中,实现了服务实例清单在运行期的动态更新能力;同时它还具备了对服务实例清单的过滤功能,也就是说,我们可以通过过滤器来选择性的获取一批服务实例清单。
ServerList
从DynamicServerListLoadBalancer的成员定义中,可以发现增加了一个服务列表的操作对象ServerList<T> serverListImpl。其中泛型T从类名中对于T的限定DynamicServerListBalancer<T extends Server> 可以看出它是一个Server的子类,即代表了一个具体的服务实例的扩展类。
public interface ServerList<T extends Server> {
public List<T> getInitialListOfServers();
/**
* Return updated list of servers. This is called say every 30 secs
* (configurable) by the Loadbalancer's Ping cycle
*
*/
public List<T> getUpdatedListOfServers();
}
- getInitialListOfServers():用于获取初始化的服务实例清单。
- getUpdatedListOfServers():用于获取更新的服务实例清单。