Dubbo源码解读-Consumer调用流程解析

上篇我们介绍了Consumer消费端服务列表刷新原理,地址如下

Dubbo源码解读-Consumer消费端服务列表刷新-优快云博客

        本文主要针Dubbo消费端调用服务端流程,从dubbo源码角度进行解析。

        大家可以好好仔细读一下本文。有疑问欢迎留言。

        接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。

         不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。

        如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。

主要内容

消费端调服务端流程

        消费端依赖注入服务端代理对象后,调用过程整体细节是比较复杂的。因为好多同学为了应付面试或者觉得细节流程太繁琐或者复杂,只想弄清楚相对简练的过程。所以对细节流程做了一个流程概述的部分,方便大家理解大概过程,以及应对面试。更详细的过程可关注详细流程。

类的调用流程

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调用功能。

  1. URL中获取Mock配置
  2. 如果没有mock信息,则走远程RPC调用
  3. 如果是force:则强制降级,调用本地方法(Mock原理,下面流程会详细叙述)
  4. 其他:则走RPC异常降级,先调用远程服务,如果发生RPC异常,则调用本地mock方法(2+3)

流程概述

        消费端依赖代理对象,代理调用的入口为MockClusterInvoker.invoke持有集群容错类Cluster,默认FailOverCluster。MockClusterInvoker实现了Mock调用的原理

概述总结:

  1. MockClusterInvoker.invoke
  2. 从Url上获取配置的mock信息
  3. 如果没有mock走远程RPC。
    1. 获取服务列表(订阅事件,服务列表本地缓存)
    2. 获取负载均衡算法。抽象类AbstractClusterInvoker
    3. 调用子类具体集群容错类的doInvoke(),实现远程服务调用。
      1. 调用负载均衡算法选择一个Invoker.
      2. FailOverClusterInvoker:根据retry循环重试
      3. FailBackClusterInvoker:调用失败,则返回空new RpcResult(),并记录失败请求,异步定时调用
      4. FailFastClusterInvoker:如果RpcExpection,则直接抛出,不重试。
      5. FailSafeClusterInvoker:如果RpcExpection,记录日志,返回空new RpcResult()
      6. ForkingClusterInvoker:同时调用多台主机,返回响应最快主机的结果。
      7. BroadcastClusterInvoker:服务列表挨个调用一边,场景:刷新本地缓存。
      8. AvailableClusterInvoker.
  4. 如果force是强制降级,则走本地mock.
  5. 其他。走RPC异常降级。即先远程,如果发生RPC异常,则走本地(3+4)

更进一步总结

  1. MockClusterInvoker.invoke
  2. 从Url上获取配置的mock信息
  3. 如果没有mock走远程RPC。
    1. 获取服务列表(订阅事件,服务列表本地缓存)
    2. 获取负载均衡算法。抽象类AbstractClusterInvoker
    3. 获取集群容错算法。
      1. 利用负载均衡算法,选择一个Invoker
      2. 调用Invoker,判断是否失败。失败则执行集群容错
  4. 如果force是强制降级,则走本地mock.
  5. 其他。走RPC异常降级。即先远程,如果发生RPC异常,则走本地(3+4)

详细流程

  1.  MockClusterInVoker.invoker():消费端调用核心流程
  2. 获取mock配置,是否有配置mock。
    1. directory.getUrl().getMethodParameter(invocation.getMethodName(), Constants.MOCK_KEY 
  3. 如果没有,直接RPC调用
    1. this.i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值