【SpringCloud Alibaba】(五)服务雪崩与容错方案

news2024/11/15 12:43:16

在前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。

但是,现在系统中存在着一个很明显的问题:那就是如果系统的并发量上来后,系统并没有容错的能力,这可能会导致系统不可用或者直接宕机,所以,我们的系统需要支持容错的能力

1. 并发对系统的影响

当一个系统的架构设计采用微服务架构模式时,会将庞大而复杂的业务拆分成一个个小的微服务,各个微服务之间以接口或者 RPC 的形式进行互相调用。

在调用的过程中,就会涉及到网路的问题,再加上微服务自身的原因,例如很难做到 100% 的高可用等。如果众多微服务当中的某个或某些微服务出现问题,不可用或者宕机了,那么其他微服务调用这些微服务的接口时就会出现延迟。如果此时有大量请求进入系统,就会造成请求任务的大量堆积,甚至会造成整体服务的瘫痪。

2. 压测

2.1 压测说明

为了更加直观的说明当系统没有容错能力时,高并发、大流量场景对于系统的影响,我们在这里模拟一个并发的场景:

在订单微服务 shop-order的 OrderController类中新增一个 concurrentRequest() 方法,源码如下所示:

@GetMapping("/concurrentRequest")
public String concurrentRequest() {
    log.info("测试业务在高并发场景下是否存在问题");
    return "concurrentRequest";
}

接下来,为了更好的演示效果,我们限制下Tomcat处理请求的最大并发数,在订单微服务shop-order
的resources目录下的application.yml文件中添加如下配置:

server:
  port: 8080
  tomcat:
    max-threads: 20

限制 Tomcat 一次最多只能处理 20 个请求。接下来,我们就使用 JMeter 对
http://localhost:8080/order/submit_order 接口进行压测。

由于订单微服务中没有做任何的容错处理,当对 http://localhost:8080/order/submit_order 接口的请求压力过大时,我们再访问http://localhost:8080/order/concurrentRequest 接口时,会发现http://localhost:8080/order/concurrentRequest 接口会受到并发请求的影响,访问很慢甚至根本访问不到

2.2 压测实战

使用 JMeter 对 http://localhost:8080/order/submit_order 接口进行压测,JMeter 的配置过程如下所示。

1、打开 JMeter 的主界面,如下所示:

在这里插入图片描述

2、在JMeter中右键测试计划添加线程组,如下所示:

在这里插入图片描述
3、在 JMeter 中的线程组中配置并发线程数,如下所示:

在这里插入图片描述
配置信息如下:

  • 线程数:50
  • Ramp-Up 时间:0
  • 循环次数:100

配置信息的意思:表示 JMeter 每次会在同一时刻向系统发送 50 个请求,发送 100 次为止

4、在 JMeter 中右键线程组添加 HTTP 请求,如下所示:

在这里插入图片描述
5、在 JMeter 中配置 HTTP 请求,如下所示:

在这里插入图片描述
具体配置如下所示:

  • 协议:http
  • 服务器名称或IP:localhost
  • 端口号:8080
  • 方法:GET
  • 路径:/order/submit_order?userId=1001&productId=1001&count=1
  • 内容编码:UTF-8

6、配置好 JMeter 后,点击 JMeter 上的绿色小三角开始压测,如下所示:

在这里插入图片描述
点击后会弹出需要保存JMeter脚本的弹出框,根据实际需要点击保存即可。

7、查看结果:右键 HTTP 请求:添加->监听器->察看结果树:

在这里插入图片描述

8、正式压测。启动 用户、商品、订单微服务

在这里插入图片描述

点击保存后,开始对 http://localhost:8080/order/submit_order 接口进行压测,在压测的过程中会发现订单微服务打印日志时,会比较卡顿,同时在浏览器或其他工具中访问 http://localhost:8080/order/concurrent_request 接口会卡顿,甚至根本访问不到。

说明订单微服务中的某个接口一旦访问的并发量过高,其他接口也会受到影响,进而导致订单微服务整体不可用。为了说明这个问题,我们再来看看服务雪崩是个什么鬼

3. 服务雪崩

系统采用分布式或微服务的架构模式后,由于网络或者服务自身的问题,一般服务是很难做到 100% 高可用的。如果一个服务出现问题,就可能会导致其他的服务级联出现问题,这种故障性问题会在整个系统中不断扩散,进而导致服务不可用,甚至宕机,最终会对整个系统造成灾难性后果

为了最大程度的预防服务雪崩,组成整体系统的各个微服务需要支持服务容错的功能。

4. 服务容错方案

服务容错在一定程度上就是尽最大努力来兼容错误情况的发生,因为在分布式和微服务环境中,不可避免的会出现一些异常情况,我们在设计分布式和微服务系统时,就要考虑到这些异常情况的发生,使得系统具备服务容错能力。

