Ribbon 自定义负载均衡策略

Ribbon默认的负载均衡策略默认的有下面几种:
Ribbon 自定义负载均衡策略_第1张图片
我们也可以自定义负载均衡策略:
修改springcloud-consumer-dept-80的主启动类:
Ribbon 自定义负载均衡策略_第2张图片
下面开始编写自定义配置类MySelfRule,但这个类不能乱放!

官方文档给出警告:
这个自定义的类不能放在@ComponentScan所扫描的当前包以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是我们达不到特殊化指定的目的了。

新建包编写MySelfRule类:
Ribbon 自定义负载均衡策略_第3张图片
自定义算法RandomRule_ZY 如下:

 public class RandomRule_ZY extends AbstractLoadBalancerRule
{
 // total = 0 // 当total==5以后,我们指针才能往下走,
 // index = 0 // 当前对外提供服务的服务器地址,
 // total需要重新置为零,但是已经达到过一个5次,我们的index = 1
 // 分析:我们5次,但是微服务只有8001 8002 8003 三台,OK?

 private int total = 0;    // 总共被调用的次数,目前要求每台被调用5次
 private int currentIndex = 0; // 当前提供服务的机器号

public Server choose(ILoadBalancer lb, Object key)
{
  if (lb == null) {
   return null;
  }
  Server server = null;
  while (server == null) {
   if (Thread.interrupted()) {
    return null;
   }

   List upList = lb.getReachableServers();
   List allList = lb.getAllServers();
   int serverCount = allList.size();
   if (serverCount == 0) {
    return null;
   }
 if(total < 5)
            {
             server = upList.get(currentIndex);
             total++;
            }else {
              total = 0;
             currentIndex++;
             if(currentIndex >= upList.size())
             {
               currentIndex = 0;
             }
            } 
 if (server == null) {
    Thread.yield();
    continue;
   }
 if (server.isAlive()) {
    return (server);
   }  
   server = null;
   Thread.yield();
   }
   return server;
   }
@Override
 public Server choose(Object key)
 {
  return choose(getLoadBalancer(), key);
 }

@Override
 public void initWithNiwsConfig(IClientConfig clientConfig)
 {
 }
 }             

自定义算法RandomRule_ZY 必须继承AbstractLoadBalanceRule类

启动springcloud-eureka-7001,7002,7003,8001,8002,8003,80 电脑惨叫的声音。。。
测试发现,此时的负载均衡策略,就是我们自定义的负载均衡策略!

github :https://github.com/XiaoMaKui/test2

你可能感兴趣的:(springcloud)