入口
MockClusterInvoker.invoke
AbstractClusterInvoker.invoke
list(invocation) ->RegistryDirectory.doList
这个list方法最终会调用到RegistryDirectory.doList
这个方法会调用routerChain.route
RouterChain.route
AbstractClusterInvoker.invoke
abstractClusterInvoker.invoke会最终执行到FailoverClusterInvoker.doInvoke
FailoverClusterInvoker.doInvoke
这里的invoker.invoke 会调用到InvokerWrapper.invoke(invocation)
InvokerWrapper.invoke
invoker.invoke最终会调用到 ProtocalFilterWrapper.invoke
ProtocalFilterWrapper.invoke
开始执行Filter链,执行完得到结果后,会获取ListenableFilter中的listener,执行listener的onResponse方法
ConsumerContextFilter.invoke(invocation)
设置RpcContext中LocalAddress、RemoteAddress、RemoteApplicationName参数
FutureFilter.invoke(invocation)
fireInvokeCallback, 具体做了什么,跳过
MonitorFilter.invoke(invocation)
方法的执行次数+1
注意,这里的invoker.invoke 会调用到ListenerInvokerWrapper.invoke(invocation),但是实际上鸟事没做
ListenerInvokerWrapper.invoke(invocation)
这里会调用到AsyncToSyncInvoker.invoke(invocation)
AsyncToSyncInvoker.invoke(invocation)
- 调用下层继续异步执行,下层调用的是AbstractInvoker.invoke
- 如果是同步的话,会阻塞
AbstractInvoker.invoke
主要调用DubboInvoker的doInvoke方法,如果doInvoker方法出现了异常,会进行包装,包装成AsyncRpcResult
DubboInvoker.doInvoke
总结一下:
- 从clients轮询出一个client进行数据发送,如果配置了不关心结果,则调用ReferenceCountExchangeClient的send方法
- 否则调用ReferenceCountExchangeClient的request方法
ReferenceCountExchangeClient.request(Object request, int timeout)
ReferenceCountExchangeClient:
request:会调用headerExchangeClient.request
HeaderExchangeClient.request
HeaderExchangeClient:
内部有:nettyClient、HeaderExchangeChannel
request:
会调用HeaderExchangeChannel.request
HeaderExchangeChannel.request
构造一个Request对象,并且会构造一个DefaultFuture对象来阻塞timeout的时间来等待结果,在构造DefaultFuture对象时,会把DefaultFuture对象和req的id存入FUTURES中,FUTURES是一个Map,当HeaderExchangeHandler接收到结果时,会从这个Map中根据id获取到DefaultFuture对象,然后返回Response。
这里的channel.send 真正调用的是AbstractPeer.send(Object message)
AbstractPeer.send(Object message)
这里会调用到AbstractClient.send(Object message, boolean sent)
AbstractClient.send(Object message, boolean sent)
NettyChannel.send(Object message, boolean sent)
NettyChannel.send(Object message, boolean sent)
调用NioSocketChannel的writeAndFlush发送数据,然后判断send如果是true,那么则阻塞url中指定的timeout时间,因为如果send是false,在HeaderExchangeChannel中会阻塞timeout时间
NioSocketChannel.writeAndFlush(Object msg)
最底层的Netty非阻塞式的发送数据
总结
最后用一张图总结: