作者:肥朝 原文地址:http://www.jianshu.com/p/893f7e6e0c58

友情提示:欢迎关注公众号【芋道源码】。????关注后,拉你进【源码圈】微信群和【肥朝】搞基嗨皮。

友情提示:欢迎关注公众号【芋道源码】。????关注后,拉你进【源码圈】微信群和【肥朝】搞基嗨皮。

友情提示:欢迎关注公众号【芋道源码】。????关注后,拉你进【源码圈】微信群和【肥朝】搞基嗨皮。

前言

本篇讲的是dubbo中比较重要的 远程暴露,鉴于上一篇dubbo源码解析-本地暴露采用一图胜千言的写法好像读者并不太容易理解,加上之前写的别怕看源码,一张图搞定Mybatis的Mapper原理中的读者评论中看出,这种方式可能有点粗暴.这个后面有时间会补上一些更细致的文字说明

自从每周一更以来,也有不少朋友问到我 怎么看源码这个问题.鉴于高中老师告诉我,作文怕走题的话,就要时刻点题.这种点题的思想也一直延续到现在,所以我的源码解析系列,也几乎都把自己分析的思路暴露出来,其实也是时刻在回答这个 怎么看源码的问题.

昨天下午一个好朋友也打电话给我,说他去面试(广州)问到了 从看源码中你学到了什么?这个问题.其实能学到的东西就太多了.比如你看任何一个框架的源码,那么首先要看一下 设计模式吧,任何一个成熟的框架少不了工厂模式.再具体一点,看 dubbo源码,你就要顺便学一下 zookeeper, netty, spring事件机制的一些简单知识.像 SPI, javassist这些知识你工作了几年可能还没用过吧.同时我们根据这些再深入思考一下,比如dubbo中拼接生成动态编译类的做法,我们可不可以用其他方式来实现呢?比如通过 freemarker这样的模板引擎.既然能生成动态编译类,那像CRUD这种比较固定的代码,我们是不是又可以用这个模板引擎做一个 代码生成器呢?

言归正传,我们回到主题.鉴于前面提到的点题思想,就那以本篇为例,时刻提一下 从源码中你学到了什么

插播面试题

  • 服务暴露中远程暴露的总体过程,画图和文字方式说明

预热概念

首先上一张dubbo文章中非常经典的一张图

相信大家初学dubbo的时候都看过这张图,但是可能当时没理解这个图究竟想说的是什么.图中圈出来的部分就是今天要讲的 远程暴露,当然我还会做一些补充.

为什么这次我不直接自己画图,而是引用官方文档的图?原因很简单,因为假如我直接把图画出来,就是相当把这些概念填鸭式的告诉你,这样你无法看到我的思考过程,也就是说,我并没有告诉大家,这些东西我是怎么知道的,然而这一点,才是源码解析类文章,最应该表达的思想.所以我每篇文章都先从文档入手,以dubug代码的方式验证,这就是我的思考过程,也是我看源码的过程(粗暴式点题怎么看源码).当然后面视情况也会补上一些个人自己花的图加以总结.

另外注意的是,图中的箭头方向是从 ConsumerProvider的过程,所以这个暴露的过程,是我红框出来的反方向

直入主题

由于前两篇dubbo源码解析-服务暴露原理和dubbo源码解析-本地暴露已经多次讲述了 getInvoker的过程,远程暴露也大同小异,所以不再细述.直接从 protocol.export(invoker)开始,另外每个截图我都会尽量把类名和方法名截图出来,方便读者一起debug,另外这些动态编译类(黄色圈出来的)调试方式请参考 服务暴露原理这篇

由经典的交互图知道,下一个关键词是 Filter,由于这个也和前面讲得大同小异,所以就将过程简单浏览回顾一下

下面我们似乎又看到了一位熟悉的老朋友,在 本地暴露中我们也看过这行代码,为何 本地暴露远程暴露中都有他的身影?欢迎简书关注肥朝,在 服务引用那一节我们再揭秘

同时我们已经到了第三个关键词 Procotol,老规矩,我们来看看他的继承体系图(粗暴式点题,怎么看源码)

那这种继承体系有什么好处呢?要想说明一个代码好,那就必须拿个比较一般代码来对比了.由于篇幅有限,推荐看 大话设计模式的第一章,该章用一个计算器的例子,将一个比较一般的代码一步一步演进成类似结构(粗暴式点题,从看源码中学到了什么).

按照经典图的路线,我们下一个关键词应该就是 Server了,从方法名 openServer(url)也可以看出来确实是这样.当然我在 预热概念中也提到,我会做一些补充,那么我要在这个 ProcotolTransporter插播一个关键词,那就是 Exchanger

从单词意思我们知道,这个是 交换的意思,按照计算机术语,这个称之为 交换层更贴切.那么问题来了,他交换什么东西?那我们来看一下他的方法图(粗暴式点题,怎么看源码)

我们捕捉到了几个关键词, Client, Server,其实这个交换层,就是做 封装请求与响应之间的交互层.那么为什么需要这么个交互层呢?这么设计有什么好处呢?好,那我们打开 阿里巴巴Java开发手册

