分类:知识要点 日期:2022-03-21 作者:yxy 浏览:1094
调用链分析
动态代理对象
com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler#invoke
MockClusterInvoker
AbstractClusterInvoker
DubboInvoker
com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeChannel#request(java.lang.Object, int)
ExchangeClient;
接口的代理对象执行目标方法,
InvokerInvocationHandler#invoke,
进入代理过程。经过路由过滤、负载均衡,
选择一个DubboInvoker,执行doInvoker方法。
先是创建一个请求对象(Request),并生成全局唯一的ID。接着,
创建DefaultFuture,并保存到ConcurrentHashMap中,key是请求ID。
最后通过NettyClient把封装了目标方法信息的RpcInvocation序列化成消息发送出去
接收到返回的响应结果,调用DefaultFuture#received方法,
根据返回的请求ID,找到对应的DefaultFuture。接着调用doReceived方法,保存响应结果,并唤醒请求线程。最后,解析并返回执行结果
com.alibaba.dubbo.remoting.transport.dispatcher.all.AllChannelHandler#received
com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable#run
com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler#handleRequest
com.alibaba.dubbo.remoting.exchange.support.ExchangeHandlerAdapter#reply
NettyServer接收到请求后,解析成信息,
并全部派发到线程池,
封转成ChannelEventRunnable对象,
等待线程执行。工作线程调用DubboProtocol#reply方法,
构建serviceKey,从缓存中找到对应的Exporter,
并执行invoke方法,最终找到真正实现类,执行目标方法并返回结果。