- RoundRobinRule:轮询策略 默认
- RandomRule:随机策略
- WeightedResponseTimeRule:加权策略,根据响应时间分配权重的方式,响应越快分配的值越大。
- BestAvailableRule:请求数最少策略,选择并发量最小的服务器分配。
- RetryRule:在配置时间段内选择server不成功,使用subRule方式选择可用的Server。
- ZoneAvoidanceRule:根据服务器的性能和可用性来选择。
- AvailabilityFilteringRule:过滤掉那些因为连接失败的后端server和高并发的后端server。
随机方式算法代码实现
/**
* 从所有活服务器中随机选择
*/
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
}
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
List<Server> upList = lb.getReachableServers();//只有启动并可访问的服务器。
List<Server> allList = lb.getAllServers();//所有已知的服务器,包括可达的和不可达的。
int serverCount = allList.size();
if (serverCount == 0) {
//没有服务器。不管是否通过,结束,因为后续的传递只会有更多的限制。
return null;
}
//使用jdk内部的Random类随机获取索引值index
int index = chooseRandomInt(serverCount);
//得到服务器实例
server = upList.get(index);
if (server == null) {
/*
* 只有在服务器列表被修改时才会发生这种情况。这是一种暂态状态。屈服后重试。
*/
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
//真的不应该发生。但肯定是暂时的,或者是错误。
server = null;
Thread.yield();
}
return server;
}