微服务系列五:避免雪崩问题的限流、隔离、熔断措施

目录

实验环境说明

前言

一、一片小雪花引起的雪崩!

1.1 雪崩问题(级联失败问题)示意图

1.2 雪崩问题的产生原因与解决策略

二、雪崩问题的具体解决策略

2.1 请求限流

2.2 线程隔离

2.3 服务熔断

2.4 总结——具体解决策略

三、微服务保护工具:sentinel

3.1 sentinel 介绍

3.2 sentinel安装

3.3 sentinel微服务整合

3.4 簇点链路调整

四、基于sentinel实现请求限流

4.1 配置请求限流说明

4.2 请求限流实践

4.2.1 配置请求限流规则

4.2.2 JMeter并发测试

4.2.3 sentinel流控展示

五、基于sentinel实现线程隔离

5.1 模拟无线程隔离配置阻塞请求压垮服务器实验

5.1.1 配置慢请求业务

5.1.2 调整服务器资源量

5.1.3 正常请求现象展示

5.1.4 JMeter压力测试并查看接口响应情况

5.2 配置线程隔离规则

5.3 JMeter并发测试

5.4 sentinel流控效果显示

六、fallback逻辑优化

6.1 fallback实验说明

6.2 调整簇点策略,注册OpenFeign簇点

6.3 FallbackFactory配置Fallback

6.3.1 编写ItemClientFallbackFactory类

6.3.2 在Config中注册Bean对象

6.3.3 在对应的Client上添加注解使用

6.4 线程隔离 + Fallback实验测试

6.4.1 给feign簇点添加线程隔离规则

6.4.2 JMeter并发测试并查看响应结果

6.4.3 sentinel流控效果展示

七、基于sentinel实现服务熔断

7.1 断路器介绍

7.2 配置服务熔断规则说明

7.3 JMeter并发测试并进行前后对比

八、微服务保护方案相关知识追问巩固


实验环境说明

本文有部分地方需要实验进行。首先对于看过黑马微服务的同学应该会比较熟悉。如果没有你也可以参考我实验的环境搭个简单的测试环境,用于实验。实验的目的也是为了更好的理解业务、理解知识点。

本地环境部分:

服务名端口号备注
nginx18080 / 18081前端运行环境
sentinel8090服务保护监控
hm-gateway8080后端项目网关模块
item-service8081后端商品服务模块
cart-service8082 后端购物车服务模块
item-service28083后端商品服务模块
item-service38084后端商品服务模块
user-service8085后端用户管理模块
trade-service8086后端交易服务模块
pay-service8087后端支付服务模块

远程服务器环境部分:

服务名端口号备注
nacos8848注册中心及配置中心,非容器镜像
nginx18080/18081线上前端运行环境,容器镜像
mysql3306线上数据库,容器镜像
docker-hm8080线上后端运行环境,容器镜像

注意事项:

  • 远程环境中非容器镜像指nacos是后单独配置的容器,而mysql、nginx、docker-hm是使用compose统一部署的。
  • 在本节实验中,线上环境的nginx和docker-hm我们不会使用到,而是使用本地的nginx和后端项目
  • 请你确保在配置线上环境时,mysql必须先比nacos启动。如果nacos先启动将无法连接数据库。此时你需要停止nacos容器,先启动mysql。

前言

先前我们依次学习了远程调用、服务治理、请求路由、身份认证、配置管理的相关知识。本篇,我们将从雪崩问题出发,去探讨微服务的保护措施及实现方法。

一、一片小雪花引起的雪崩!

1.1 雪崩问题(级联失败问题)示意图

微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。

1.2 雪崩问题的产生原因与解决策略

产生原因解决策略
服务相互调用,而服务提供者出现故障或阻塞尽量避免服务提供者出现阻塞,限制请求数量【请求限流
服务调用者被大量阻塞请求占满,导致服务器崩溃尽量避免无节制的调用服务器资源请求异常服务,限制调用服务的线程数量【线程隔离
调用链中连环失败,没有及时阻断,对于异常请求仍然不断去重试,浪费资源。尽量避免对已经确认异常的服务继续发送请求,及时做到断止请求【服务熔断

