dubbo笔记-remoting(6)收发请求

1. 三种发送请求

在DubboInvoker的doInvoke中调用

三种调用方式

  1. 同步
  2. 异步返回
  3. 异步不返回

之前已经介绍过ExchangeClient,可参考dubbo笔记-remoting(5)Exchanger

    protected Result doInvoke(final Invocation invocation) throws Throwable {
        RpcInvocation inv = (RpcInvocation) invocation;
        final String methodName = RpcUtils.getMethodName(invocation);
        inv.setAttachment(Constants.PATH_KEY, getUrl().getPath());
        inv.setAttachment(Constants.VERSION_KEY, version);

        ExchangeClient currentClient;
        if (clients.length == 1) {
            currentClient = clients[0];
        } else {
            currentClient = clients[index.getAndIncrement() % clients.length];
        }
        try {
            boolean isAsync = RpcUtils.isAsync(getUrl(), invocation);
            boolean isOneway = RpcUtils.isOneway(getUrl(), invocation);
            int timeout = getUrl().getMethodParameter(methodName, Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);
            if (isOneway) {
                boolean isSent = getUrl().getMethodParameter(methodName, Constants.SENT_KEY, false);
                currentClient.send(inv, isSent);
                RpcContext.getContext().setFuture(null);
                return new RpcResult();
            } else if (isAsync) {
                ResponseFuture future = currentClient.request(inv, timeout);
                RpcContext.getContext().setFuture(new FutureAdapter<Object>(future));
                return new RpcResult();
            } else {
                RpcContext.getContext().setFuture(null);
                return (Result) currentClient.request(inv, timeout).get();
            }
        } catch (TimeoutException e) {
            throw new RpcException(RpcException.TIMEOUT_EXCEPTION, "Invoke remote method timeout. method: " + invocation.getMethodName() + ", provider: " + getUrl() + ", cause: " + e.getMessage(), e);
        } catch (RemotingException e) {
            throw new RpcException(RpcException.NETWORK_EXCEPTION, "Failed to invoke remote method: " + invocation.getMethodName() + ", provider: " + getUrl() + ", cause: " + e.getMessage(), e);
        }
    }

参考:
Dubbo源码分析----发起请求

2. DefaultFuture

同步请求和异步返回内部实现实质是一样的,都是返回一个DefaultFuture,同步请求会调用DefaultFuture的get方法,阻塞等待线程结果返回,异步返回则将DefaultFuture返回给调用者,择机调用get方法
参考:Dubbo源码分析----DefaultFuture

3.接收请求

NettyServerHandler在接收到请求后会将请求转发到AllChannelHandler

AllChannelHandler会将请求在线程池中处理,ChannelEventRunnable是入口处理逻辑,最终会调用DubboProtocol的Invoker来调用方法执行

参考:
Dubbo源码分析----处理请求

4. Dispatcher

事件派发策略,上面的接收请求的AllChannelHandler就是接收事件派发策略的其中一种,即接收到请求都转到线程池中处理,还有其他处理方法
参考:Dubbo源码分析----Dispatcher和ThreadPool

4.请求超时处理

DefaultFuture静态构造函数里面会启动一个线程不断检查超时的请求处理

参考:
https://blog.csdn.net/lz710117239/article/details/77530536

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 孩子爸抱麒宝宝在客厅一边来回踱步一边唱卖报歌。 姐姐说:“我弟弟才不卖报呢,以后卖飞机”。 临睡觉女儿说:我好想跟...
    似水流年cxy阅读 8,038评论 6 4
  • 对象是真实存在的,类是对对象的共同特征的抽象和概括。对象实例化:类名 对象名 = new 类名();为字段赋值:对...
    今天庹阅读 3,097评论 0 1
  • 大学都快过去一半了,一年后再回到这个校园,看着原本熟悉的人真的颇为震惊。 喜欢滑板的学长已经又多跳了一立,喜欢英语...
    MonarchButterfl阅读 1,293评论 0 0
  • 之前,断断续续的用番茄时钟来让自己专注在当前的事情上,却一直没有深入学习过。一个偶然的机会,看见图书馆里有这么...
    b5f761f2103a阅读 2,795评论 0 4
  • 软件测试 黑盒测试:不知道软件的源代码 白盒测试: 知道应用程序的源代码 测试的力度 单元测试 junit te...
    姜水伟杰阅读 1,293评论 0 0