常见的服务错误方案包含:服务限流、服务隔离、服务超时、服务熔断和服务降级等

4.1 服务限流

服务限流就是限制进入系统的流量,以防止进入系统的流量过大而压垮系统。其主要的作用就是保护服务节点或者集群后面的数据节点,防止瞬时流量过大使服务和数据崩溃(如前端缓存大量实效),造成不可用;还可用于平滑请求。

限流算法有两种,一种就是简单的请求总量计数,一种就是时间窗口限流(一般为1s),如令牌桶算法和漏牌桶算法就是时间窗口的限流算法

4.2 服务隔离

服务隔离有点类似于系统的垂直拆分,就按照一定的规则将系统划分成多个服务模块,并且每个服务模块之间是互相独立的,不会存在强依赖的关系。如果某个拆分后的服务发生故障后,能够将故障产生的影响限制在某个具体的服务内,不会向其他服务扩散,自然也就不会对整体服务产生致命的影响。

互联网行业常用的服务隔离方式有:线程池隔离和信号量隔离。

4.3 服务超时

整个系统采用分布式和微服务架构后,系统被拆分成一个个小服务,就会存在服务与服务之间互相调用的现象,从而形成一个个调用链。形成调用链关系的两个服务中,主动调用其他服务接口的服务处于调用链的上游,提供接口供其他服务调用的服务处于调用链的下游。

服务超时就是在上游服务调用下游服务时,设置一个最大响应时间,如果超过这个最大响应时间下游服务还未返回结果,则断开上游服务与下游服务之间的请求连接,释放资源。

4.4 服务熔断

在分布式与微服务系统中,如果下游服务因为访问压力过大导致响应很慢或者一直调用失败时,上游服务为了保证系统的整体可用性,会暂时断开与下游服务的调用连接。这种方式就是熔断。

服务熔断一般情况下会有三种状态:关闭、开启和半熔断。

  • 关闭状态:服务一切正常,没有故障时,上游服务调用下游服务时,不会有任何限制。
  • 开启状态:上游服务不再调用下游服务的接口,会直接返回上游服务中预定的方法。
  • 半熔断状态:处于开启状态时,上游服务会根据一定的规则,尝试恢复对下游服务的调用。此时,上游服务会以有限的流量来调用下游服务,同时,会监控调用的成功率。如果成功率达到预期,则进入关闭状态。如果未达到预期,会重新进入开启状态。

4.5 服务降级

服务降级,说白了就是一种服务托底方案,如果服务无法完成正常的调用流程,就使用默认的托底方案来返回数据。例如,在商品详情页一般都会展示商品的介绍信息,一旦商品详情页系统出现故障无法调用时,会直接获取缓存中的商品介绍信息返回给前端页面

代码地址

代码已经上传至码云,码云地址

其中,数据库文件位于 db 文件夹下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/806620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Onetable:统一的表格式元数据表示

概括 Onehouse 客户现在可以将他们的 Hudi 表查询为 Apache Iceberg 和/或 Delta Lake 表,享受从云上查询引擎到顶级开源项目的原生性能优化。 在数据平台需求层次结构的基础上,存在摄取、存储、管理和转换数据的基本需求。 Onehouse 提供这种基础数据…

C++库封装JNI接口——实现java调用c++

1. JNI原理概述 通常为了更加灵活高效地实现计算逻辑,我们一般使用C/C实现,编译为动态库,并为其设置C接口和C接口。用C实现的一个库其实是一个或多个类的简单编译链接产物。然后暴露其实现类构造方法和纯虚接口类。这样就可以通过多态调用到…

获取各省人口排名数据

目录 一、目标网址 二、网址分析 2.1、获取并解析网页内容 2.2 两种获取方法 三、获取目标数据 四、代码附件 一、目标网址 目标网址:中国人口排名 省份 1.1 网址截图 二、网址分析 2.1、获取并解析网页内容 我们需要使用requests库获取网页,使用…

三个常用查询:根据用户名 / token查询用户信息+链表分页条件查询

目录 1.根据用户名或者token查询用户信息 会员信息实体类 统一状态Result类 controller层 service层及实现类 dao层 测试: 2.链表分页条件查询 会员等级实体类 封装条件类PageVo controller层 service层及实现类 dao层 Mapper.xml层 测试 vue前端参考 1.根据用户名…

多模态大模型(MLLM)之VisCPM:支持中文对话文图双向生成

2020 年 12 月发布的 CPM-1 是国内首个中文大模型 ;2022 年 9 月发布的 CPM-Ant 仅微调 0.06% 参数就能超越全参数微调效果;2023 年 5 月发布的 WebCPM 是 中文首个基于搜索的问答开源模型。CPM-Bee 百亿大模型是团队最新发布的基座模型,中文…

基于springboot+mybatis+vue进销存管理信息系统

