美文网首页
dubbo 负载均衡默认的方案

dubbo 负载均衡默认的方案

作者: Ngcc | 来源:发表于2018-02-07 13:09 被阅读0次

    本文适用于dubbo初级学者;

    dubbo 负载均衡默认的方案;

    当采用集群方案时,会调用com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke;

    该方法内部默认的自适应扩展负载均衡方案是loadbalance=random,具体策略实现如下;

    failover 集群重试策略是如何确定备选可用invokers的,下一篇文章我们分析。

    
    public class RandomLoadBalance extends AbstractLoadBalance {
    
        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 (Invoker invoker : invokers) {
    
                    offset -= getWeight(invoker, invocation);
    
                    if (offset < 0) {
    
                        return invoker;
    
                    }
    
                }
    
            }
    
            // 如果权重相同或权重为0则均等随机
    
            return invokers.get(random.nextInt(length));
    
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:dubbo 负载均衡默认的方案

          本文链接:https://www.haomeiwen.com/subject/fmiozxtx.html