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,解析完成之后返 ...
随机推荐
- NoSQL非关系型数据库
NoSQL 关注公众号"轻松学编程"了解更多. 一.概念 NoSQL(Not Only SQL)非关系型数据库(功能换效率). 优点 开发维护成本低 访问灵活 访问速度快(缓存+快 ...
- python中的 异常处理(try...expect)
错误处理 关注公众号"轻松学编程"了解更多. 在程序运行的过程中,如果发生了错误,可以事先约定一个错误代码,这样就可以知道是否有错,以及出错的原因,在操作系统的调用中,返回错误码的 ...
- 参悟python元类(又称metaclass)系列实战(一)
写在前面 之前在看廖雪峰python系列的教程时,对元类的章节一直头大,总在思考我到底适不适合学习python,咋这么难,尤其是ORM的部分,倍受打击:后来从0到1手撸了一套ORM,才稍微进阶了一点理 ...
- Flink的DataSource三部曲之三:自定义
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- SQL中WHERE子句中为什么不能使用聚合函数?
我们先来看一下这个代码: SELECT * FROM product WHERE SUM(slae_price) > 1000 GROUP BY product_type; 这样子会报错: SE ...
- SQL2005中清空操作日志的语句(SQL2008有所不同)
方法一(我常用的): backup transaction 库名 with no_log go DBCC SHRINKDATABASE(库名) go 在VS中调用语句: string sb = &qu ...
- eclipse关于新建工程找不到二进制文件的解决方法
eclipse新建工程后先构建项目 然后右键工程,选择属性,选择c/c++ Build,选择Tool chain editor.中间的Current Toolchain改为Mingw Gcc.然后选择 ...
- leetcode70word-search
题目描述 给出一个二维字符数组和一个单词,判断单词是否在数组中出现, 单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻.同一单元格的字母不能多次使用. 例如: 给出的字符数组= [↵ [&q ...
- .NET 5 中的隐藏特性
前言 双十一当天 .NET 5 正式发布带来了很多的新特性和改进,个人觉得非常香,并且花了 10 分钟时间就把自己的 4 个 .NET Core 3.1 的项目升级到了 .NET 5,堪称无痛. 但是 ...
- W3C中不同标准的含义
学习CSS/HTML的过程中,当出现释义冲突时,W3C(万维网联盟)官网所陈列的技术标准是最核心的判断参考.但是新手在查阅W3C标准索引页面时,会发现同一个属性或者模型会出现多个不同的阶段规范展示结果 ...