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));

    }

}

你可能感兴趣的:(dubbo 负载均衡默认的方案)