dubbo 负载均衡默认的方案

本文适用于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));

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。