dubbo 负载均衡中策略决策
在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 负载均衡中策略决策相关推荐
- cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法
(给ImportNew加星标,提高Java技能) 作者:why技术(本文来自作者投稿) 本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版 ...
- Dubbo 负载均衡的实现
前言 负载均衡是指在集群中,将多个数据请求分散在不同单元上进行执行,主要为了提高系统容错能力和加强系统对数据的处理能力. 在 Dubbo 中,一次服务的调用就是对所有实体域 Invoker 的一次筛选 ...
- hash地址_一致性Hash在负载均衡中的应用
作者:marklux 原文:http://marklux.cn/blog/90 简介 一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和 ...
- 一文讲透Dubbo负载均衡之最小活跃数算法
本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版本. 为什么没有用截止目前的最新的版本号2.7.4.1呢?因为2.6.0这个版本里面有两 ...
- dubbo负载均衡策略配置
前言 在生产环境中,服务的集群部署是常有的事,从消费端来说,本身并不关注所需要的服务是由哪台机器提供,但是为了应用的健壮性和高可用性,从消费端来说,可以配置一定的负载均衡策略,确保消费端的应用能够及时 ...
- dubbo负载均衡代码分析1(leastactive策略)
2019独角兽企业重金招聘Python工程师标准>>> 接上篇https://my.oschina.net/u/146130/blog/1569554 既然有集群容错,自然会有负载均 ...
- Java编程解密-Dubbo负载均衡与集群容错机制
1 Dubbo简介 Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 作为一个轻量级RPC框架,Du ...
- 深度解析dubbo负载均衡之接口
本文基于dubbo v2.6.x 文章目录 1.负载均衡 2.dubbo负载均衡接口 3. dubbo负载均衡实现 4. AbstractLoadBalance 源码 5. 总结 1.负载均衡 本文我 ...
- dubbo负载均衡-RandomLoadBalance
dubbo负载均衡-RandomLoadBalance 发表于 2019-10-13 前言 之前在面试中被问及dubbo的负载均衡,当时没有系统的回答出来,今天查阅了一下官方文档,于是出现了这篇文章. ...
最新文章
- python好学吗 小木虫-25行Python代码完成人脸识别
- gin使用BasicAuth()(验证)中间件
- 如何面对你—LNMP高并发时502
- 二进制蚁群算法【源码实现】
- OpenCASCADE绘制测试线束:简单的向量代数和测量之测量命令
- PyTorch深度学习实践05
- jvm体系结构概述_JVM体系结构:JVM和JVM体系结构概述
- 灰度测试试验流量“洗牌”
- Use JPA API
- Unity 移动端的复制这么写
- 亿图图示edraw max mac版
- MacOS Ventura 13.0 Beta3 (22A5295i) 带 OC 0.8.2 三分区原版黑苹果镜像
- 通信网络基础知识复习
- java 怎么去JTF边框_求助 java 如何编写JFrame窗体右上角红色打叉关闭按钮的事件?...
- 图论(十四)——图的着色
- OLAP分析引擎Druid配置文件详解(五):MiddleManager配置文件
- MySQL中IN和EXISTS的用法
- JavaScript数字运算必备库——big.js源码解析
- MATLAB使用git管理代码
- JavaScript的精华与糟粕