总结:确保服务提供者能处理它能力范围内的请求,同时服务调用者要设置好合适的线程数,以免请求占满服务器资源。最后,如果服务提供者出现大量异常后,也要及时断舍,不要再做无意义的请求去浪费资源。

二、雪崩问题的具体解决策略

2.1 请求限流

请求限流:限制访问微服务的请求的并发量,避免服务因流量激增出现故障。

2.2 线程隔离

举例:就像将船分为若干块,即使一块进水了,也不会导致整船的进水。减少对整体的影响。

线程隔离:相当于利用线程将服务器隔离成多块,即使部分异常也不会拖垮服务器,减少对服务器的影响。

fallback优化:有时候我们不希望抛出服务异常,这时我们可以让异常的服务调用变成自定义的fallback逻辑,这样一来可以快速失败,执行fallback中的业务逻辑,返回默认数据或友好提示。

2.3 服务熔断

举例:就像家庭电路中的空气开关。当电器出现漏电异常或者短路时,空气开关会自动切断电源,以免照常更多的电器损失。

服务熔断:由断路器统计请求的异常比例或慢调用比例,如果超出阈值则会熔断该业务,则拦截该接口的请求。 熔断期间,所有请求快速失败,全都走fallback逻辑。

fallback逻辑:对于需要熔断的服务,没有必要再发送请求浪费,直接熔断并且走fallback,执行服务异常时的业务逻辑。

2.4 总结——具体解决策略

请求限流限制流量在服务可以处理的范围,避免因突发流量而故障
线程隔离控制业务可用的线程数量,将故障隔离在一定范围
服务熔断将异常比例过高的接口断开,拒绝所有请求,直接走fallback
失败处理定义fallback逻辑,让业务失败时不再抛出异常,而是返回默认数据或友好提示

三、微服务保护工具:sentinel

3.1 sentinel 介绍

Sentinel是阿里巴巴开源的一款微服务流量控制组件。Sentinel定位是分布式系统的流量防卫兵。目前互联网应用基本上都使用微服务,微服务的稳定性是一个很重要的问题,而限流、熔断降级是微服务保持稳定的一个重要的手段。
home | Sentinelhomeicon-default.png?t=O83Ahttps://sentinelguard.io/zh-cn/index.html

Sentinel主要的功能示意图

3.2 sentinel安装

下载

sentinel的下载地址 Releases · alibaba/Sentinelicon-default.png?t=O83Ahttps://github.com/alibaba/Sentinel/releases 下载后放到非中文目录下,将版本后缀删除:

运行

打开cmd命令窗口,运行启动脚本

java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

访问

本地访问 localhost:8090端口,即可进入控制台。(登录账号密码默认都是sentinel)

3.3 sentinel微服务整合

基本步骤

  • 引入sentinel依赖
  • 配置控制台发现
  • 访问微服务,测试sentinel监控

以下实验以cart-service模块为例:

引入依赖

<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

增加配置文件

spring:cloud: sentinel:transport:dashboard: localhost:8090

重启测试服务

对购物车的相关服务进行访问,查看sentinel的监控效果

3.4 簇点链路调整

簇点链路: 就是单机调用链路。是一次请求进入服务后经过的每一个被Sentinel监控的资源链。默认Sentinel会监控SpringMVC的每一个Endpoint(http接口)。限流、熔断等都是针对簇点链路中的资源设置的。而资源名默认就是接口的请求路径:

当前项目基于restful风格,还存在一些不合适的问题:

如何让每个接口都能显示出来呢?我们需要对簇点链路配置进行一些调整:

修改配置文件,添加一行配置:

spring:cloud:sentinel:transport:dashboard: localhost:8090http-method-specify: true # 开启请求方式前缀

重新上线测试:

四、基于sentinel实现请求限流

4.1 配置请求限流说明

在簇点链路后面点击流控按钮,即可对其做限流配置:

4.2 请求限流实践

以下实验以获取购物车列表接口为例:

4.2.1 配置请求限流规则

4.2.2 JMeter并发测试

4.2.3 sentinel流控展示

五、基于sentinel实现线程隔离

5.1 模拟无线程隔离配置阻塞请求压垮服务器实验

本实验以购物车列表查询接口为例:由于购物车列表需要依赖商品查询的数据,因此可以进行本次实验。(完成本次实验前,请将请求限流规则删除)

