dubbo ChannelHandler

Posted l2c

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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超时设置

Dubbo接口测试Dubbo接口调用Jmeter调用Dubbo接口,Jmeter测试Dubbo接口

Dubbo接口测试Dubbo接口调用Jmeter调用Dubbo接口,Jmeter测试Dubbo接口

dubbo教程-09-dubbo分布式事务 ? 看看dubbo作者怎么说 !

Dubbo学习(Dubbo2.6)

dubbo是如何启动的