dubbo的handler机制

Dubbo的整套handler。。。反正我刚看的时候挺头疼。从Protocol层到Transporter层。纵深3层。从DubboProtocol构建,被逐层传递到NettyServer,然后在逐层返回。整个过程中,还被不断包裹,从同步到异步,不停变换用法和说法。总之,看得挺累,还是坚持逐个分析一遍。下面来说说。

先看一张图,是使用Dubbo Protocol并且使用Netty作为服务器的情况下Handler的整个包装过程。

解释下上面这张图

1.在DubboProtocol中构建ExchangeHandler命名requestHandler

2.在Exchange层做两次包装new DecodeHandler(new HeaderExchangeHandler(requestHandler)),具体参考类:HeaderExchanger

​ ① 使用HeaderExchangeHandler做一次包装,HeaderExchangeHandler的作用是实现了Request和Response的概念,当接到received请求后,将请求转为reply。请参考类HeaderExchangeHandler,对这部分不熟悉的可以参考文章dubbo的exchange层

​ ② 使用DecodeHandler做一次包装,DecodeHandler的作用是用来对Request MessageResponse Message做解码操作,解码完成后才能给HeaderExchangeHandler使用。

3.在Exchange层包装后的Handler会被传递到Transporter层(NettyTransporter)并且把类型转换成ChannelHandler,因为ChannelHandler更为抽象。

4.HandlerTransporter层流转,会被传递到NettyServer

5.在NettyServer中被AllChannelHandler包装,其作用是把NettyServer接收到的请求转移给Transporter层的线程池来处理。同步转异步。

6.Handler被再次NettyServerHandler包装,NettyServerHandler的父类是ChannelDuplexHandler。它属于NettyHandler。由Netty来管理和调用其中的回调方法。Netty在接受到channelActivechannelRead等方法后,会把请求转移给DubboHandler,这样每当请求过来,NettyHandler接到请求就立马把数据和相关信息转交给DubboHandler,由DubboHandler来管理了。

上述的整个包装过程基本提现了Dubbo ProtocolHandler的转移过程。从DubboProtocol构建逐层向下传递。当Netty接到TCP请求后,调用过程又逐层向上传递。下面看下几个关键转折点的代码。

1.请参考DubboProtocol类,Dubbo Handler初始化创建的地方。

private ExchangeHandler requestHandler = new ExchangeHandlerAdapter() {
   
	// ----------------------此处省略一堆代码------------------------
};

2.下面看下HeaderExchangeHandlerRequestResponse概念重点提现的地方

public class HeaderExchangeHandler implements ChannelHandlerDelegate {
   
  	// ----------------------此处生路一堆代码------------------------
  	@Override // 接受信息
    public void received(Channel channel, Object message) throws RemotingException {
   
        channel.setAttribute(KEY_READ_TIMESTAMP, System.currentTimeMillis());
        ExchangeChannel exchangeChannel = HeaderExchangeChannel.getOrAddChannel(channel);
        try {
   
            if (message instanceof Request) {
   // 看看信息是不是Request
                // handle request.
                Request request = (Request) message;
                if (request.isEvent()) {
   
                    handlerEvent(channel, request);
                } else {
   
                    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值