您现在的位置是:主页 > news > 两学一做党员考试网站/长沙优化官网服务
两学一做党员考试网站/长沙优化官网服务
admin2025/4/28 8:46:45【news】
简介两学一做党员考试网站,长沙优化官网服务,wordpress主题dux,app开发外包服务本文基于dubbo v2.6.x 1. ChannelHandler ChannelHandler 是dubbo 对于Channel事件处理的抽象,它抽象了五个事件,分别是连接的时候,断开连接的时候,消息发送完成的时候,接收到消息的时候,发生异常的时候&…
本文基于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