5.1.1 配置慢请求业务

将根据ID批量查询商品接口改为慢查询

5.1.2 调整服务器资源量

为了能更快展现压垮服务器的情况,我们需要把tomcat服务器默认的资源量(默认8192)改小一点。

5.1.3 正常请求现象展示

购物车列表查询速度500多毫秒,且目前正常查询到商品数据

其他购物车接口查询速度正常,10多毫秒 

5.1.4 JMeter压力测试并查看接口响应情况

这一步需要在JMeter高并发请求的过程中进行。

利用JMeter不断发送购物车列表请求,压力服务器

查看购物车接口的响应结果

更加暴力的测试提高到每秒400并发

(哥们别测太高,电脑死机就完蛋了)

5.2 配置线程隔离规则

5.3 JMeter并发测试

5.4 sentinel流控效果显示

六、fallback逻辑优化

6.1 fallback实验说明

第五节线程隔离中存在一个问题:发现没有,控制台基本上全是报错的,但是有时后我们不希望服务抛出异常,而是在服务异常后走我们自定义的业务逻辑。这个时候就需要fallback登场了。

以查询购物车列表为例,在商品查询业务慢导致线程占满,返回请求429的情况下。我们希望还能正常显示购物车列表信息。对此,我们可以给查询逻辑添加fallback,在资源耗尽被拒绝的时候,我们直接走fallback,将单单购物车的数据展示到前端就行了(不管商品信息)

也就是说,我们不需要隔离购物车业务,而是直接隔离异常的商品查询接口!

但是,调用商品查询接口是OpenFeign调用,如何给这条链路添加上线程隔离规则呢?

我们必须先将这条链路注册成一个簇点。接下来就跟着我一起实验吧!

6.2 调整簇点策略,注册OpenFeign簇点

在cart-service模块中,开启feign对sentinel的支持

feign:  sentinel:enabled: true # 开启feign对sentinel的支持

重启查看sentinel

接下来我们就可以对这个接口进行流控啦!不过在此之前我们先配置一下fallback逻辑,

给FeignClient编写失败后的降级逻辑有两种方式:

  • 方式一:FallbackClass,无法对远程调用的异常做处理

  • 方式二:FallbackFactory,可以对远程调用的异常做处理,我们一般选择这种方式。

6.3 FallbackFactory配置Fallback

6.3.1 编写ItemClientFallbackFactory类

在hm-api模块下新建client.fallback.itemClientFallbackFactory.java,并实现FallbackFactory接口