我来举个例子, java web中传统的请求响应方式都是 controller->service->dao,然后 dao->service->controller,从手册我们知道,从 dao传出来的是 DO,但是 controller需要的是 VO,那么我们是不是需要一个中间的交互层来做这些转换?这个例子虽然不足以描述这种设计的好,但是比较可能比较好理解一些.(粗暴式点题,看源码学到了什么)

那我们继续往下走

下面就要注意了,我们要来到下一个关键词 Transporter,这个从字面理解为 传输层,那这个究竟是什么传输层?我们来看一下继承体系图(粗暴式点题,怎么看源码)

从这里就可以看出,这个是 网络传输层,其中 GrizzlyMinaNetty都是非常有名的NIO框架,想了解他们可以查一下相关资料(粗暴式点题,看源码学到了什么)

继续往下走,看到这里有个构造方法,那么就要敲黑板画一下重点了.看源码凡是遇到构造方法的,都要特别注意,因为我们知道调用构造方法前,会先调用父类的构造方法,因此,这个继承体系图是要看一下的(粗暴式点题,怎么看源码)

因此我们将断点打到他的父类上,可以看出,这做的主要是一些根据配置文件设置一些超时时间之类的

高潮还没完,我们注意到,在 AbstractServer类中有一个 doOpen()方法.这个 doOpen()方法方法是一个抽象方法,这种做法称之为 钩子方法.也叫 模板方法,熟悉设计模式的话,会对这种方式并不模式,其实在 Servletinit()方法也是这种做法,可以看看 Servlet的源码(粗暴式点题,看源码学到了什么)

那么我们就到了 doOpen方法,这里如果大家写过一些简单的netty例子看到这段代码就会很熟悉了

另外提一下这个 9并不是固定的,这个和我们的机器是有关的,不熟悉的参数我们可以用以下的方式查一下文档(粗暴式点题,怎么看源码)

那么继续走,这里为什么会进入这个构造方法呢?注意我们在提 Transporter关键词之前是有 new一个 HeaderExchangeServer对象的.在这个构造方法中,通过 startHeatbeatTimer设置了netty的心跳,这些netty的细节我们在后面的netty专题再细说

正如官方文档所说 Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程,看到这个 exporter,也预告本篇走到了尾声

写在末尾

本篇中比较粗暴的多次进行 怎么看源码看源码学到了什么的点题,让我仿佛回到了高中写作业的时光.当然这种方式也只是肥朝个人的拙见,并不是看源码的最佳实践.有好的想法也欢迎和我交流,我们下周见.鉴于本人才疏学浅,不对的地方还望斧正,也欢迎点赞或者关注我的简书,名称为 肥朝

Dubbo源码解析 - 远程暴露相关推荐

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

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

  2. dubbo源码解析(二)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. r语言 整理、处理数据步骤_R语言万能数据清洗整理包Tidyverse(一)
  2. video camera in shanghai
  3. python字典高级用法_Python 字典的高级用法
  4. 零空间,Markov‘s inequality, Chebyshev Chernoff Bound, Union Bound
  5. java虚拟机MyEclipse_Eclipse和MyEclipse运行环境java虚拟机jvm设置,自己设置jre
  6. PyTorch:存储和恢复模型并查看参数,load_state_dict(),state_dict()
  7. PHP--去除字符串首尾空格
  8. java中会用到二进制吗,java中的二进制运算以使用场景
  9. But how to do it? How to avoid direct competition with giants?
  10. java 传参数 数组_Java参数传递 数组的使用
  11. 21天jmeter打卡day5-完成对www.baidu.com的两条接口测试
  12. mac安装helm工具_适用于初学者的基本 kubectl 和 Helm 命令
  13. 安装ActiveBPEL引擎(tomcat5.5+mysql5.1+ActiveBPEL5.0.2)
  14. w10桌面不显示计算机了,win10系统电脑开机后不显示桌面的详细方案
  15. P68是什么意思 IP67和IP68等级有什么区别
  16. 财路网每日原创推送:区块链的“三围”了解
  17. HTML怎么画圆角平行四边形,圆角平行四边形钻搅机的制作方法
  18. 机器学习常用「微积分」知识速查手册
  19. Tomcat部署war包项目
  20. 全网唯一OpenCyphal/UAVCAN教程(10)canfd协议详解

热门文章

  1. Https的CA证书是如何验证其有效性的?
  2. npm报错:A complete log of this run can be fund in: C\Users\用户\AppData\Roaming\npm-cache_logs\解决方案(清理缓)
  3. 文档管理系统,你用了吗?
  4. 组合数计算的几种方法
  5. 打不开计算机组的打印机,添加打印机时设备和打印机窗口打不开怎么办
  6. Python学习笔记—第二章—IPython
  7. 输入失调电流(input offset current)和输出失调电压(output offset Voltage)
  8. 图神经网络相关论文整理
  9. vnc远程操作,vnc远程操作怎么实现?实现教程
  10. 现在疫情时代软件测试前景还可以吗?