// 负载均衡策略类核⼼⽅法 public Server choose(ILoadBalancer lb, Object key) { if (lb == null) { log.warn("no load balancer"); returnnull; } else { Serverserver=null; intcount=0; while (true) { if (server == null && count++ < 10) { // 所有可⽤服务实例列表 List<Server> reachableServers = lb.getReachableServers(); // 所有服务实例列表 List<Server> allServers = lb.getAllServers(); intupCount= reachableServers.size(); intserverCount= allServers.size(); if (upCount != 0 && serverCount != 0) { // 获得⼀个轮询索引 intnextServerIndex=this.incrementAndGetModulo(serverCount); // 根据索引取出服务实例对象 server = (Server) allServers.get(nextServerIndex); if (server == null) { Thread.yield(); } else { // 判断服务可⽤后返回 if (server.isAlive() && server.isReadyToServe()) { return server; } server = null; } continue; } log.warn("No up servers available from load balancer:" + lb); returnnull; } if (count >= 10) { log.warn("No available alive servers after 10 tries from load balancer:" + lb); } return server; } } }
privateintincrementAndGetModulo(int modulo) { int current; int next; do { // 取出上次的计数 current = this.nextServerCyclicCounter.get(); // 因为是轮询,计数+1之后对总数取模 next = (current + 1) % modulo; } while (!this.nextServerCyclicCounter.compareAndSet(current, next)); return next; }
public Server choose(Object key) { returnthis.choose(this.getLoadBalancer(), key); }