dubbo负载均衡算法

dubbo的负载均衡算法有4种:

dubbo负载均衡算法_第1张图片

随机(RandomLoadBalance)

随机算法里面还包含设置的权重,假如有四个节点:A、B、C;如果权重一样,则随机选择一个即可:

 // 如果权重相同或权重为0则均等随机
 return invokers.get(random.nextInt(length));

如果设置了权重:A(20%)、B(30%)、C(50%)

  • A,权重weight=2
  • B,权重weight=3
  • C,权重weight=5

这些服务器totalWeight = AWeight + BWeight + CWeight = 10。这样生成10以内的随机数

  • [0, 2):属于服务器A
  • [2, 5):属于服务器B
  • [5, 10):属于服务器C
  •  public static final String NAME = "random";
    
        private final Random random = new Random();
    
        protected  Invoker doSelect(List> invokers, URL url, Invocation invocation) {
            int length = invokers.size(); // 总个数
            int totalWeight = 0; // 总权重
            boolean sameWeight = true; // 权重是否都一样
            for (int i = 0; i < length; i++) {
                int weight = getWeight(invokers.get(i), invocation);
                totalWeight += weight; // 累计总权重
                if (sameWeight && i > 0
                        && weight != getWeight(invokers.get(i - 1), invocation)) {
                    sameWeight = false; // 计算所有权重是否一样
                }
            }
            if (totalWeight > 0 && ! sameWeight) {
                // 如果权重不相同且权重大于0则按总权重数随机
                int offset = random.nextInt(totalWeight);
                // 并确定随机值落在哪个片断上
                for (int i = 0; i < length; i++) {
                    offset -= getWeight(invokers.get(i), invocation);
                    if (offset < 0) {
                        return invokers.get(i);
                    }
                }
            }
            // 如果权重相同或权重为0则均等随机
            return invokers.get(random.nextInt(length));
        }
    

轮询(RoundRobinLoadBalance)

hash值(ConsistentHashLoadBalance)

最小活跃数(LeastActiveLoadBalance)

你可能感兴趣的:(负载均衡,算法,运维,dubbo)