IRule是选择服务的一种策略。
- <李>
<强> IRule 强>
李>public interface IRule { ,,/* ,,,,*,choose one alive server 得到lb.allServers 或 ,,,,*,lb.upServers according 用钥匙 ,,,,*, ,,,,*,@return choosen Server 对象只NULL is returned if 没有 ,,,,*,,server is available ,,,*/,,,public Server 选择(Object 键); ,,,, ,,,public void setLoadBalancer (ILoadBalancer 磅); ,,,, ,,,public ILoadBalancer getLoadBalancer (),,,,, }
选择选择可用的服务。
- <李>
<强> RandomRule 强>
随机选择一个向上的服务。
Random 兰德,,//,随机计数器 public RandomRule (), { ,,,rand =, new 随机(); } public Server 选择(ILoadBalancer 磅,Object 键),{ ,,,… ,,,, ,,,List, upList =, lb.getReachableServers (); ,,,List , allList =, lb.getAllServers (); ,,,, ,,,int index =, rand.nextInt (serverCount);,//,随机选择一个 ,,,server =, upList.get(指数); ,,,, ,,,… }
- <李>
<强> RoundRobinRule 强>
轮询获取服务。
public RoundRobinRule (), { ,,,nextServerCyclicCounter =, new AtomicInteger (0);//, int线程安全计数器 } public Server 选择(ILoadBalancer 磅,Object 键),{ ,, ,,… ,,,, ,,int nextServerIndex =, incrementAndGetModulo (serverCount);,//, nextServerCyclicCounter依次向后获取服务又是; ,,server =, allServers.get (nextServerIndex); ,, ,,… }//,轮询方法 private int  incrementAndGetModulo (int 模),{ ,,,for (,), { ,,,,,,,int current =, nextServerCyclicCounter.get (); ,,,,,,,int next =,(时间+ current 1), %,模; ,,,,,,,if (nextServerCyclicCounter.compareAndSet(目前,,下一个)) ,,,,,,,,,,,return 下; ,,,} }
- <李>
<强> BestAvailableRule 强>
李>跳过熔断的服务,获取请求数最少的服务,通常与<强> ServerListSubsetFilter 强>一起使用。
public Server 选择(Object 键),{ ,,,if (loadBalancerStats ==, null), { ,,,,,,,return super.choose(关键);,//,如果没有loadBalancerStats,则采用RoundRibonRule。 ,,,} ,,,List, serverList =, getLoadBalancer () .getAllServers (); ,,,int minimalConcurrentConnections =, Integer.MAX_VALUE; ,,,long currentTime =, System.currentTimeMillis (); ,,,Server chosen =,空; ,,,for (Server 服务器:,一旦),{ ,,,,,,,ServerStats ServerStats =, loadBalancerStats.getSingleServerStat(服务器); ,,,,,,,if (! serverStats.isCircuitBreakerTripped (currentTime)), { ,,,,,,,,,,,int concurrentConnections =, serverStats.getActiveRequestsCount (currentTime); ,,,,,,,,,,,if (concurrentConnections & lt;, minimalConcurrentConnections), { ,,,,,,,,,,,,,,,minimalConcurrentConnections =, concurrentConnections; ,,,,,,,,,,,,,,,chosen =,服务器; ,,,,,,,,,,,} ,,,,,,,} ,,,} null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null 带之IRule