转载

Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

Dubbo版本是2.7.3.Release. 在前面分析过Reference的过程中分析中,当注册注册的服务是多个实例的时候,会调用Cluster的扩展点的join方法,封装一个带有负载均衡的功能的Invoker

Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

这里Cluster默认扩展点可以出来Cluster类上看出来.默认是用FailoverCluster,也就是Failover集群容错模式,这里总结下集群容错的模式如下:

容错模式 实现方式
failover 集群中服务出现调用失败时,会自定调用另外一台
failsafe 集群中服务出现调用失败时,执行失败忽略返回空
failfast 集群中服务出现调用失败时,立即抛出异常
Failback 集群中服务出现调用失败时,执行失败重试着
Forking 集群中服务出现调用失败时,执行调用一批请求调用
Mergeable 集群中服务出现调用失败时,执行合并请求调用
Mock 集群中服务出现调用失败时,执行返回Mock数据
Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

可以看到通过传入Directory抽象类,直接new了一个FailoverClusterInvoker对象.接下来重点看下分析这个类实现逻辑

Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

这里主要可以看到是len默认是3次失败重试次数,下面是循环3次调用,然后对Ivokers集合进行执行负载均衡,选择一个Invoker,直到调用有结果就返回.这里调用doInvoker是父类AbstractClusterInvoker中抽象方法,

Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

AbstractClusterInvoker中invoker方法主要通过Directory抽象将Invocation转换成Invoker的一个集合(这里Directory是注册中心的抽象,这里通过注册中心信息的多个provider,转换成Invoker的集合),然欧初始化负载均衡扩展点, 这里如果实现异步调用,则会设置一个唯一的key为id,value是自动的值到attachment中,然后就是执行之前的doInvoke逻辑,

Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

加载loadbalance的时候,默认实现LoadBalance的扩展点

Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

默认实现是Random的负载均衡.这里说明下这里是实现的是加权随机算法, 这里总结下dubbo实现负载均衡算法主要四种:

负载均衡 算法描述
random 一种加权随机的负载均衡算法
RoundRobin 轮询算法
LeastActive 最不活跃算法
ConsistentHash 一致性Hash算法
Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

这就是RandomLoadBalance的doSelect方法实现权重的随机的算法,有兴趣可以下去研究下

Dubbo源码分析(七)-----Cluster集群容错和LoadBalace负载均衡机制分析

总结: 今天主要就Dubbo的Cluster集群容错和LoadBalance负载均衡算法实现的源码分析,结下来就是分析Directory抽象怎么实现Invokers的转换.

原文  https://juejin.im/post/5d57731d51882537930bae74
正文到此结束
Loading...