上篇我们介绍了Consumer消费端服务列表刷新原理,地址如下
Dubbo源码解读-Consumer消费端服务列表刷新-优快云博客
本文主要针Dubbo消费端调用服务端流程,从dubbo源码角度进行解析。
大家可以好好仔细读一下本文。有疑问欢迎留言。
接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。
不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。
如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。
主要内容
- 类的调用流程
- 核心类
- Mock调用原理
- 消费端调用流程:消费端如何通过依赖注入代理对象,调用到服务端的
- 关于如何依赖注入的原理请查看文章:Dubbo源码解读-Consumer消费端@Reference服务端引用流程-优快云博客
消费端调服务端流程
消费端依赖注入服务端代理对象后,调用过程整体细节是比较复杂的。因为好多同学为了应付面试或者觉得细节流程太繁琐或者复杂,只想弄清楚相对简练的过程。所以对细节流程做了一个流程概述的部分,方便大家理解大概过程,以及应对面试。更详细的过程可关注详细流程。
类的调用流程
ReferenceBeanInvocationHandler.invoker()->InvokerInvocationHandler.invoker()->MockClusterInvoker.invoke()->FailOverClusterInvoker.invoker()[或者是其他集群容错配置类]->DubboInvoker.doInvoke()->调用NettyClient发送消息和接收服务端响应
其中NettyClient初始化以及调用流程会在后续文章详细介绍,都属于Netty的Api。
本文不需要关注。调用流程只需要了解到DubboInvoker即可。
核心类:
- MockClusterInvoker.invoke:消费端调用的入口逻辑。
- FailOverClusterInvoker.invoke:默认集群容错算法。调用了负载均衡算法,选择invoker。实现集群容错功能
- MockInvoker.invoke:实现Mock原理
- RandomLoadBalance:默认负载均衡器。随即权重,实现负载均衡算法
Mock实现原理
消费端以来注入的代理类,最终被代理的类为MockerClusterInvoker。实现Mock功能以及远程RPC调用功能。
- URL中获取Mock配置
- 如果没有mock信息,则走远程RPC调用
- 如果是force:则强制降级,调用本地方法(Mock原理,下面流程会详细叙述)
- 其他:则走RPC异常降级,先调用远程服务,如果发生RPC异常,则调用本地mock方法(2+3)
流程概述
消费端依赖代理对象,代理调用的入口为MockClusterInvoker.invoke持有集群容错类Cluster,默认FailOverCluster。MockClusterInvoker实现了Mock调用的原理
概述总结:
- MockClusterInvoker.invoke
- 从Url上获取配置的mock信息
- 如果没有mock走远程RPC。
- 获取服务列表(订阅事件,服务列表本地缓存)
- 获取负载均衡算法。抽象类AbstractClusterInvoker
- 调用子类具体集群容错类的doInvoke(),实现远程服务调用。
- 调用负载均衡算法选择一个Invoker.
- FailOverClusterInvoker:根据retry循环重试
- FailBackClusterInvoker:调用失败,则返回空new RpcResult(),并记录失败请求,异步定时调用
- FailFastClusterInvoker:如果RpcExpection,则直接抛出,不重试。
- FailSafeClusterInvoker:如果RpcExpection,记录日志,返回空new RpcResult()
- ForkingClusterInvoker:同时调用多台主机,返回响应最快主机的结果。
- BroadcastClusterInvoker:服务列表挨个调用一边,场景:刷新本地缓存。
- AvailableClusterInvoker.
- 如果force是强制降级,则走本地mock.
- 其他。走RPC异常降级。即先远程,如果发生RPC异常,则走本地(3+4)
更进一步总结
- MockClusterInvoker.invoke
- 从Url上获取配置的mock信息
- 如果没有mock走远程RPC。
- 获取服务列表(订阅事件,服务列表本地缓存)
- 获取负载均衡算法。抽象类AbstractClusterInvoker
- 获取集群容错算法。
- 利用负载均衡算法,选择一个Invoker
- 调用Invoker,判断是否失败。失败则执行集群容错
- 如果force是强制降级,则走本地mock.
- 其他。走RPC异常降级。即先远程,如果发生RPC异常,则走本地(3+4)
详细流程
- MockClusterInVoker.invoker():消费端调用核心流程
- 获取mock配置,是否有配置mock。
- directory.getUrl().getMethodParameter(invocation.getMethodName(), Constants.MOCK_KEY
- 如果没有,直接RPC调用
- this.i