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

    <dubbo:application name="hello-world-server"  /><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="20880" /><dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="roundrobin"/><!-- 用dubbo协议在20881端口暴露服务 --><dubbo:protocol name="dubbo" port="20881" /><dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="random"/><!-- 用dubbo协议在20882端口暴露服务 --><dubbo:protocol name="dubbo" port="20882" /><dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="roundrobin"/>

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

AbstractClusterInvoker.java :

  //在consumer调用服务的入口212 public Result invoke(final Invocation invocation) throws RpcException {
213
214 checkWheatherDestoried();
215
216 LoadBalance loadbalance;
217
218 List<Invoker<T>> invokers = directory.list(invocation);
219 if (invokers != null && invokers.size() > 0) {// 在从directory中取出的所有对应的invoker中,取第一个invoker的loadbalance作为最终的均衡策略,第一个invoker取哪个,看下面的RegistryDirectory
220   loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(invokers.get(0).getUrl()
221    .getMethodParameter(invocation.getMethodName(),Constants.LOADBALANCE_KEY, Constants.DEFAULT_LOADBALANCE));
222 } else {
223   loadbalance = ExtensionLoader.getExtensionLoader(LoadBalance.class).getExtension(Constants.DEFAULT_LOADBALANCE);
224 }225226   return doInvoke(invocation, invokers, loadbalance);//使用选出的loadbalance进行调用
227 }

以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。

转载于:https://www.cnblogs.com/niulang85/p/5793900.html

dubbo 负载均衡中策略决策相关推荐

  1. cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法

    (给ImportNew加星标,提高Java技能) 作者:why技术(本文来自作者投稿) 本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版 ...

  2. Dubbo 负载均衡的实现

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

  3. hash地址_一致性Hash在负载均衡中的应用

    作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...

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

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

  5. dubbo负载均衡策略配置

    前言 在生产环境中,服务的集群部署是常有的事,从消费端来说,本身并不关注所需要的服务是由哪台机器提供,但是为了应用的健壮性和高可用性,从消费端来说,可以配置一定的负载均衡策略,确保消费端的应用能够及时 ...

  6. dubbo负载均衡代码分析1(leastactive策略)

    2019独角兽企业重金招聘Python工程师标准>>> 接上篇https://my.oschina.net/u/146130/blog/1569554 既然有集群容错,自然会有负载均 ...

  7. Java编程解密-Dubbo负载均衡与集群容错机制

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

  8. 深度解析dubbo负载均衡之接口

    本文基于dubbo v2.6.x 文章目录 1.负载均衡 2.dubbo负载均衡接口 3. dubbo负载均衡实现 4. AbstractLoadBalance 源码 5. 总结 1.负载均衡 本文我 ...

  9. dubbo负载均衡-RandomLoadBalance

    dubbo负载均衡-RandomLoadBalance 发表于 2019-10-13 前言 之前在面试中被问及dubbo的负载均衡,当时没有系统的回答出来,今天查阅了一下官方文档,于是出现了这篇文章. ...

最新文章

  1. python好学吗 小木虫-25行Python代码完成人脸识别
  2. gin使用BasicAuth()(验证)中间件
  3. 如何面对你—LNMP高并发时502
  4. 二进制蚁群算法【源码实现】
  5. OpenCASCADE绘制测试线束:简单的向量代数和测量之测量命令
  6. PyTorch深度学习实践05
  7. jvm体系结构概述_JVM体系结构:JVM和JVM体系结构概述
  8. 灰度测试试验流量“洗牌”
  9. Use JPA API
  10. Unity 移动端的复制这么写
  11. 亿图图示edraw max mac版
  12. MacOS Ventura 13.0 Beta3 (22A5295i) 带 OC 0.8.2 三分区原版黑苹果镜像
  13. 通信网络基础知识复习
  14. java 怎么去JTF边框_求助 java 如何编写JFrame窗体右上角红色打叉关闭按钮的事件?...
  15. 图论(十四)——图的着色
  16. OLAP分析引擎Druid配置文件详解(五):MiddleManager配置文件
  17. MySQL中IN和EXISTS的用法
  18. JavaScript数字运算必备库——big.js源码解析
  19. MATLAB使用git管理代码
  20. JavaScript的精华与糟粕

热门文章

  1. [云计算] 001.云计算简介
  2. ios笔记-单例文字代码详解
  3. Clojure Web 开发 (一)
  4. 【Linux】gcc + gdb 安装教程
  5. linux之dd命令
  6. Java 8 新的时间日期库java.time
  7. 201771010126 王燕《面向对象设计 java》第十五周实验总结
  8. Linux基本命令(三)-----Linux常用命令(按功能分类)
  9. .NET简谈组件程序设计之(渗入序列化过程)
  10. 学号:201621123032 《Java程序设计》第7周学习总结