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进行回调结果处理
网友评论