基于springbootmybatisvue进销存管理信息系统 一、系统介绍二、功能展示1.个人中心2.企业信息管理3.商品信息管理4.客户信息管理5.入库记录管理6.出库记录管理7.出库记录管理8.操作日志管理9.库存盘点管理 四、获取源码 一、系统介绍 系统主要功能: 普通用户&#…

为啥运营商现在严格规范网购流量卡的年龄了呢?20岁以下难了

本期知识点只讲流量卡,葫芦弟今天分享给大家手机流量卡开卡安全的问题。 很多朋友可能觉得电信诈骗离自己很远,但实际上现在已经出现大量收购电话卡用于诈骗的现象,而我们很可能在不知不觉中掉进犯罪分子的陷阱,触犯法律&#xff…

关于element ui 安装失败的问题解决方法、查看是否安装成功及如何引入

Vue2引入 执行npm i element-ui -S报错 原因:npm版本太高 报错信息: 解决办法: 使用命令: npm install --legacy-peer-deps element-ui --save 引入: 在main.js文件中引入 //引入Vue import Vue from vue; //引入…

C# Solidworks二次开发:自动创建虚拟零件及使用注意事项

今天要讲的是关于在solidworks中如何自动创建虚拟零件的功能,也就是solidworks中插入新零件这个功能。 实现这个功能需要使用的API如下所示: InsertNewVirtualPart(swFaceOrPlane1, out swcomp2); 其中这个方法中使…

【动态规划part11】| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

目录 🎈LeetCode123.买卖股票的最佳时机III 🎈LeetCode188.买卖股票的最佳时机IV 🎈LeetCode123.买卖股票的最佳时机III 链接:123.买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i…

X99双路主机28核56线程电脑配置选购与系统装机详细流程(附带资源)

文章目录 前期调研(包含配件详细信息)装机过程推荐学习视频实践过程 系统装机(含资源详细过程)提前准备(制作系统盘工具以及ISO系统镜像)实践过程步骤一:使用Rufsus工具,选择ISO文件…

记一次 .NET 某设备监控系统 死锁分析

一:背景 1. 讲故事 上周看了一位训练营朋友的dump,据朋友说他的程序卡死了,看完之后发现是一例经典的死锁问题,蛮有意思,这个案例算是学习 .NET高级调试 入门级的案例,这里和大家分享一下。 二&#xff…

【原理图专题】OrCAD Capture原理图设计差异对比

在我们进行硬件设计时,往往会遇到项目上的变更。比如更换了替代料、电路错误、新需求等等,这些有的需要动用到原理图,而动到原理图往往很容易出错,特别是已经量产的产品,我们可以通过BOM对比等方式来查看变更。那是否有一种其他方式能直接进行原理图对比呢? 其中对比功能…

桥接模式——处理多维度变化

1、简介 1.1、概述 桥接模式是一种很实用的结构型设计模式。如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合单一职责原则。与多层继承方案不同,它将两个独…

【Linux】更换jdk版本

目录 一、前言二、查看jdk版本号1、项目中的版本号(pom.xml)2、服务器中的版本号 三、更换jdk版本1、创建java文件夹2、下载并解压JDK安装包①、下载jdk安装包②、移动到创建好的/usr/local/java路径下③、解压jdk安装包 四、删除原来的jdk版本1、删除原…

Java虚拟机——线程安全与锁优化

1 线程安全 当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作。调用这个对象的行为都可以获得安全的结果,就称这个对象是线程安全…

从零开始理解Linux中断架构(23)中断运行临界区和占先调度

Linux在内核中定义了6种运行临界区。 in_interrupt in_interrupt在驱动中使用频率最高的函数了,in_interrupt()就是指示Core是否正在中断处理中,包含了硬中断,软中断运行临界区。如果在中断处理中,则不能调用__do_softirq执行软中断处理。硬中断中不可调度不可中断,所有…

智慧园区安保人员巡更巡检解决方案,蓝牙信标主动式蓝牙定位导航系统

一、需求分析 目前,大部分写字楼,工厂,学校,银行,车站等场景对安保人员的管理依然靠手填单子记录作业情况,在缺乏信息化手段的情况下,靠人员自觉性或者RFID巡更棒,在这些传统方式下…

2023 年牛客多校第四场题解

A Bobo String Construction 题意:给定一个 01 01 01 字符串 t t t,构造一个长度为 n n n 的 01 01 01 串 s s s,使得 t t t 在 c o n c a t ( t , s , t ) {\rm concat}(t, s, t) concat(t,s,t) 中仅出现两次。多测, 1 ≤…

Android杂录 语音转文字功能 python混合开发环境搭建 priv-app开机赋予麦克风权限 HDMI与麦克风同时工作配置

专栏目录: 高质量文章导航-持续更新中_GZVIMMY的博客-CSDN博客 一.语音转文字功能 软件架构 硬件架构: 耳机接口 报错类型: AudioFlinger could not create record track, status: -1 Androi