Dubbo笔记 ⑫ :Dubbo 集群组件概述

一、前言

本系列为个人Dubbo学习笔记,内容基于《深度剖析Apache Dubbo 核心技术内幕》, 过程参考官方源码分析文章,仅用于个人笔记记录。本文分析基于Dubbo2.7.0版本,由于个人理解的局限性,若文中不免出现错误,感谢指正。


本文部分内容来源于官方文档。作为Dubbo集群组件分析的开篇文章。

集群组件相关文章:

  1. Dubbo笔记⑫ :Dubbo 集群组件概述
  2. Dubbo笔记⑬ :Dubbo 集群组件 之 Cluster & ClusterInvoker
  3. Dubbo笔记⑭ :Dubbo集群组件 之 Directory
  4. Dubbo笔记⑮ :Dubbo集群组件 之 Router
  5. Dubbo笔记⑯ :Dubbo集群组件 之 LoadBalance

1. 简介

为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样,在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题,服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接口 Cluster 以及 Cluster Invoker。集群 Cluster 用途是将多个服务提供者合并为一个 Cluster Invoker,并将这个 Invoker 暴露给服务消费者。这样一来,服务消费者只需通过这个 Invoker 进行远程调用即可,至于具体调用哪个服务提供者,以及调用失败后如何处理等问题,现在都交给集群模块去处理。集群模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是集群的作用。

2. 工作过程

集群工作过程可分为两个阶段:

  1. 第一个阶段是在服务消费者初始化期间,集群 Cluster 实现类为服务消费者创建 Cluster Invoker 实例,即上图中的 merge 操作。

  2. 第二个阶段是在服务消费者进行远程调用时。以 FailoverClusterInvoker 为例,该类型 Cluster Invoker 首先会调用 Directory 的 list 方法列举 Invoker 列表(可将 Invoker 简单理解为服务提供者)。Directory 的用途是保存 Invoker,可简单类比为 List< Invoker >。其实现类 RegistryDirectory 是一个动态服务目录,可感知注册中心配置的变化,它所持有的 Invoker 列表会随着注册中心内容的变化而变化。每次变化后,RegistryDirectory 会动态增删 Invoker,并调用 Router 的 route 方法进行路由,过滤掉不符合路由规则的 Invoker。当 FailoverClusterInvoker 拿到 Directory 返回的 Invoker 列表后,它会通过 LoadBalance 从 Invoker 列表中选择一个 Invoker。最后 FailoverClusterInvoker 会将参数传给 LoadBalance 选择出的 Invoker 实例的 invoke 方法,进行真正的远程调用。

Dubbo集群组件包含 Cluster、Cluster Invoker、Directory、Router 和 LoadBalance 等。

关于其调用流程如下图:
在这里插入图片描述

整个集群工作流程如下:

ClusterInvoker#invoke-> Directory#list -> Router#route -> LoadBalance#select

二、组件介绍

1. Cluster & Cluster Invoker

Dubbo集群容错中存在两个概念,分别是集群接口 Cluster 和 Cluster Invoker,这两者是不同的。Cluster 是接口,而 Cluster Invoker 是一种 Invoker。服务提供者的选择逻辑,以及远程调用失败后的的处理逻辑均是封装在 Cluster Invoker 中。而 Cluster 接口和相关实现类的用途比较简单,仅用于生成 Cluster Invoker。简单来说,Cluster 就是用来创建 Cluster Invoker 的,并且一一对应。而Cluster 和 Cluster Invoker 的作用就是,在消费者进行服务调用时选择何种容错策略,如:服务调用失败后是重试、还是抛出异常亦或者返回一个空的结果集等。

详细分析文章 : Dubbo笔记⑬ :Dubbo 集群组件 之 Cluster & ClusterInvoker

2. Directory

Directory 即服务目录, 服务目录中存储了一些和服务提供者有关的信息,通过服务目录,服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。通过这些信息,服务消费者就可通过 Netty 等客户端进行远程调用。而实际上服务目录在获取注册中心的服务配置信息后,会为每条配置信息生成一个 Invoker 对象,并把这个 Invoker 对象存储起来,这个 Invoker 才是服务目录最终持有的对象。简单来说,Directory 中保存了当前可以提供服务的服务提供者列表集合。当消费者进行服务调用时,会从 Directory 中按照某些规则挑选出一个服务提供者来提供服务。

详细分析文章 :Dubbo笔记⑭ :Dubbo集群组件 之 Directory

3. Router

服务路由包含一条路由规则,路由规则决定了服务消费者的调用目标,即规定了服务消费者可调用哪些服务提供者。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由,筛选出符合路由规则的服务提供者。简单来说, Router制定了一些服务规则,Directory 中的服务提供者列表必须要满足 Router 规则才能作为候选服务提供者列表。

详细分析文章 :Dubbo笔记⑮ :Dubbo集群组件 之 Router

4. LoadBalance

当服务提供方是集群时,为了避免大量请求一直集中在一个或者几个服务提供方机器上,从而使这些机器负载很高,甚至导致服务不可用,需要做一定的负载均衡策略。Dubbo提供了多种均衡策略,默认为random,也就是每次随机调用一台服务提供者的服务。简单来说,LoadBalance 制定了某种策略,让请求可以按照某种规则(随机、hash 等)分发到服务提供者的机器上。

详细分析文章 :Dubbo笔记⑯ :Dubbo集群组件 之 LoadBalance

三、流程简述

下图是集群部分简化后的时序图
在这里插入图片描述

  1. 消费者进行服务调用,会经过 ClusterInvoker#invoke 方法,在 ClusterInvoker#invoke 方法中完成了集群容错的功能。
  2. 在 ClusterInvoker#invoke 方法中,首先会调用 Directory#list 来获取当前可用的服务列表,
  3. 而Directory#list 会调用 Router#route,以便根据路由规则筛选出合适的服务列表。
  4. 在 ClusterInvoker#invoke 方法汇总,在获取到Directory#list 返回的服务列表后,会调用 LoadBalance#select 方法来根据负载均衡算法挑选一个服务提供者,来完成本次消费者的服务调用。需要注意的是,并非所有的容错策略都会调用负载均衡,如 BroadcastClusterInvoker 则不会再调用负载均衡组件。

以上:内容部分参考
《深度剖析Apache Dubbo 核心技术内幕》
https://dubbo.apache.org/zh/docs/v2.7/dev/source/
如有侵扰,联系删除。 内容仅用于自我记录学习使用。如有错误,欢迎指正

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫吻鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值