记录一下!轮询机制。。。。
代码如下:
public class RandomRule extends AbstractLoadBalancerRule {
//重新父类方法,使用本类的choose方法获取对应的服务
@Override
public Server choose(Object key) {
return this.choose(getLoadBalancer(), key);
}
private static int serverIndex = 0;//server 下表
private static int count = 0;//轮询规则计数器 5次一轮询
private 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) {
/*
* No servers. End regardless of pass, because subsequent passes
* only get more restrictive.
*/
return null;
}
int index = chooseRandomInt(serverCount);
server = upList.get(index);
if (server == null) {
/*
* The only time this should happen is if the server list were
* somehow trimmed. This is a transient condition. Retry after
* yielding.
*/
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
Thread.yield();
}
return server;
}
protected int chooseRandomInt(int serverCount) {
//计数器加一
count++;
//判断计数器 是否大于五 大于则使 计数器归零 并使服务下标加一
if (count > 5) {
count = 0;
serverIndex++;
}
//使服务下标归零
if (serverIndex == serverCount) {
serverIndex = 0;
}
return serverIndex;
}
//重新父类方法,加载其他配置时需要
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
我是根据github 修改的 当然可与去看看 github 原码 参考源码新建一个符合我们需求的类