dubbo调用链分析

分类:知识要点 日期:2022-03-21 作者:yxy 浏览:795

调用链分析

客户端端

动态代理对象

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方法,最终找到真正实现类,执行目标方法并返回结果。

评论 (暂无评论)

发表评论

昵称:  
邮箱:  
网址: