Dubbo框架学习-负载均衡

本文介绍了Dubbo框架中的负载均衡机制,包括随机、轮询、最少连接数和一致性Hash四种方式。默认策略为随机选择。负载均衡在消费者侧通过Invocation、URL和Invoker列表,使用模板方法设计模式来实现。文章还提到了负载均衡的类图结构,展示了如何通过AbstractLoadBalance抽象类和四个具体实现类完成策略选择。
摘要由CSDN通过智能技术生成

####负载概述####

  1. dubbo中的负载均衡机制主要有4种方式,分别是随机,轮训,最少连接数,一致性hash。其中默认情况下,dubbo采用随机方式进行负载。
  2. dubbo中的负载均衡就是从多个Invoker列表中选择一个可执行的Invoker。集群中的每一个provider都是一个Invoker。
  3. consumer根据Invocation,url,List三个参数,采用不同的算法进行选择。
    ####集群类图####
    dubbo中的负载类图如下:
    这里写图片描述
  4. dubbo中的负载均衡采用模板方法方式设计,其中接口LoadBalance定义了选取Ivnvoker的策略,根据Invocation,url,List选择出一个合适的Invoker。其中声明了方法如下:
<T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation)
  1. AbstractLoadBalance抽象类,实现了select方法,该方法内部又将具体的每种负载策略实现,转接给具体的实现类,即上述类图中的4个实现类。
public abstract class AbstractLoadBalance implements LoadBalance {

    static int calculateWarmupWeight(int uptime, int warmup, int weight) {
        int ww = (int) ((float) uptime / ((float) warmup / (float) weight));
        return ww < 1 ? 1 : (ww > weight ? weight : ww);
    }

 public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) {
        if (invokers == null || invokers.size() == 0)
            return null;
        if (invokers.size() == 1)
            return invokers.get(0);
        // 调用模板方法
        return doSelect(invokers, url, invocation);
    }

// 具体选择哪个Invoker的算法由子类具体实现
 protected abstract <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation);

/** 计算每个Invoker的权重,集群中的每一个provider都是一个Invoker,
 ** 每一个provider可以在服务端设置权重,即consumer在进行选择Inovker时
 ** 要计算每一个invoker的权重,从而选择出更合适的invoker
 **/
 protected int getWeight(Invoker<?> invoker, Invocation invocation) {
        int weight = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constants.WEIGHT_KEY, Constants.DEFAULT_WEIGHT);
        if (weight > 0) {
            long timestamp = invoker.getUrl().getParameter(Constants.REMOTE_TIMESTAMP_KEY, 0L);
            if (timestamp > 0L) {
                int uptime = (int) (System.currentTimeMillis() - timestamp);
                int warmup = invoker.getUrl().getParameter(Constants.WARMUP_KEY, Constants.DEFAULT_WARMUP);
                if (uptime > 0 && uptime < warmup) {
                    weight = calculateWarmupWeight(uptime, warmup, weight);
                }
            }
        }
        return weight;
    }

}
  1. 具体的实现算法类,可以根据源码去具体分析。再这儿就不分析了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值