带之IRule

  

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