Dubbo与Netty杂谈

在Dubbo的'人生'中, 无论它是在自己的'亲爸爸'阿里家族成长, 还是'寄养'在Apache家族里, Dubbo的底层通信一直使用高性能的Netty框架.

Dubbo在阿里家族一直成长到v2.6.9版本之后,就被送到Apache家族了.
通过Maven官网搜索Dubbo版本, 如下

图片.png
图片.png

从上面两张图看出, Dubbo在阿里家族的Maven最高版本是v2.6.9, 在Apache家族的Maven最低版本是v2.7.0, 正好衔接.

在之前的Netty在Dubbo中使用了哪些Handler文章中, 介绍了在服务端或客户端启动之后, 流程的处理过程涉及哪些Handler. 下面提供一张更全面的图

Netty在Dubbo中使用了哪些Handler.png

上面这张图, 涉及了Dubbo使用Netty作为客户端和服务端时启动的主要核心代码, 包括核心类, 以及心跳等内容. 接下来逐一说下每个部分内容.
图中代码的对应Dubbo版本是v2.6.9

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.9</version>
</dependency>

图中内容分成三个区域, 左边和右边分别对应启动服务端和启动客户端时对应 的Netty代码, 包括使用的Handler. 中间部分涉及客户端和服务端的
HeaderExchangeServer和HeaderExchangeClient, 还有心跳相关.

在服务端启动过程中, 会创建一个HeaderExchangeServer类,
它有一个NettyServer属性, 还有一个ScheduledExecutorService属性.
NettyServer就是负责监听客户端连接以及读写IO操作(具体是由Netty相关的类实现的). 当有数据到达服务端的时候, 从图上来看, 就会从上到下经过每个Handler, 当需要向客户端写数据的时候, 就会从下到上经过每个Handler.

ScheduledExecutorService类是一个定时任务相关的线程池. 当客户端没有向服务端发送请求的时候, 也就意味着没有数据到达服务端了. 通过这个定时任务可以定时向客户端发送心跳包, 正常情况, 客户端收到服务端的心跳包之后, 会响应一个心跳包给服务端, 服务端接收到客户端的响应心跳包之后, 什么业务也不会做. 不管是正常的业务数据发送和接收, 还是心跳包的发送和接收, 接收到包就会更新最后读的时间, 发送包就会更新最后写的时间. 根据最后读或者写的时间来判断, 经过了这么久还是没有收到对端的响应包, 那么服务端最后就会断开与客户端的连接. 简单说明就是, 服务端会根据最后一次读/写的时间判断, 比如已经过了1分钟了, 客户端还是没有给服务端发送数据, 那么服务端就会给客户端发送心跳包, 发了几次心跳包之后(至于发送几次是根据时间大小判断的)还是没有收到客户端的心跳包, 那么服务端就会断开连接.

在客户端启动过程中, 会创建一个HeaderExchangeClient类, 它有一个NettyClient属性, 还有一个ScheduledExecutorService属性.NettyClient是负责读写IO操作(具体是由Netty相关的类实现的). 当有数据到达客户端的时候, 从图上来看, 就会从上到下经过每个Handler, 当需要向服务端写数据的时候, 就会从下到上经过每个Handler.

在创建NettyClient的时候,会创建一个ScheduledThreadPoolExecutor. 这个线程池负责重连服务端, 它也是定时的检查连接是否关闭, 如果关闭了那么就会重连服务端.

在v2.6.9版本, 即阿里家族的版本, 实现心跳检测是通过客户端和服务端互发心跳包的方式实现的, 更具体的说是通过JDK的线程池实现定时检测的.

ScheduledThreadPoolExecutor scheduled = new ScheduledThreadPoolExecutor();

而就在v2.7.0版本, 也就是Dubbo捐献给Apache的第一个版本, 心跳检测的实现使用的是时间轮(HashedWheelTimer)的方式. 只是实现的方式不同而已, 但是服务端依然会发送心跳包.

可是到了v2.7.3版本, 不仅仅增加了使用Netty的IdleStateHandler类进行空闲检测, 虽然还使用了时间轮, 但是服务端已经不再发送心跳包了, 服务端一旦发现连接空闲, 直接断开连接了.

杂谈结束...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容