dubbo ChannelHandler
记得我们在做服务暴露的bind和服务调用的connect都有一个ExchangeHandler的实例作为入参:

这个handler最终会利用装饰者模式被封装若干层,Dubbo中提供了大量的Handler去承载特性和扩展,这些Handler最终会和底层通信框架做关联。在NettyServer和NettyClient中最多有3个Handler,分别是编码,解码和NettyServerHandler或NettyClientHandler:

其实这里也不止我们看到的这些层包装,我们继续看下构造NettyClient的逻辑:
可以看到在DecoderHandler之后还层包装了Dispatcher,HeartbeatHandler,MultiMessageHandler

在图中Dispatcher就是线程池派发器,Dispatcher真实的职责是创建具有线程派发能力的ChannelHandler,比如AllChannelHandler,MessageOnlyChannelHandler和ExecutionChannelHandler,其本身不具备线程派发能力
通过 Exchange 层为框架引入 Request 和 Response 语义

这里看下connect返回的HaderEchangeClient:

这里将Transports.connect()返回的client包装成一个HeaderExchangeChannel,我们看下这里的request方法:

直接调用channel的request,继续看下HeaderExchangeChannel的构造方法和request方法:


可以看到最后还是调用了transports.connect()返回的client的send方法,继续nettyClient的send方法:

send的真正实现是在其超类的超类AbstractPeer中

补充下dubbo官方文档的调用栈帧:

后面的就不详细截图了,注意到我们给transports.connect()传递的DecodeChannel并没有在发起调用的时候发挥作用,之前的帖子还在奇怪为什么connect和bind用了同一个ExchangeHandlerAdapter的实现
补充下各Handler的作用:

dispatcher扩展点:

作用如下:
all:将所有I/O事件交给Dubbo线程池处理,Dubbo默认启用
connection:单独线程池处理连接断开事件,和Dubbo线程池分开
direct:所有方法调用和事件处理在I/O线程中,不推荐
execution:只在线程池处理接收请求,其他事件在I/O线程池中
message:只在线程池处理请求和响应事件,其他事件在I/O线程池中
mockdispatcher:默认返回null
dubbo ChannelHandler的更多相关文章
- dubbo系列十一、dubbo transport层记录
前言 在dubbo接口方法重载且入参未显式指定序列化id导致ClassCastException分析时候用到了dubbo的通信层和编解码,dubbo有个transport层,默认使用netty4进行网 ...
- dubbo发送过程编码失败,会唤醒发送线程吗?
dubbo发送过程编码失败,会唤醒发送(客户端业务)线程吗?如何实现的? 在上篇文章 dubbo坑- No provider available for the service xxx 中,如果dub ...
- Dubbo-聊聊通信模块设计
前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrap ...
- dubbo源码分析6-telnet方式的管理实现
dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...
- dubbo工作原理
part -- 外挂1.dubbo借助spring的schema启动和初始化 1.1 spring扫描所有jar下META-INF的spring.handlers和spring.schemas. 1. ...
- dubbo 请求调用过程分析
服务消费方发起请求 当服务的消费方引用了某远程服务,服务的应用方在spring的配置实例如下: <dubbo:referenceid="demoService"interfa ...
- dubbo源码分析(二):超时原理以及应用场景
dubbo超时原理以及应用场景 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: ...
- dubbo源码—Service Reply
dubbo通过netty将请求发送到provider的时候,provider之前已经启动好的NettyServer监听指定端口的时候会收到来自consumer的请求,将通过网络发送来的二进制编码成Re ...
- Dubbo中消费者初始化的过程解析
首先还是Spring碰到dubbo的标签之后,会使用parseCustomElement解析dubbo标签,使用的解析器是dubbo的DubboBeanDefinitionParser,解析完成之后返 ...
随机推荐
- Redis 数据结构与编码技术 (Object Encoding)
数据结构实现 相信大家对 redis 的数据结构都比较熟悉: string:字符串(可以表示字符串.整数.位图) list:列表(可以表示线性表.栈.双端队列.阻塞队列) hash:哈希表 set:集 ...
- ERP的财务凭证的操作与设计--开源软件诞生23
赤龙ERP财务凭证讲解--第23篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...
- rclone 云盘同步工具的正确打开方式
Rclone 是一款的命令行工具,支持在不同对象存储.网盘间同步.上传.下载数据. 官网网址:https://rclone.org/ Github 项目:https://github.com/ncw/ ...
- 2020 校招,我是如何拿到小米、京东、字节大厂前端offer
前言 Hi~,我是 2020 届物联网专业毕业生,现就读于杭州.谨以此文来记录我的秋招以及入门前端以来的学习历程,如有错误,希望大家能及时提出! 面试情况 从19年8月初到11月底,前前后后一共面试了 ...
- Prometheus监控告警浅析
前言 最近有个新项目需要搞一套完整的监控告警系统,我们使用了开源监控告警系统Prometheus:其功能强大,可以很方便对其进行扩展,并且可以安装和使用简单:本文首先介绍Prometheus的整个监控 ...
- VBA_Copy数据及数据格式_DoLoop删除空行
Sub copyreport() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Ap ...
- Pandas_VBA_数据分类比较
Python与VBA的比较2 需求: input文件中有两列数据,第一列为Name,第二列为Score,Name列里有重复的值,要求按照name的唯一值统计 score,输出到output文件按中. ...
- 我发现了一个特别Man的Linux工具!!!
Linux命令不用我多说吧,谁还不会几个?但是一个命令可能有几十种用法,就拿最简单也是最常用的ls来举例,它就有将近20种options用法 比如 ls -a :现实所有文件及其隐藏文件 ls -t ...
- 利用日志文件getshell
一.包含日志文件漏洞利用概述 当我们没有上传点,并且也没有url_allow_include功能时,我们就可以考虑包含服务器的日志文件. 利用思路也比较简单,当我们访 ...
- Redis在springboot项目的使用
一.在pom.xml配置redis依赖 <!-- redis客户端代码 --> <dependency> <groupId>org.springframework. ...