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实现相关推荐

  1. Dubbo 的集群容错模式:Failover Cluster

    集群容错系列文章: Failover Cluster 失败自动切换 Failfast Cluster 快速失败,抛出异常 Failsafe Cluster 快速失败,不抛出异常 Failback Cl ...

  2. Dubbo集群容错模式之Failsafe实现

    2019独角兽企业重金招聘Python工程师标准>>> 注: Dubbo版本是2.6.2 图1 Dubbo的FailsafeClusterInvoker类继承图 1.Failsafe ...

  3. Apache Dubbo集群容错

    在分布式应用中(微服务),通常会对服务进行集群部署来保障服务高可用.dubbo用于服务远程调用,远程服务是有可能出现异常情况的,如网络抖动,服务短暂不可用等情况,需要自动容错,服务降级或者mock测试 ...

  4. Dubbo面试杀招--Dubbo集群容错负载均衡

    点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...

  5. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

  6. dubbo调用失败策略_面试官:dubbo负载均衡策略,集群容错策略,动态代理策略有哪些...

    面试官心理分析 继续深问吧,这些都是用 dubbo 必须知道的一些东西,你得知道基本原理,知道序列化是什么协议,还得知道具体用 dubbo 的时候,如何负载均衡,如何高可用,如何动态代理. 说白了,就 ...

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

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

  8. Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些?

    Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些? 面试题 dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 面试官心理分析 继续深问吧,这些都是用 dubbo 必须 ...

  9. Dubbo的负载均衡、集群容错、服务降级等机制详解

    文章目录 1. Dubbo与RPC的关系 2. Dubbo的基本使用 2.1 Dubbo是什么? 2.2 负载均衡 2.3 服务超时 2.4 集群容错 2.5 服务降级 2.6 本地存根 2.7 参数 ...

最新文章

  1. SVN专题(Visual SVN Server + TortoiseSVN + Visual SVN)
  2. 从send函数和sendto函数参数的不同看TCP和UDP的差别
  3. Android实现边缘凹凸的View
  4. modbustcp封装使用获取设备数据示例
  5. Java JSP EL
  6. 深度解析javascript中的浅复制和深复制
  7. Python 必备要点总结及环境搭建(上)
  8. MATLAB绘制椭圆
  9. java实现归并排序(详解)
  10. 云炬随笔集(2016.7~2022.1)
  11. IDEA这些既好用又好玩的三十多个宝贝插件你还不知道吗?
  12. 闰年python的月份判断_C 判断闰年及指定月份有几天
  13. 用友U8安装客户端时提示已经安装过智能客户端
  14. 计算机无法识别新u盘,电脑新装win7系统就无法识别u盘怎么办
  15. 别让抱怨毁了你的工作生活
  16. 读小说摘抄 —— 钱钟书的《围城》
  17. FPGA niosII 视频笔记--小梅
  18. Flask学习笔记(一)
  19. php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言
  20. WPF 矢量图形编辑软件- Inkscape

热门文章

  1. c字符串函数实现(1)---strncpy
  2. 关于jstl动态变量用法
  3. 深入剖析C#继承机制
  4. 【转】ASP.NET中文验证码详解
  5. q87主板支持cpu型号_怎么选内存,看主板和CPU的支持,取一致性约束
  6. python访问网页时401_在python上访问带有基本身份验证的网页
  7. OriginPro 2021安装教程(手把手式安装)
  8. php 跨域读php_php跨域的几种方式
  9. Verilog自编函数clog2替代SV中的系统函数$clog2
  10. java string isempty,java – String.isEmpty()和String.equals(“”)之间的区别