在dubbo中的服务端负载均衡配置,如果像以下情况,将需要决策最终的负载策略问题:

  1. <dubbo:application name="hello-world-server" />
  2.   
  3. <!-- 用dubbo协议在20880端口暴露服务 -->
  4. <dubbo:protocol name="dubbo" port="20880" />
  5.  
  6. <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="roundrobin"/>
  7.  
  8. <!-- 用dubbo协议在20881端口暴露服务 -->
  9. <dubbo:protocol name="dubbo" port="20881" />
  10. <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="random"/>
  11.  
  12.   <!-- 用dubbo协议在20882端口暴露服务 -->
  13. <dubbo:protocol name="dubbo" port="20882" />
  14.  
  15. <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="roundrobin"/>

在dubbo中是怎么解决这个问题的呢?

AbstractClusterInvoker.java :

  1.   //在consumer调用服务的入口
    212 public Result invoke(final Invocation invocation) throws RpcException {
  2.  
  3. checkWheatherDestoried();
  4.  
  5. LoadBalance loadbalance;
  6.  
  7. List<Invoker<T>> invokers = directory.list(invocation);
  8. if (invokers != null && invokers.size() > 0) {
  9.    // 在从directory中取出的所有对应的invoker中,取第一个invoker的loadbalance作为最终的均衡策略,第一个invoker取哪个,看下面的RegistryDirectory
  10.   loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(invokers.get(0).getUrl()
  11. 221    .getMethodParameter(invocation.getMethodName(),Constants.LOADBALANCE_KEY, Constants.DEFAULT_LOADBALANCE));
  12. } else {
  13.   loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(Constants.DEFAULT_LOADBALANCE);
  14. }
  15.  
  16.   return doInvoke(invocation, invokers, loadbalance);//使用选出的loadbalance进行调用
  17. }

以Registry Directory 为例, client 端的 RegistryDirectory.java:

  1. public class RegistryDirectory<T> extends AbstractDirectory<T> implements NotifyListener {
  2. //provider变动时更新方法映射
  3. private void refreshInvoker(List<URL> invokerUrls){
  4. ...
  5. Map<String, List<Invoker<T>>> newMethodInvokerMap = toMethodInvokers(newUrlInvokerMap); // 换方法名映射Invoker列表
  6. }
  7.  
  8. .....
  9. private Map<String, List<Invoker<T>>> toMethodInvokers(Map<String, Invoker<T>> invokersMap) {
  10.  
  11. // sort and unmodifiable
  12. for (String method : new HashSet<String>(newMethodInvokerMap.keySet())) {
  13. List<Invoker<T>> methodInvokers = newMethodInvokerMap.get(method);
  14. Collections.sort(methodInvokers, InvokerComparator.getComparator());//以provider的URL字母表排序
  15. newMethodInvokerMap.put(method, Collections.unmodifiableList(methodInvokers));
  16. }
  17. return Collections.unmodifiableMap(newMethodInvokerMap);
  18. }
  19.  
  20. }

结论:当有多个provider配置了不同的loadbalance策略时,最终会以provider的url的字母排序第一个provider对应的loadbalance策略作为最终的负载均衡策略。

例如 providers 如下:

dubbo://192.168.1.102:20880/com.alibaba.dubbo.demo.DemoService?......loadbalance=roundrobin&methods=sayHello....

dubbo://192.168.1.102:20881/com.alibaba.dubbo.demo.DemoService?.....loadbalance=random&methods=sayHello....

最终的loadbalance为roundrobin。

dubbo 负载均衡中策略决策的更多相关文章

  1. Dubbo负载均衡与集群容错机制

    1  Dubbo简介 Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 作为一个轻量级RPC框架,D ...

  2. 一文讲透Dubbo负载均衡之最小活跃数算法

    本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版本. 为什么没有用截止目前的最新的版本号2.7.4.1呢?因为2.6.0这个版本里面有两 ...

  3. Dubbo 负载均衡的实现

    前言 负载均衡是指在集群中,将多个数据请求分散在不同单元上进行执行,主要为了提高系统容错能力和加强系统对数据的处理能力. 在 Dubbo 中,一次服务的调用就是对所有实体域 Invoker 的一次筛选 ...

  4. zookeeper在集群负载均衡中的应用

    zookeeper本身是不提供负载均衡的策略,需要自己来实现,所以这里确切的说,是在负载均衡中应用到了zookeeper做集群的协调. 对于HTTP请求的负载均衡,成熟的解决方案是Nginx(或Hap ...

  5. 负载均衡中的session保持

    什么叫负载均衡中的session保持 当我们需要做负载均衡时,服务端肯定有多台服务器,用户每次请求进来,会根据负载均衡算法被分配到某一台机器上,假设用户需要进行一段连续操作时,在第一台机器登陆后,下一 ...

  6. dubbo负载均衡策略和集群容错策略都有哪些

    dubbo负载均衡策略 random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权 ...

  7. 负载均衡中使用 Redis 实现共享 Session

    最近在研究Web架构方面的知识,包括数据库读写分离,Redis缓存和队列,集群,以及负载均衡(LVS),今天就来先学习下我在负载均衡中遇到的问题,那就是session共享的问题. 一.负载均衡 负载均 ...

  8. 云计算之路-Azure vs 阿里云:从负载均衡中摘/挂虚拟机

    @小尾鱼 在 试用Azure:上不了高速的跑车,无法跨Cloud Service的DNS服务器一文的评论中提了一个很好的问题: 问个问题,使用了负载均衡以后,程序发布的时候博客园是怎么避免用户访问到正 ...

  9. dubbo负载均衡策略和集群容错策略

    dubbo负载均衡策略 random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权 ...

随机推荐

  1. linux使用FIO测试磁盘的iops 【转载】

     linux使用FIO测试磁盘的iops 2013-09-23 10:59:21 分类: LINUX FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括 ...

  2. ASP.NET多线程下使用HttpContext.Current为null解决方案

    多线程或者异步调用中如何访问HttpContext? 前面我还提到在APM模式下的异步完成回调时,访问HttpContext.Current也会返回null,那么此时该怎么办呢? 答案有二种:1. 在 ...

  3. HDU 1242 rescue and 优先级队列的条目

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...

  4. C# - 类型

    C#是一门使用OOP技术的编程语言(Object Oriented Programming 面向对象编程)面向对象最重要的特性就是接口.继承.多态 C#中所有的事物都可以看做是一个对象 对象由类型来创 ...

  5. stackoverflow上关于iOS的票数最多(最常见)的15个问题

    搞编程做项目的,没碰到bug.遇到问题,基本不可能.stackoverflow就是一个大型的开放的FAQ平台,你是问题制造者,也是答案提供者.本文列出至今stackoverflow上关于iOS的票数最 ...

  6. CentOS7安装vim7.4

    卸载自带vim yum remove vim-enhanced vim-common 下载vim包 wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz ...

  7. CentOS 6.7平台nginx压力测试(ab/webbench)

    压力测试工具一:webbench 1.安装 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz tar zxvf w ...

  8. modelsim命令行仿真提示“vsim 不是内部或外部命令,也不是可运行的程序或批处理文件”的解决办法

    安装完modelsim后,用过命令行模式仿真,如“vsim -c -do run.do”,开始时是可以的. 后来偶然再用该仿真方式,发现命令行提示“vsim 不是内部或外部命令,也不是可运行的程序或批 ...

  9. datebox清除按钮,datebox加上清除按钮,easyui datebox加上清除按钮

    datebox加上清除按钮,easyui datebox加上清除按钮 >>>>>>>>>>>>>>>>& ...

  10. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...