Dubbo系列之Cluster容错机制和负载均衡机制(六)

本章介绍一下dubbo的cluster相关知识,可能主要有以下知识点:(对应的模块源码都是在dubbo-cluster模块中,整体理解起来难度相对于前面章节要容易很多)

& 集群容错架构之设计剥析

& 集群容错之drictory目录

& 集群容错之router路由

& 集群容错之cluster集群

& 集群容错之loadbalance负载均衡

接下来就按照上面的知识点进行分析吧,首先看一下整体架构设计,这个模块主要有directory,invoker,router,cluster,loadbalance进行组合起来的,可以看一下下面这个图,大概架构如下所示:


  • Invoker 是 Provider 的一个可调用 Service 的抽象,Invoker 封装了 Provider 地址及 Service 接口信息
  • Directory 代表多个 Invoker,可以把它看成 List<Invoker> ,但与 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
     */
    List<Invoker<T>> list(Invocation invocation) throws RpcException;

}

主要有两个实现类:StaticDirectory和RegistryDirectory

它从字面的意思就是可以知道,该类是静态的,不会发生变化的,所以它用的是比较少,主要是用来在服务对多注册中心的引用.

用的最多还是后面的这个类,很重要,它是真正实现了服务的注册和动态变化的通知,它主要是为了获取一组可用的服务列表.

router:通过某种过滤规则,把directory获取到的invoker列表进行了筛选,获取到一个可执行的子集invokers.

简单分析一下源码: 这个是接口


看一下对应的实现:



分别是基于条件过滤和脚本过滤两种机制,为了解耦又使用了工厂进行了封装:


且通过了adaptive这种自适应机制来获取的真正的路由实例.

在路由之后就需要通过负载均衡机制获取到一个真正执行的invoker了:

loadbalance:负载均衡

核心接口:


常用的实现:

基于hash一致性

:基于随机性

:基于轮询

:基于最少活跃调用数

在一个服务被提供使用,有可能会出现挂掉的现象,所以从高可用角度来说必须会有集群容错机制,dubbo中也提供了很多种方式,

cluster:集群容错

核心接口:


它默认提供了很多的实现,且针对每种实现都提供了一个对应的invoker去做真正的实现:请看


然后对应的Invoker来做实现:


最终的实现就是下面这个截图:


具体功能看下面的总结:

FailbackCluster:

>>失败自动恢复,后台记录失败请求,定时重发

>>通知用于消息通知

FailfastCluster:

>>快速失败,失败一次,立即报错

>>非幂等性的写操作,比如新增记录

FailoverCluster:

>>失败自动切换,当出现失败,重试其它服务器

>>通常用于读操作,但重试会带来更长延迟

FailSafeCluster:

>>失败安全,出现异常时,直接忽略

>>通常用于写入审计日志等操作

ForkingCluster:

>>并行调用多个服务器,只要一个成功即返回

>>通常用于实时性要求较高的读操作,但需要浪费更多服务资源。

MergeableCluster:

>>分组聚合, 按组合并返回结果

BroadCluster:

>>广播调用所有提供者,逐个调用,任意一台报错则报错

>>通常用于通知所有提供者更新缓存或日志等本地资源信息

这块代码比较好理解,而且可以复用,我们在其他开发框架中也会有类似的算法存在,自己在做一些客户端自定义sharding相关需求

都可以考虑借鉴dubbo的这块实现原理.

猜你喜欢

转载自blog.csdn.net/qq_18603599/article/details/80828581
今日推荐