本章介绍一下dubbo的cluster相关知识,可能主要有以下知识点:(对应的模块源码都是在dubbo-cluster模块中,整体理解起来难度相对于前面章节要容易很多)
& 集群容错架构之设计剥析
& 集群容错之drictory目录
& 集群容错之router路由
& 集群容错之cluster集群
& 集群容错之loadbalance负载均衡
接下来就按照上面的知识点进行分析吧,首先看一下整体架构设计,这个模块主要有directory,invoker,router,cluster,loadbalance进行组合起来的,可以看一下下面这个图,大概架构如下所示:
Invoker
是 Provider
的一个可调用 Service
的抽象,Invoker
封装了 Provider
地址及 Service
接口信息Directory
代表多个 Invoker
,可以把它看成 List>
,但与 List
不同的是,它的值可能是动态变化的,比如注册中心推送变更Cluster
将 Directory
中的多个 Invoker
伪装成一个 Invoker
,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个Router
负责从多个 Invoker
中按路由规则选出子集,比如读写分离,应用隔离等LoadBalance
负责从多个 Invoker
中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选所以调用关系是:cluster->directory->router->loadbalance->invoker:
下面先分析一下directory:接口如下所示:主要有一个核心的方法就是list,用来获取某个服务在一个目录下面的所有列表
* @see com.alibaba.dubbo.rpc.cluster.Cluster#join(Directory) */ public interface Directory<T> extends Node { /** * get service type. * * @return service type. */ Class<T> getInterface(); /** * list invokers. * * @return invokers */ ListT>> list(Invocation invocation) throws RpcException; }
主要有两个实现类:StaticDirectory和RegistryDirectory
它从字面的意思就是可以知道,该类是静态的,不会发生变化的,所以它用的是比较少,主要是用来在服务对多注册中心的引用.
用的最多还是后面的这个类,很重要,它是真正实现了服务的注册和动态变化的通知,它主要是为了获取一组可用的服务列表.
router:通过某种过滤规则,把directory获取到的invoker列表进行了筛选,获取到一个可执行的子集invokers.
简单分析一下源码: 这个是接口
看一下对应的实现:
和
分别是基于条件过滤和脚本过滤两种机制,为了解耦又使用了工厂进行了封装:
且通过了adaptive这种自适应机制来获取的真正的路由实例.
在路由之后就需要通过负载均衡机制获取到一个真正执行的invoker了:
loadbalance:负载均衡
核心接口:
常用的实现:
在一个服务被提供使用,有可能会出现挂掉的现象,所以从高可用角度来说必须会有集群容错机制,dubbo中也提供了很多种方式,
cluster:集群容错
核心接口:
它默认提供了很多的实现,且针对每种实现都提供了一个对应的invoker去做真正的实现:请看
然后对应的Invoker来做实现:
最终的实现就是下面这个截图:
具体功能看下面的总结:
FailbackCluster:
>>失败自动恢复,后台记录失败请求,定时重发
>>通知用于消息通知
FailfastCluster:
>>快速失败,失败一次,立即报错
>>非幂等性的写操作,比如新增记录
FailoverCluster:
>>失败自动切换,当出现失败,重试其它服务器
>>通常用于读操作,但重试会带来更长延迟
FailSafeCluster:
>>失败安全,出现异常时,直接忽略
>>通常用于写入审计日志等操作
ForkingCluster:
>>并行调用多个服务器,只要一个成功即返回
>>通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
MergeableCluster:
>>分组聚合, 按组合并返回结果
BroadCluster:
>>广播调用所有提供者,逐个调用,任意一台报错则报错
>>通常用于通知所有提供者更新缓存或日志等本地资源信息
这块代码比较好理解,而且可以复用,我们在其他开发框架中也会有类似的算法存在,自己在做一些客户端自定义sharding相关需求
都可以考虑借鉴dubbo的这块实现原理.