关于Dubbo源码的研究(一:负载均衡)

本文深入探讨了阿里巴巴开源的Dubbo服务框架,重点在于其负载均衡功能。文章介绍了Dubbo的核心组件,包括远程通讯、服务集群和注册中心。详细解析了dubbo-cluster子工程的结构,特别是负载均衡接口及其四种实现策略:random(权重随机)、roundrobin(轮询)、leastactive(最少活跃连接数)和consistentHash(一致性哈希)。每种策略的实现原理和效果进行了阐述。
摘要由CSDN通过智能技术生成

1.Dubbo概述

Dubbo是阿里巴巴开源出来的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的方案。它的核心功能包括:

#remoting:远程通讯基础,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。

#Cluster: 服务框架核心,提供基于接口方法的远程过程调用,包括多协议支持,并提供软负载均衡和容错机制的集群支持。

#registry: 服务注册中心,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。


2. dubbo-master的目录结构


3.dubbo-cluster子工程

其中负载均衡功能就在dubbo-cluster工程中,而该工程的结构如图:


名字就可以看出来LoadBalance接口为负载均衡的功能,齐实现的结构如下图:


最终的四个实现为dubbo的四种负载均衡的策略,再其中的抽象实现类中实现了权重的获取:

protected int getWeight(Invoker<?> invoker, Invocation invocation) {
    int weight = invoker.getUrl().getMethodParameter(invocation.getMethodName(), Constan		ts.WEIGHT_KEY, Constants.DEFAULT_WEIGHT);
    if (weight > 0) {
     long timestamp = invoker.getUrl().getParameter(Constants.TIMESTAMP_KEY, 0L);
     if (timestamp > 0L) {
      	int uptime = (int) (System.currentTimeMillis() - timestamp);
      	int warmup = invoker.getUrl().getParameter(Constants.WARMUP_KEY, Constants.DEFAU			LT_WARMUP);
      	if (uptime > 0 && uptime < warmup) {
         	weight = calculateWarmupWeight(uptime, warmup, weight);
      	}
     }
    }
   return weight;
}

当启动时间小于预热时间时,需要减少权重;其他则按照默认给定的权重来算。

4.四种负载均衡策略

一)random

在权重不同时按照权重来随机分配,如果权重相同按照provider的数量进行随机分配

二)roundrobin

利用int变量++后的值取余集群数,达到轮询的效果

三)leastactive

获取providers的连接数,筛选出最少连接的provide集合

int[] leastIndexs = new int[length]; // 相同最小活跃数的下标

如果只有一个直接返回,大于一个使用随机算法从该数组中取

四)consistentHash

hash一致性算法调度,根据参数计算得到一个provider


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值