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,解析完成之后返 ...
随机推荐
- Java 运行时动态生成class
转载 http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 Java是一门静态语言 ...
- 【Postman】使用Postman实现接口数据关联
首先下载安装Postman直接打开官网,点击下载按钮即可完成下载https://www.getpostman.com/downloads/ 栗子业务场景:用户登录医生账户,查询自己的处方列表数据:用户 ...
- uniApp 列表
普通列表 例图: 代码片段: <template> <view class="teacher"> <view class="teacher- ...
- NS-3环境布置及安装
MMP的,入坑NS3了,LTE是什么鬼!!! ubantu安装NS3解决依赖环境 一堆安装包需要安装,试了N多次(CentOS没安装明白,转而ubantu).利用脚本进行按装. 貌似得先对本机软件进行 ...
- Python的Cmd模块的简易运用学习
昨天大佬阿炳给发了一份代码给我,看着感觉很好玩,这是自己写了个命令行吗,完了我就找篇更详细一点的博客学习了一下 cmd的主要方法和属性 方法: (1)cmdloop():类似与Tkinter的mai ...
- project--客户信息管理系统
软件设计分析 该软件有三个模块组成:Customer CustomerList CustomerView Customer 为实体对象,用来封装客户信息: CustomerList 为 Custo ...
- spring-cloud-config 多服务共享公共配置的解决方案总结,太全了!
问题描述 我们公司的项目是基于SpringCloud开发的微服务,用到了Spring-Cloud-Config作为微服务统一的配置中心,可以将散落在各个服务的配置进行统一配置管理. 虽然配置中心将各个 ...
- Pandas_工资集处理
import numpy as np import pandas as pd from pandas import Series,DataFrame # 1--读取数据文件 file_obj=open ...
- python_os_shutil_获取文件夹下所有文件的大小
# sys.argv练习 # 写一个python脚本,在cmd里执行: python xxx.py 用户名 密码 cp 文件路径 目的地址 python xxx.py alex sb cp D:\py ...
- 卸载python安装的软件
python源码安装的软件是无法通过命令卸载的,这个可以通过记录安装过程的形式来卸载安装的软件 以 python2.7.2 为例,在这个目录中有一个 setup.py 的文件,很显然这是安装程序,还是 ...