Dubbo版本是2.7.3.Release. 在前面分析过Reference的过程中分析中,当注册注册的服务是多个实例的时候,会调用Cluster的扩展点的join方法,封装一个带有负载均衡的功能的Invoker
这里Cluster默认扩展点可以出来Cluster类上看出来.默认是用FailoverCluster,也就是Failover集群容错模式,这里总结下集群容错的模式如下:
容错模式 | 实现方式 |
---|---|
failover | 集群中服务出现调用失败时,会自定调用另外一台 |
failsafe | 集群中服务出现调用失败时,执行失败忽略返回空 |
failfast | 集群中服务出现调用失败时,立即抛出异常 |
Failback | 集群中服务出现调用失败时,执行失败重试着 |
Forking | 集群中服务出现调用失败时,执行调用一批请求调用 |
Mergeable | 集群中服务出现调用失败时,执行合并请求调用 |
Mock | 集群中服务出现调用失败时,执行返回Mock数据 |
可以看到通过传入Directory抽象类,直接new了一个FailoverClusterInvoker对象.接下来重点看下分析这个类实现逻辑
这里主要可以看到是len默认是3次失败重试次数,下面是循环3次调用,然后对Ivokers集合进行执行负载均衡,选择一个Invoker,直到调用有结果就返回.这里调用doInvoker是父类AbstractClusterInvoker中抽象方法,
AbstractClusterInvoker中invoker方法主要通过Directory抽象将Invocation转换成Invoker的一个集合(这里Directory是注册中心的抽象,这里通过注册中心信息的多个provider,转换成Invoker的集合),然欧初始化负载均衡扩展点, 这里如果实现异步调用,则会设置一个唯一的key为id,value是自动的值到attachment中,然后就是执行之前的doInvoke逻辑,
加载loadbalance的时候,默认实现LoadBalance的扩展点
默认实现是Random的负载均衡.这里说明下这里是实现的是加权随机算法, 这里总结下dubbo实现负载均衡算法主要四种:
负载均衡 | 算法描述 |
---|---|
random | 一种加权随机的负载均衡算法 |
RoundRobin | 轮询算法 |
LeastActive | 最不活跃算法 |
ConsistentHash | 一致性Hash算法 |
这就是RandomLoadBalance的doSelect方法实现权重的随机的算法,有兴趣可以下去研究下
总结: 今天主要就Dubbo的Cluster集群容错和LoadBalance负载均衡算法实现的源码分析,结下来就是分析Directory抽象怎么实现Invokers的转换.