随机策略:在可用服务中,随机找一个,如果随机找到的server为null或者不可用,就会while不停的循环选取,直到选取可用的server
源码分析:
public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { return null; } else { 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(); // 如果没有服务,那么直接返回null if (serverCount == 0) { return null; } // 随机选取一个下标 int index = this.chooseRandomInt(serverCount); // 根据下标在可用服务集合中选取一个服务 server = (Server)upList.get(index); // 如果该服务为空,那么就重新选取 if (server == null) { Thread.yield(); } else { // 如果该服务是存活的,那么直接返回,否则重新选取 if (server.isAlive()) { return server; } // 重新选取 server = null; Thread.yield(); } } return server; } }
在读取源码时,遇到的两个疑问:
疑问1:
在选取服务时,生成随机索引,为什么不直接拿可用服务总数生成随机数index,而是拿总服务数生成随机数index,再用这个index下标在可用服务集合中拿去服务。
疑问2:
该疑问是在1的基础上衍生出的,可用服务总数小于总服务数时,拿总服务数生成随机数index可能大于可用服务总数,这时使用get方法会报错,但是在源码这块没有进行抛出异常处理。
有大佬能否解答一下!感谢!
标签:选取,index,负载,服务,策略,server,随机,return,null From: https://www.cnblogs.com/du001011/p/16816750.html