dubbo源码分析第十五篇一dubbo远程调用第五小节一消费端接收消息响应应用程序

流程图示

  • 通过编解码器完成解码
  • 通过nettyClientHander衔接dubbohandler和netty handler
  • nettyClient 作用dubbo handler 的总入口触发MultiMessageHandler到HandlerExchangeHandler的调用
  • HandlerExchangeHandler为消费者接收响应的调用终止,比服务端接收request的处理少一步dubboProtocol.requestHandler处理

在这里插入图片描述

HeaderExchangeHandler.handleResponse一消费者接收响应

  • 从编解码到nettyClientHandler到nettyClient到MultiMessageHandler…DecodeHandler流程与提供者接收request消息流程基本一致,不在重复叙述
  • 区别就是nettyClient与NettyServer不同,功能基本一致
  • 处理响应
  • 通过Response.id获取DefaultFuture
  • 设置DefaultFuture.complete为res.getResult
  • 激活AsyncToSyncInvoker的asyncResult.get
  • 返回biz层dubbo接口的值
static void handleResponse(Channel channel, Response response) throws RemotingException {
    if (response != null && !response.isHeartbeat()) {
         通过id 交给 DefaultFuture完成请求响应
        DefaultFuture.received(channel, response);
    }
}


public static void received(Channel channel, Response response) {
    received(channel, response, false);
}

public static void received(Channel channel, Response response, boolean timeout) {
    try {
        获取Response的id 根据id获取future [future 在消费者发送request时设置,并且id为request.id]
        request到达服务提供者时,服务提供者构建Response,设置Response.id = request.id
        服务提供者发送Response到消费者
        所以这里根据Response.id能获取原来构建的future对象
        DefaultFuture future = FUTURES.remove(response.getId());
        if (future != null) {
            Timeout t = future.timeoutCheckTask;
            if (!timeout) {
                t.cancel();
            }
            future接收response会取消AsyncToSyncInvoker.get的阻塞
            业务线程便获取到了Response[rpc层在对Response进行一些处理转成业务接口的目标对象]
            设置DefaultFuture.complete为res.getResult()
            future.doReceived(response);
        } else {
            ...... 删除日志代码
        }
    } finally {
        CHANNELS.remove(response.getId());
    }
}

图解
在这里插入图片描述

总结

  • 至此.概述了消费者到服务提供者的远程通信rpc-remote架构模型
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值