ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

dubbo的集群容错和路由负载

2021-02-19 21:31:43  阅读:261  来源: 互联网

标签:dubbo 容错 cluster rpc invocation apache org 路由


前面看完了服务的引用:dubbo的服务引用

在服务引用最终的就是生成了一个代理类,那么在调用某个被代理的接口时,实际上就是通过代理类去调用的,同时在实际调用之前做了容错、路由、负载等等。实际上每个调用都会从org.apache.dubbo.rpc.proxy.InvokerInvocationHandler#invoke代理
在这里插入图片描述
在这个方法中,会把我们的目标Invoker和参数封装成org.apache.dubbo.rpc.RpcInvocation#RpcInvocation(java.lang.reflect.Method, java.lang.String, java.lang.Object[]),然后会调用invoker.invoke(rpcInvocation)到达集群处理:org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker#invoke
在这里插入图片描述

这个方法里面我们依旧继续跟进会到达:org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke
在这里插入图片描述

  1. 这里我们先看list(invocation);方法,跟进去继续看在这里插入图片描述
    这里开始进入目录查找directory.list(invocation),这里接下来是一个很长的调用链路,就直接标记一下走过去:org.apache.dubbo.rpc.cluster.directory.AbstractDirectory#list➡️ org.apache.dubbo.registry.integration.RegistryDirectory#doList➡️ org.apache.dubbo.rpc.cluster.RouterChain#route➡️ org.apache.dubbo.rpc.cluster.router.mock.MockInvokersSelector#route➡️ org.apache.dubbo.rpc.cluster.router.mock.MockInvokersSelector#getNormalInvokers
    这一串调用下来,目的就是进入directory通过route获取目标的Invoker
  2. 然后回到org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke,开始负载均衡:initLoadBalance(invokers, invocation)
    在这里插入图片描述
    这里是个SPI获取的动态代理类,实际获取的是org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
  3. 然后回到org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke,继续跟进到:doInvoke(invocation, invokers, loadbalance),然后会走到:org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke失败转移容错,当出现失败是尝试其他服务器在这里插入图片描述
    然后跟进到:Invoker<T> invoker = select(loadbalance, invocation, copyInvokers, invoked)在这里插入图片描述
    这个方法是在从负载规则中查找一个可用的Invoker,进入doSelect(loadbalance, invocation, invokers, selected)
    在这里插入图片描述
    这个方法中看:loadbalance.select(invokers, getUrl(), invocation),跟进会到达org.apache.dubbo.rpc.cluster.loadbalance.AbstractLoadBalance#select抽象类在这里插入图片描述
    doSelect(invokers, url, invocation)会进入:org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance#doSelect在这里插入图片描述
    这个是dubbo的随机取模算法,后面有空写一下这个算法的详细过程补到这里,这里我们先了解他从多个服务invokers(该方法入参)中选择一个可用的进行返回就行,这个入参invokers一个接口的多个集群提供。

然后回到了org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke中:
在这里插入图片描述
选择到一个Invoker之后去执行这个方法获取结果并把结果返回。

标签:dubbo,容错,cluster,rpc,invocation,apache,org,路由
来源: https://blog.csdn.net/qq_34203492/article/details/113871260

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有