Dubbo源码解析系列文章均来自肥朝简书

前言

今天是小长假的倒数第二天,本来国庆是要加班四天的,后来因为要有事要回家才得以幸免,但是后天上班之后都要搬砖搬到手脱皮是必须的了.但是再忙每周一篇源码解析的承诺都依然记得,dubbo系列写完了还有很多系列,后面我会画个技能图谱给大家,以目前的知识储备,一周一篇的进度,一两年之内是肯定更新不完的,这点大家放心.今天刚回到广州,看了一下是星期六,怕明天太忙,所以就开始理一下思绪

其实相比博客而言,很多人更喜欢看书,为什么呢,因为看书比较系统,而很多博客经常写着写着就断更了,导致这看了一点,那看了一点,最后学得不系统,这个就是学习的大忌.我也希望能改变这个现状,后面有时间整理出一份我自己的技能图谱和一份目录.比如dubbo源码解析这个系列的,按照学习曲线,制定出一个循序渐进学习的目录.

另外鉴于也有一些朋友问到我怎么看源码为什么看源码这两个老生常谈的问题.

首先怎么看源码这个问题,在今后的源码分析系列的内容中,我也力求能更多的把自己当时的思考思路向大家展示出来,当然这个思路毕竟只是我个人的思路,也欢迎大家批评指正.

其次为什么看源码这个问题,其实可以从王者荣耀为什么火来分析.为什么王者农药容易上瘾,很大一个原因就是四个字,及时反馈.你可以在短时间内通过自己的努力获取到胜利的快感,然而看源码恰恰相反.之所以会有这个疑惑是因为你有两个问题一直得不到答案,1.源码看了到底有没有用 2.需要看到什么程度才能涨工资.你甚至希望有人给出一个标准,然后你才放心的头悬梁,锥刺股去学,在这两个问题没有得到肯定的回答之前,你害怕失败.

鉴于这这些问题,源码分析系列文章中(包括之前的),我都有穿插面试题,让你看到自己正在为自己的未来做着准备.

直入主题

我们再来回顾一下官网的对于集群容错的架构设计图

从标题看就知道本篇主要讲的就是Cluster了,之前我反复强调三个关键词Directory,Router,LoadBalance,但是换个角度而言,其实也可以是四个关键词,还有一个就是Cluster

首先我们先看看官网的介绍,这个Cluster到底是干嘛的

Cluster 将 Directory 中的多个 Invoker 伪装成一个 Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个

简单来说,就是应对出错情况采取的策略,当然这么说还是有些不准确的.那我们再来看看这个接口及其继承体系图

看继承体系图中,我们也可以看到了他有9个实现类,换个角度来说,就是有9中应对策略,下面的逐一简介和分析其内部实现(以下逻辑都在Cluster接口的join方法)

MergeableCluster

这个主要用在分组聚合中,我们来看一下官网的介绍

按组合并返回结果 ,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。

该类的源码是这么多实现类中最多的.代码全部贴出来篇幅就太大了,我用一个流程图来告诉大家这个类是干什么的

大家可以根据我这个流程图对照源码理一下思路,这三个判断也是很容易看出来的,比如

  • URL中merger属性是否有值
String merger = getUrl().getMethodParameter( invocation.getMethodName(), Constants.MERGER_KEY );
if (ConfigUtils.isEmpty(merger) ) { // 如果方法不需要Merge,退化为只调一个Groupfor(final Invoker<T> invoker : invokers ) {if (invoker.isAvailable()) {return invoker.invoke(invocation);}}return invokers.iterator().next().invoke(invocation);
}

是否指定合并方法merger.startsWith("."),为什么是否指定方法是这么判断的呢?因为指定合并方法在xml配置中就是要以"."开头,例如

<dubbo:reference interface="com.xxx.MenuService" group="*"><dubbo:method name="getMenuItems" merger=".addAll" />
</dubbo:service>

是否默认merge策略

if (ConfigUtils.isDefault(merger)) {resultMerger = MergerFactory.getMerger(returnType);
} else {resultMerger = ExtensionLoader.getExtensionLoader(Merger.class).getExtension(merger);
}

