1.集群容错架构设计

简介: 本文深入剖析Dubbo集群容错机制,围绕Directory、Router、LoadBalance三大核心组件,结合源码与流程图,解析服务调用时如何实现服务发现、路由过滤与负载均衡,助你掌握整体架构设计精髓。

前期铺垫

官网介绍图.png


这张是官网的对于集群容错的架构设计图,即使你有一定的使用经验,第一眼看到这个图可能还是有些懵逼.因为这个图是从设计的角度画出来的,而不是使用的角度.但是即使这个图你看不懂也不影响你对本文的阅读,但是你必须要记住三个关键词,因为这三个关键词接下来会贯穿全文,他们就是Directory,Router,LoadBalance

再接下来给大家一张"地图","地图"上我已经标记了序号,再下面的源码分析中,我也会实时提醒我们所在的位置,以至于不会迷失方向.

执行时序图.png

环境准备

既然是集群,那么首先要启动两个Provider,我这里是一个虚拟机,一个本地的方式,因为环境准备不是本文重点,因此略过.本文所用到的源码是2.5.4版本,可以在guihub上找到。也可以用下面这个2.7.0版本的:

📎dubbo-2.7.0.jar

正式发车

这次示例选用的源码用dubbo-demodubbo-demo-consumer,如果对dubbo原理有些简单的了解就知道,他给接口注入的不是接口的实现类,而是一个代理类,如下图


接着自然是到了代理类的invoke方法里,从图中我们也可以看出,他用的是jdk的动态代理



下面要开始紧盯着地图了,他现在就要开始执行地图中的序号1,此时我们抵达MockClusterInvoker这个类


执行invoke就要开始进入到集群,也就是Cluster,现在第一个关键词Directory已经浮出水面了

现在到了AbstractDirectory,也就是序号3

这个methodInvokerMap也比较重要,后面的文章会讲一下这个,但是我们这部分代码就可以从出,他是要从methodInvokerMap中取出invokers如图所示

将invokers返回后(序号5),下面来到了第二个关键词,Router,开始进入路由,现在我们到了序号6,此时到了MockInvokersSelector类,不要看类名和Router没有关系,其实他是Router接口的实现类,从官网的介绍图中我们也可以看到Router分为ScriptCondition两种,翻译过来也就是脚本路由条件路由这个后面再详细介绍,本篇主要介绍整体架构

源码的命名是很规范的,从getNormalInvokers就可以得知,他是要拿到能正常执行的invokers,并将其返回.也就是序号7

这个时候我们再次回到了AbstractClusterInvoker这个类,我们先不急着往下走,先适时做个总结.因为三个关键词,现在都已经出现了两个,那这个时候要回忆一下上面这些步骤,做一个总结.上面出现的这两个关键词,其实无非就是做两件事

  • Directory中找出本次集群中的全部invokers
  • Router中,将上一步的全部invokers挑选出能正常执行的invokers

对应到"地图",也就是序号5和序号7.(再次提醒,一定要紧跟地图的序号,不然很容易迷失方向)

从上面步骤我们也知道,已经挑选出能正常执行的invokers了,但是假如2个做集群,但是这两个都是正常的,我到底要执行哪一个呢?带着这个问题,我们继续往下看

根据官网的描述

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

所以这个时候是到了FailoverClusterInvoker类,但是如果你配置的是Failfast Cluster(快速失败),Failsafe Cluster(失败安全),Failback Cluster(失败自动恢复),Forking Cluster(并行调用多个服务器,只要一个成功即返回),Broadcast Cluster(广播调用所有提供者,逐个调用,任意一台报错则报错)他也会到达相应的类

下面就要开始第三个关键词浮出水面,也就是LoadBalance(负载均衡),此时的位置是序号11

根据前面我们知道,现在已经有两个备选的invokers,但是究竟哪一个能执行,这个需要LoadBalance来决定.这里涉及到了一定的算法,后面我也会有一篇文章加以介绍.剧透一下,这个在2.5.4的版本中,这个算法还是存在一些小的bug,此时我们的位置是序号13

