美文网首页
Consumer调用服务端的过程

Consumer调用服务端的过程

作者: 蹩脚的小三 | 来源:发表于2019-03-11 15:38 被阅读0次

    Consumer调用服务端的过程:

    首先在ReferenceConfig根据协议(比如DubboProtocol),把远端服务转换为Invoker(比如DubboInvoker),再通过ProxyFactory.getProxy把Invoker转换为客户端需要的接口。

    DubboInvoker.doInvoke -> ReferenceCountExchangeClient.request -> HeaderExchangeClient.request -> HeaderExchangeChannel.request ->

    AbstractClient.send -> NettyChannel.send -> NioClientSocketChannel.write -> netty内部.... SimpleChannelHandler.writeRequested ->

    NettyHandler.writeRequested -> 1、RemotingInvocationTimeoutScan遍历(Map<Long, DefaultFuture> FUTURES)-> DefaultFuture.received -> HeaderExchangeHandler.sent -> DefaultFuture.get

      2、NettyHandler.messageReceived -> ChannelHandler.received -> DefaultFuture.received -> HeaderExchangeHandler.sent -> DefaultFuture.get

    第 8 行:获得开始时间。注意,此处使用的不是 start 属性。后面我们会看到,#get(...) 方法中,使用的是重新获取开始时间;后台扫描调用超时任务(RemotingInvocationTimeoutScan),

    使用的是 start 属性。也就是说,#get(timeout) 方法的 timeout 参数,指的是从当前时刻开始的等待超时时间。当然,这不影响最终的结果,最终 Response 是什么,由是 ChannelHandler#received(channel, message) 还是后台扫描调用超时任务,谁先调用 DefaultFuture#received(channel, response) 方法决定。🙂 有点绕,胖友细看下。

    然后客户端在调用服务的时候首先调用DubboInvoker.doInvoke;

    在DubboInvoker.doInvoke方法里面继续遍历clients,依次调用客户端的request方法:ReferenceCountExchangeClient.request;

    在ReferenceCountExchangeClient.request方法里面再调用HeaderExchangeClient.request;

    HeaderExchangeClient.request里面再调用HeaderExchangeChannel.request方法;

    HeaderExchangeChannel.request会调用AbstractClient.send方法,AbstractClient实现client,client继承Channel,AbstractClient作为Channel在HeaderExchangeChannel构造方

    法的时候传入;

    AbstractClient.send里面调用NettyChannel的send方法;

    NettyChannel的send方法调用NioClientSocketChannel的write方法,NioClientSocketChannel属于netty内部实现,

    然后在NioClientSocketChannel调用write方法的时候netty会调用SimpleChannelHandler.writeRequested方法,NettyHandler继承于SimpleChannelHandler,

    调用完SimpleChannelHandler.writeRequested之后会继续调用NettyHandler,然后继续依次调用dubbo内部实现的其他handler

    正常情况下会调用NettyHandler.messageReceived,然后再调用ChannelHandler.received,在ChannelHandler.received里面调用DefaultFuture.received方法

    DefaultFuture.received里面会调用DefaultFuture.invokeCallback进行回调结果处理

    相关文章

      网友评论

          本文标题:Consumer调用服务端的过程

          本文链接:https://www.haomeiwen.com/subject/eudbpqtx.html