其实这个`ConfigUtils.isDefault从我们使用上都可以推断出他的实现

public static boolean isDefault(String value) {return "true".equalsIgnoreCase(value) || "default".equalsIgnoreCase(value);
}

AvailableCluster

从单词Available意思就知道,这个是调用可用的.代码实现逻辑也比较简单

源码的这个写法是比较优雅的,遍历所有的Invokers判断invoker.isAvalible,只要一个有为true直接调用返回,否则就抛出异常.

ForkingCluster

引用官网的介绍

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。

我们来看看源码的实现

这里就涉及到了线程池,但是由于本篇篇幅会很大,所以线程池的会专门有个专题来讲,可以继续简书关注肥朝

至于这个execute方法是干嘛的,这个时候可以用上码农日常工具推荐里面介绍的Dash

FailfastCluster

引用官网的介绍

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

看看源码实现

这个的实现应该是实现类里面最简单的,就是调用invoke,调用失败就抛出异常,但是这个却是面试问得最多的,请留意后面的面试题

MockClusterWrapper

这个主要用在本地伪装上,让我们来看官网描述

本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败

同样我也用一个流程图来描述他的逻辑

FailoverCluster

这个是本篇的重点,也是dubbo里面容错方案的缺省值.让我们来看官网介绍

失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)

也就是说,默认的情况下,如果第一次调用失败,会重试两次,也就是一共是调用三次.所以len = 3的(经过调试确实是3).

这个时候面试题就来了,注意我上面提到的FailfastCluster,面试会问,dubbo中"读接口"和"写接口"有什么区别?答案也是很明显的,因为默认FailoverCluster会重试,如果是"写"类型的接口,如果在网络抖动情况下写入多个值,所以"写"类型的接口要换成FailfastCluster

FailbackCluster

老规矩看官网

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

这个定时重发的逻辑如下,由于还是涉及到线程池,这个必须要有些知识铺垫,后面会讲解,简书关注肥朝即可,不过我们可以先看一下api文档

FailsafeCluster

继续看官网介绍,我反复强调官网介绍,其实也是在回答前面的"怎么看源码"这个问题

失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

这个的逻辑就很简单了,官网的这句话就已经介绍完了

BroadcastCluster

老规矩,还是官网介绍

广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。

这个的逻辑也是很简单,遍历所有Invokers, 逐个调用每个调用,有异常就catch,以免影响到剩下的调用,那这个和AvailableCluster有什么区别?当然有啊,你仔细看就知道,BroadcastCluster是要遍历调用完全部的invoker,而AvailableCluster是只要有一个调用就return了.

写在末尾

本文到此就要结束了,看了一下时间,已经是星期天了.下周源码分析我们再见,鉴于本人才疏学浅,不对的地方还望斧正.

dubbo源码解析-cluster相关推荐

  1. Dubbo源码解析 --- DIRECTORY和ROUTER

    Dubbo源码解析 --- DIRECTORY和ROUTER 今天看一下Directory和Router. 我们直接从代码看起(一贯风格),先看后总结,对着总结再来看,相信会收获很多.我们先看com. ...

  2. dubbo源码解析-集群容错架构设计

    前言 本来是想把整个dubbo源码解析一次性弄完,再做成一个系列来发布的,但是正巧最近有位好朋友要去杭州面试,就和我交流了一下.本着对dubbo源码略有心得的心态,在交流过程中也发表了个人的一些粗劣的 ...

  3. dubbo源码解析之框架粗谈

    dubbo框架设计 一.dubbo框架整体设计 二.各层说明 三.dubbo工程模块分包 四.依赖关系 五.调用链 文章系列 [一.dubbo源码解析之框架粗谈] [二.dubbo源码解析之dubbo ...

  4. Dubbo源码解析-Dubbo服务消费者_Dubbo协议(一)

    前言: 在介绍完Dubbo 本地模式(Injvm协议)下的服务提供与消费后,上文我们又介绍了Dubbo远程模式(dubbo协议)下的服务暴露过程,本质上就是通过Netty将dubbo协议端口暴露出去, ...

  5. dubbo源码解析(九)远程通信——Transport层

    远程通讯--Transport层 目标:介绍Transport层的相关设计和逻辑.介绍dubbo-remoting-api中的transport包内的源码解析. 前言 先预警一下,该文篇幅会很长,做好 ...

  6. dubbo源码解析-zookeeper创建节点

    前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...

  7. dubbo源码解析(二)

    大家好,我是烤鸭: dubbo 源码解析: 1.服务导出 介绍: Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可分为三 ...

  8. dubbo源码解析(十)远程通信——Exchange层

    远程通讯--Exchange层 目标:介绍Exchange层的相关设计和逻辑.介绍dubbo-remoting-api中的exchange包内的源码解析. 前言 上一篇文章我讲的是dubbo框架设计中 ...

  9. dubbo(5) Dubbo源码解析之服务调用过程

    来源:https://juejin.im/post/5ca4a1286fb9a05e731fc042 Dubbo源码解析之服务调用过程 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与 ...

  10. dubbo源码解析-逻辑层设计之服务降级

    Dubbo源码解析系列文章均来自肥朝简书 前言 在dubbo服务暴露系列完结之后,按计划来说是应该要开启dubbo服务引用的讲解.但是现在到了年尾,一些朋友也和我谈起了明年跳槽的事.跳槽这件事,无非也 ...

最新文章

  1. pytorch lstm 写诗文的魔改,测试,猜想
  2. 响应式开发一招致胜 学习视频 分享
  3. light oj 1011Marriage Ceremonies
  4. iOS之深入解析WKWebView的WebKit源码调试与分析
  5. mysql 以 db 结尾_MySQL的高级部分
  6. Tomcat类加载器为何违背双亲委派模型
  7. andrew ng 机器学习笔记_所有笔记目录 | 数据分析 | 机器学习 | 深度学习等
  8. linux终端命令行用户名和密码,Linux入门篇 —— Linux 用户与组管理详解(system-config-users 命令行)| 七日打卡...
  9. 【动态规划】P1018 线性dp:乘积最大
  10. ALSA学习(2)——pcm设备逻辑
  11. 关于港股通交易的规则
  12. 传奇服务端:GOM GeeM2引擎更新时必须要修改哪些地方?
  13. 分布式原理:一文了解 Gossip 协议
  14. 校招php竞争状况,学习猿地-2018 新浪校招 PHP 实习生 电话面试总结
  15. 点心云pcdn跑不起来解决办法(不起量)
  16. html 如何完美的显示图片,不拉伸图片,完整显示等等。
  17. 最完美安装amd显卡驱动方法
  18. 互联网赚钱的项目有哪些?6个互联网赚钱模式
  19. 用腾讯云阿里云搭建自己的个人网站
  20. Android开发相关配置初体验

热门文章

  1. 职业教育计算机专业宣传,计算机专业介绍.ppt
  2. 360极速浏览器代理设置无效问题
  3. PostgreSQL如何拼接字符串
  4. 倍福--读取控制器诊断信息
  5. 福禄克光纤OTDR测试原理
  6. 将 SPSS 分析技术应用于大数据
  7. Quartz 定时任务 cron 表达式详解
  8. 按键精灵在帖吧的引流代码
  9. 机器学习的常见分类及常用算法
  10. 去除winrar广告