到达终点站.我们回忆总结一下,文初提到的三个关键词,在这个集群容错的整体架构过程中,dubbo究竟做了什么.其实也就是三件事

  • Directory中找出本次集群中的全部invokers
  • Router中,将上一步的全部invokers挑选出能正常执行的invokers
  • LoadBalance中,将上一步的能正常的执行invokers中,根据配置的负载均衡策略,挑选出需要执行的invoker

相关文章
|
1天前
|
缓存 运维 监控
一场FullGC故障排查
本文记录了一次Java应用CPU使用率异常升高的排查过程。通过分析发现,问题根源为频繁Full GC导致CPU飙升,而Full GC是因用户上传的Excel数据被加载为大对象并长期驻留JVM内存所致。使用JProfiler分析堆内存,定位到List<Map<String, String>>结构造成内存膨胀,空间效率仅约13.4%。最终提出“治本”与“治标”两类解决方案:一是将大数据移出JVM内存,存入Redis;二是优化代码,及时清理无用字段以减小对象体积。文章总结了从监控识别、工具分析到根本解决的完整排查思路,对类似性能问题具有参考价值。(238字)
|
1天前
|
存储 缓存 负载均衡
Nacos注册中心
本文介绍Nacos的安装部署、服务注册中心整合、分级模型、负载均衡策略、权重控制、环境隔离及实例类型,详解其在微服务架构中的应用,帮助开发者掌握Nacos核心功能与最佳实践。
 Nacos注册中心
|
1天前
|
负载均衡 算法 架构师
Ribbon负载均衡
本文深入讲解Spring Cloud中Ribbon实现客户端负载均衡的原理,包括@LoadBalanced注解的作用、负载均衡策略分类与算法,以及如何自定义配置和优化首次调用延迟的饥饿加载机制,帮助读者全面理解微服务间的流量分发技术。
Ribbon负载均衡
|
1天前
|
Java Nacos Maven
Eureka服务注册与发现
本节介绍Eureka注册中心的搭建与使用,完成服务注册与发现功能,为后续Nacos替换做铺垫。
 Eureka服务注册与发现
|
2天前
|
安全 JavaScript
JeecgBoot介绍
JeecgBoot是一款基于代码生成器的低代码开发平台,支持零代码快速开发。采用SpringBoot2.x、Ant Design&Vue、Mybatis-plus等主流技术,前后端分离架构,集成Shiro、JWT安全控制,助力高效构建企业级应用。
JeecgBoot介绍
|
2天前
|
NoSQL 关系型数据库 Java
基础环境配置
项目开发环境要求JDK8+、Maven、Redis 3.2+、MySQL 5.7+,推荐使用Idea开发工具,需安装Lombok插件和JRebel热部署工具。技术栈基于SpringBoot、MybatisPlus、Shiro及SpringCloud Alibaba,适合构建微服务架构应用。
基础环境配置
|
1天前
|
数据库 前端开发 NoSQL
代码拉取与运行
本文档介绍JeecgBoot前后端项目部署流程,包含代码拉取(在线/离线)、数据库脚本导入、Idea工程配置、修改数据库与Redis连接、后端启动及前端Vue3项目运行步骤,附目录结构与关键配置说明,助您快速搭建开发环境。
代码拉取与运行
|
1天前
|
Dubbo IDE API
SpringCloud工程部署启动
本文介绍SpringCloud微服务工程搭建全过程,涵盖项目创建、模块配置、数据库部署及服务远程调用实现。通过两种方案快速搭建工程,使用RestTemplate完成服务间HTTP通信,并解析调用流程与设计思想,帮助开发者掌握微服务基础架构与协作机制。
|
1天前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍如何通过四色原型法进行领域建模,构建数据架构中的ER图。利用时标性(MI)、参与方-地点-物品(PPT)、角色(Role)和描述(DESC)四类原型,逐步从业务流程中提炼实体与关系,最终形成清晰的数据模型,助力系统设计。
|
1天前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图。横轴为对象,纵轴为时间,通过生命线、控制焦点和消息等元素展现动态协作过程,强调交互的时间先后关系,适用于建模并发与同步行为。