package com.hmall.api.client.fallback;import com.hmall.api.client.ItemClient;
import com.hmall.api.dto.ItemDTO;
import com.hmall.api.dto.OrderDetailDTO;
import com.hmall.common.utils.CollUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;import java.util.Collection;
import java.util.List;@Slf4j
public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> {@Overridepublic ItemClient create(Throwable cause) {return new ItemClient() {@Overridepublic List<ItemDTO> queryItemByIds(Collection<Long> ids) {log.error("查询商品信息失败: ", cause);// 返回空集合return CollUtils.emptyList();}@Overridepublic void deductStock(List<OrderDetailDTO> items) {log.error("扣减库存失败: ", cause);throw new RuntimeException(cause);}};}
}

6.3.2 在Config中注册Bean对象

    @Beanpublic ItemClientFallbackFactory itemClientFallbackFactory() {return new ItemClientFallbackFactory();}

6.3.3 在对应的Client上添加注解使用

到此为止,Fallback已经编写完成了,接下来再次进行线程隔离实验测试
 

6.4 线程隔离 + Fallback实验测试

6.4.1 给feign簇点添加线程隔离规则

6.4.2 JMeter并发测试并查看响应结果

 查询购物车列表不报错了,而且查询从500多毫秒变成了几十毫秒

6.4.3 sentinel流控效果展示

七、基于sentinel实现服务熔断

7.1 断路器介绍

熔断是解决雪崩问题的重要手段。思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

知道服务已经挂了,就不需要再给他发请求了,直接拒绝发起请求,直接走fallback逻辑。进而节约更多的资源。与此同时,服务熔断需要有一个恢复时长,在恢复时再次请求查看是否成功。成功就结束熔断,否则继续进入熔断状态!

7.2 配置服务熔断规则说明

7.3 JMeter并发测试并进行前后对比

不加服务熔断前的状态:

加了服务熔断后的状态

超过熔断时间20s后,请求恢复正常

八、微服务保护方案相关知识追问巩固

1. 请你谈谈微服务雪崩问题是如何产生的?产生的后果是什么?

2. 对于雪崩问题,你有哪些好的解决方案呢?

3. 你知道什么是流量控制组件么?你有用过哪些微服务流量控制组件?

4. 请你谈谈sentinel如何整合到我们的微服务项目中?说出具体的步骤?

5. 关于sentinel簇点的概念?什么是簇点链路

6. restful风格的微服务项目使用sentinel簇点需要注意什么问题?如何配置?

7. openfeign调用如何注册到sentinel的簇点链路中?

8. openfeign调用的请求如何单独给它加上流量控制规则?具体的步骤是什么?

9. 请你谈谈使用sentinel如何实现请求限流、线程隔离?

10. 请你谈谈如何编写fallback逻辑,具体的步骤是什么?

11. 请你谈谈使用sentinel如何实现服务熔断,熔断有哪些常见的策略?

12. 请你谈谈服务熔断中熔断器的工作流程,什么是熔断时长?

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

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

相关文章

C语言之写一个修改数组内容的函数

问题代码: 函数ltrim是为了消除buf字符数组中左边空格&#xff0c; memmove函数介绍 如果对c语言指针运用非常熟练的人,结合函数功能就会发现这个代码非常的傻逼&#xff0c;你会发现为什么需要返回&#xff0c;buf不用接收返回值&#xff0c;执行这个函数后buf中的内容就已经…

第二十七章 Vue异步更新之$nextTick

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 一、概述 需求&#xff1a;编辑标题, 弹出显示编辑框自动聚焦 1. 点击编辑&#xff0c;显示编辑框 2. 让编辑框&#xff0c;立刻获取焦点 我们常规的思路可能会编写如下代码来实现&#xff1a; 问题&#xff1a…

【含文档】基于ssm+jsp的IT论坛系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定义了三个…

【运维心得】按任何键都不能进BIOS三步解决

目录 第一步 键盘 第二步 工具 第三步 短路 估计经常搞运维的朋友&#xff0c;会经常碰到这个问题。 第一步 键盘 这个现象出现&#xff0c;首先要确定开机时&#xff0c;屏幕上是否会显示提示字符&#xff1f;比如F2、F10、DEL键之类的&#xff0c;如果有&#xff0c;那么就…

OpenCV基础05_GUI和PyMsql

目录 一、PySimpleGUI 1、布局和窗口 2、文本框组件 3、视频处理 4、图片处理 二、pymsql 1、数据库操作 2、数据采集 3、人脸识别 一、PySimpleGUI PySimpleGUI 是一个用于简化 GUI 编程的 Python 包&#xff0c;它封装了多种底层 GUI 框架&#xff08;如 tkinter、…

动态代理IP的应用场景有哪些?

在数字化时代&#xff0c;数据的价值不言而喻&#xff0c;而动态代理IP则如同企业数据采集的隐形翅膀&#xff0c;助力企业在信息海洋中翱翔。本文将深入探讨动态代理IP的应用场景&#xff0c;揭示其如何帮助企业提升业务成功率&#xff0c;保障数据采集的安全性与稳定性。 动…

从实验室到晶圆厂:光刻胶剥离液的关键转变

根据QYResearch调研团队最新发布的《全球光刻胶剥离液市场报告2023-2029》显示&#xff0c;预计到2029年&#xff0c;全球光刻胶剥离液市场规模将攀升至15.8亿美元&#xff0c;未来几年将以8.9%的复合年增长率&#xff08;CAGR&#xff09;持续增长。 上述图表及数据均来源于QY…

基本开关电源电路分析

一、BOOST电路&#xff08;升压&#xff09;&#xff1a; 下图为Boost电路的最基本拓扑&#xff0c;从左至右包括电源&#xff0c;储能电感L1&#xff0c;开关管Q1&#xff0c;二极管D1&#xff0c;输出滤波电容C1及负载电阻R1。 工作原理&#xff1a; 开关管导通状态&#xf…

【解决】Pico 串流 Unity 开发环境 Preview 黑屏问题

开发平台&#xff1a;Unity 6.0 开发工具&#xff1a;Pico SDK   一、问题描述 在 Unity 开发环境下运行 测试 PicoVR 表现时&#xff0c;出现 Game视窗 PicoVR投屏 呈现黑屏效果。详细背景如下&#xff1a; UnitySwitch PlateformPICO Integration SDKPICO Live Preview6…

网站域名注册流程详解

随着互联网的普及&#xff0c;网站已经成为人们获取信息、传播观点和开展业务的重要途径。在创建自己的网站之前&#xff0c;第一步是选择并注册一个合适的域名。域名是您网站的地址&#xff0c;它将帮助用户找到您的在线空间。在这篇文章中&#xff0c;我们将详细介绍网站域名…

AI赋能人才管理:东软助力企业数字化转型

在数字化转型大潮席卷全球的今天&#xff0c;如何在新时代背景下实现高效、智能的管理升级&#xff0c;也成为了广大企业关注的焦点。 不久前&#xff0c;东软正式发布TalentBase数智人力资本管理产品&#xff0c;以AI人才管理模式为企业人力资源管理注入了新的活力。 数字化转…

专治拖延症❗❗提升学习效率的秘密武器⏰【当当狸智能时间管理器D2】养成高效自律好习惯

孩子有拖延的习惯&#xff0c;做事磨蹭拖拉&#xff0c;学习效率底下❓ 尤其是低年龄段的孩子时间观念不强&#xff0c; 所以就很懒散很被动&#xff0c;做事的效率也很低 缺乏时间管理能力的孩子可能会 面临学业压力增大、成绩下滑、情绪消极等后果❌ 所以&#xff0c;一…

Python字符串(一图秒了)

一、概念 在Python中用单引号或双引号引起来的内容 定义 s abc123 s "abc" s #空字符串 s "" #空字符串 s #空格字符串 s " " #空格字符串 注意&#xff1a;空格字符串不是空字符串 二、字符串的访问&…

Linux权限管理和文件属性

目录 1. 权限的概念 2. 权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限&#xff08;事物属性&#xff09; 2.2.1 文件类型 2.2.2 file指令 2.2.3 基本权限 3. 文件访问权限的相关设置方法 3.1 chmod 3.2 chown 和 chgrp 3.3 umask 4. 粘滞位 1. 权限的…

【Python实战案例】爬虫项目实例(附赠源码)

文章目录 声明安装必要的库项目结构技术细节小结 声明 请您遵守网站的robots文件规定&#xff0c;本文目的只是做学习交流使用&#xff0c;包括多个模块&#xff0c;例如数据存储、日志记录、错误处理、多线程或异步请求 安装必要的库 pip install requests beautifulsoup4 sq…

Spring Boot 与 Vue 共筑电影院选票新体验

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

基于java+SpringBoot+Vue的星之语明星周边产品销售网站设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

leetcode - 每日一题 - 3226. 使两个整数相等的位更改次数

位运算 3226. 使两个整数相等的位更改次数 题目 想法 n k 直接返回 0n & k ! k&#xff0c; 直接返回 -1 &#xff08;从题目来说&#xff0c;只能将位的值 从1改为0&#xff0c;&&#xff1a;只有两个数中位的数都是1&#xff0c;才为1&#xff0c;所以符合答案的一…

宠物空气净化器哪家好?希喂、安德迈、霍尼韦尔除毛能力测评

宠物空气净化器哪家好&#xff1f;最近猫咪们开始换毛了&#xff0c;咱猫咖店里的30多只小家伙们集体换毛&#xff0c;掉毛量超多。为了解决这满屋子的猫毛&#xff0c;我特地买了好几台宠物空气净化器&#xff0c;把它们分散放在店里的各个角落&#xff0c;几乎全天24小时不间…

人才画像系统:助力企业打造动态人才成长体系

在当今竞争激烈的市场环境中&#xff0c;人才已成为企业发展的核心竞争力。为了满足企业发展对人才的需求&#xff0c;人才画像系统应运而生&#xff0c;通过以岗位胜任力模型为基础定义人才标准&#xff0c;多维度采集员工信息进行人才对标和盘点&#xff0c;为企业的人才选拔…