Dubbo集群容错模式之Failover实现
2019独角兽企业重金招聘Python工程师标准>>>
注: Dubbo版本是2.6.2
图1 Dubbo的FailoverClusterInvoker类继承图
1.Failover的含义
Failover可以理解为当出现失败,重试其它服务器。
2.Failover的实现
核心代码在FailoverClusterInvoker的doInvoke(Invocation,List<Invoker<T>>,LoadBalance)中,源码如下。
@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public Result doInvoke(Invocation invocation, final List<Invoker<T>> invokers, LoadBalance loadbalance) throws RpcException {List<Invoker<T>> copyinvokers = invokers;checkInvokers(copyinvokers, invocation);int len = getUrl().getMethodParameter(invocation.getMethodName(), Constants.RETRIES_KEY, Constants.DEFAULT_RETRIES) + 1;if (len <= 0) {len = 1;}// retry loop.RpcException le = null; // last exception.List<Invoker<T>> invoked = new ArrayList<Invoker<T>>(copyinvokers.size()); // invoked invokers.Set<String> providers = new HashSet<String>(len);for (int i = 0; i < len; i++) {//Reselect before retry to avoid a change of candidate `invokers`.//NOTE: if `invokers` changed, then `invoked` also lose accuracy.if (i > 0) {checkWhetherDestroyed();copyinvokers = list(invocation);// check againcheckInvokers(copyinvokers, invocation);}Invoker<T> invoker = select(loadbalance, invocation, copyinvokers, invoked);invoked.add(invoker);RpcContext.getContext().setInvokers((List) invoked);try {Result result = invoker.invoke(invocation);if (le != null && logger.isWarnEnabled()) {logger.warn("Although retry the method " + invocation.getMethodName()+ " in the service " + getInterface().getName()+ " was successful by the provider " + invoker.getUrl().getAddress()+ ", but there have been failed providers " + providers+ " (" + providers.size() + "/" + copyinvokers.size()+ ") from the registry " + directory.getUrl().getAddress()+ " on the consumer " + NetUtils.getLocalHost()+ " using the dubbo version " + Version.getVersion() + ". Last error is: "+ le.getMessage(), le);}return result;} catch (RpcException e) {if (e.isBiz()) { // biz exception.throw e;}le = e;} catch (Throwable e) {le = new RpcException(e.getMessage(), e);} finally {providers.add(invoker.getUrl().getAddress());}}throw new RpcException(le != null ? le.getCode() : 0, "Failed to invoke the method "+ invocation.getMethodName() + " in the service " + getInterface().getName()+ ". Tried " + len + " times of the providers " + providers+ " (" + providers.size() + "/" + copyinvokers.size()+ ") from the registry " + directory.getUrl().getAddress()+ " on the consumer " + NetUtils.getLocalHost() + " using the dubbo version "+ Version.getVersion() + ". Last error is: "+ (le != null ? le.getMessage() : ""), le != null && le.getCause() != null ? le.getCause() : le);
}
- 首先得到尝试次数len。
- 根据loadbalance从候选服务提供者当中选取一个服务提供者,而后调用。如果第一次就成功,则直接返回调用结果;如果调用不成功,且异常是Biz异常,则直接抛出该异常;多次调用之后才成功,则在warn级别允许的情况下会将多次调用的信息记录到日志,之后返回调用成功的结果;如果尝试的次数超过了len,还是没有成功过,则抛出异常。
由代码可以看出,抛出异常的情况分俩中,一种是服务端返回的是业务异常;另一种是尝试次数超过了设置的阀值。
转载于:https://my.oschina.net/u/2518341/blog/1814883
Dubbo集群容错模式之Failover实现相关推荐
- Dubbo 的集群容错模式:Failover Cluster
集群容错系列文章: Failover Cluster 失败自动切换 Failfast Cluster 快速失败,抛出异常 Failsafe Cluster 快速失败,不抛出异常 Failback Cl ...
- Dubbo集群容错模式之Failsafe实现
2019独角兽企业重金招聘Python工程师标准>>> 注: Dubbo版本是2.6.2 图1 Dubbo的FailsafeClusterInvoker类继承图 1.Failsafe ...
- Apache Dubbo集群容错
在分布式应用中(微服务),通常会对服务进行集群部署来保障服务高可用.dubbo用于服务远程调用,远程服务是有可能出现异常情况的,如网络抖动,服务短暂不可用等情况,需要自动容错,服务降级或者mock测试 ...
- Dubbo面试杀招--Dubbo集群容错负载均衡
点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...
- Dubbo 源码分析 - 集群容错之 Cluster
1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...
- dubbo调用失败策略_面试官:dubbo负载均衡策略,集群容错策略,动态代理策略有哪些...
面试官心理分析 继续深问吧,这些都是用 dubbo 必须知道的一些东西,你得知道基本原理,知道序列化是什么协议,还得知道具体用 dubbo 的时候,如何负载均衡,如何高可用,如何动态代理. 说白了,就 ...
- dubbo负载均衡策略和集群容错策略
dubbo负载均衡策略 random loadbalance 默认情况下,dubbo是random load balance随机调用实现负载均衡,可以对provider不同实例设置不同的权重,会按照权 ...
- Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些?
Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些? 面试题 dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 面试官心理分析 继续深问吧,这些都是用 dubbo 必须 ...
- Dubbo的负载均衡、集群容错、服务降级等机制详解
文章目录 1. Dubbo与RPC的关系 2. Dubbo的基本使用 2.1 Dubbo是什么? 2.2 负载均衡 2.3 服务超时 2.4 集群容错 2.5 服务降级 2.6 本地存根 2.7 参数 ...
最新文章
- SVN专题(Visual SVN Server + TortoiseSVN + Visual SVN)
- 从send函数和sendto函数参数的不同看TCP和UDP的差别
- Android实现边缘凹凸的View
- modbustcp封装使用获取设备数据示例
- Java JSP EL
- 深度解析javascript中的浅复制和深复制
- Python 必备要点总结及环境搭建(上)
- MATLAB绘制椭圆
- java实现归并排序(详解)
- 云炬随笔集(2016.7~2022.1)
- IDEA这些既好用又好玩的三十多个宝贝插件你还不知道吗?
- 闰年python的月份判断_C 判断闰年及指定月份有几天
- 用友U8安装客户端时提示已经安装过智能客户端
- 计算机无法识别新u盘,电脑新装win7系统就无法识别u盘怎么办
- 别让抱怨毁了你的工作生活
- 读小说摘抄 —— 钱钟书的《围城》
- FPGA niosII 视频笔记--小梅
- Flask学习笔记(一)
- php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言
- WPF 矢量图形编辑软件- Inkscape
热门文章
- c字符串函数实现(1)---strncpy
- 关于jstl动态变量用法
- 深入剖析C#继承机制
- 【转】ASP.NET中文验证码详解
- q87主板支持cpu型号_怎么选内存,看主板和CPU的支持,取一致性约束
- python访问网页时401_在python上访问带有基本身份验证的网页
- OriginPro 2021安装教程(手把手式安装)
- php 跨域读php_php跨域的几种方式
- Verilog自编函数clog2替代SV中的系统函数$clog2
- java string isempty,java – String.isEmpty()和String.equals(“”)之间的区别