深度解析dubbo网路传输层ChannelHandler

本文基于dubbo v2.6.x

1. ChannelHandler

ChannelHandler 是dubbo 对于Channel事件处理的抽象,它抽象了五个事件,分别是连接的时候,断开连接的时候,消息发送完成的时候,接收到消息的时候,发生异常的时候,我们来看下它的定义

@SPI
public interface ChannelHandler {
    /**
     * on channel connected.
     * @param channel channel.
     */
    void connected(Channel channel) throws RemotingException;
    /**
     * on channel disconnected.
     * @param channel channel.
     */
    void disconnected(Channel channel) throws RemotingException;
    /**
     * on message sent.
     * @param channel channel.
     * @param message message.
     */
    void sent(Channel channel, Object message) throws RemotingException;
    /**
     * on message received.
     * @param channel channel.
     * @param message message.
     */
    void received(Channel channel, Object message) throws RemotingException;

    /**
     * on exception caught.
     * @param channel   channel.
     * @param exception exception.
     */
    void caught(Channel channel, Throwable exception) throws RemotingException;
}

我们介绍dubbo网络传输层其他组件的时候或多或少的提到过ChannelHandler ,它有贼多的实现类,通过委派设计模式,当事件发生的时候会一层一层的处理,从网络传输层一直到信息交换层。接下来我们就从信息交换层开始,看看它是怎样包装的,然后再从事件的角度出发,看看是怎样从网络传输层一层一层的委派到信息交换层的。

2. 一层一层包装

这里从服务暴露时创建服务器说起,然后一直到doOpen真实打开服务器监听,看看ChannelHandler是怎样一层一层包装的。

2.1 requestHandler

requestHandler 是个ExchangeHandler,同时还是TelnetHandler的适配器,属于DubboProtocol的一个成员变量。说到它我们需要看下ExchangeHandler 接口的定义:
在这里插入图片描述
我们看到ExchangeHandler接口继承了ChannelHandler 与TelnetHandler接口,自己抽象了一个reply回答方法。
在requestHandler 中它不仅实现了ChannelHandler接口的方法,还实现了ExchangeHandler的reply方法。在reply的实现中,寻找invoker,然后进行具体调用,最后将调用结果返回。
在这里插入图片描述

2.2 HeaderExchangeHandler

在DubboProtocol的createServer方法创建server的时候通过Exchangers的bind方法获得了Server对象,这个bind会将url与requestHandler 传入
在这里插入图片描述
通过Exchangers这个门面类,经过了dubbo spi获得Exchanger 具体实现HeaderExchanger ,在HeaderExchanger的bind方法中,对这个requestHandler 包了一层HeaderExchangeHandler:
在这里插入图片描述
HeaderExchangeHandler 实现了 ChannelHandlerDelegate 接口,该接口是个委派接口,抽象了获取委派handler,这里获得的委派handler就是requestHandler。在HeaderExchangeHandler 中主要是细化了接收消息的处理,将接受的消息根据类型做不同的处理,比如说Request交给handleRequest方法处理,Response 交给handleResponse 处理等等,同时实现了将Request转成 Invocation ,Response转成Result。

2.3 DecodeHandler

在 2.2 HeaderExchangeHandler 章节中我们介绍了HeaderExchanger的bind方法,在bind方法中,DecodeHandler 还包装了HeaderExchangeHandler,它主要是实现了对接收过来的消息按照类型进行解码,然后在委托给HeaderExchangeHandler 处理。
在这里插入图片描述

2.4 DispatcherHandler

这里这个DispatcherHandler表示的是一组handler,它是Dispatcher(Dispatcher 就是线程派发器) 接口的实现们。
接下来我们引用下官方文档原话介绍下线程派发器:

需要说明的是,Dispatcher 真实的职责创建具有线程派发能力的 ChannelHandler,比如 AllChannelHandler、MessageOnlyChannelHandler 和 ExecutionChannelHandler 等,其本身并不具备线程派发能力。Dubbo 支持 5 种不同的线程派发策略,下面通过一个表格列举一下

在这里插入图片描述
注意: Dispatcher的默认实现是AllDispatcher ,也是上面的all,所有的消息都派发到线程池,它对应的就是AllChannelHandler 这个ChannelHandler实现。

2.5 HeartbeatHandler

接着再往下就是HeartbeatHandler 了,该handler的作用就是判断收到的消息是否是心跳请求,如果是心跳请求就进行心跳回复,其他消息就委托给里面那层,在这里也就是DispatcherHandler 这层。
在这里插入图片描述

2.6 MultiMessageHandler

再往下就是MultiMessageHandler 这个多消息处理的handler了,它主要就是判断收到的消息是否是MultiMessage 类型(复合型消息),如果是的话,就转成list,遍历委托给里面那层的handler处理。
在这里插入图片描述

2.7 AbstractPeer

AbstractPeer 这个是个抽象类,实现了ChannelHandler接口,Server 与Client的具体实现会继承它,它主要是实现了端点关闭的判断功能,然后有将 消息交给 里面那层处理
在这里插入图片描述

2.8 NettyServerHandler

NettyServerHandler 实现ChannelDuplexHandler ,ChannelDuplexHandler是netty的一个事件handler,NettyServerHandler同时还维护了ChannelHandler引用,NettyServerHandler就相当于 NettyChannelHandler 与DubboChannelHandler的一个适配。它将NettyChannelHandler的事件 委托给DubboChannelHandler处理,同时实现了NettyChannel 到DubboChannel的转变。
先来看下连接成功事件实现处理:
在这里插入图片描述
可以看出来,先通过netty channel获取dubbo channel,然后将这个连接成功事件委托给dubbo channel handler的connected方法来处理。同理 断开连接,接受消息,发送回调,异常 也是同样处理的。

2.9 总结

我们把上面这堆handler 进行总结一下,它是从requestHandler 开始开始一层一层进行包装的,最后包装到NettyServerHandler 。
– NettyServerHandler
– AbstractPeer
– MultiMessageHandler
– HeartbeatHandler
– DispatcherHandler
– DecodeHandler
– HeaderExchangeHandler
– requestHandler
在这里插入图片描述

3. 一层一层委派

在第二章节我们介绍了它是一层一层包装的,然后在处理事件的时候,他就会从最外层开始 一层一层进行委派处理,每一层实现了不同的功能。这里我就不详细展开各个handler的具体实现了。

tcp
----》 NettyServerHandler
----》 AbstractPeer
----》MultiMessageHandler
----》HeartbeatHandler
----》DispatcherHandler
----》DecodeHandler
----》HeaderExchangeHandler
-----》requestHandler
在这里插入图片描述

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页