微服务的保护

一、雪崩问题及解决方案

1.雪崩问题

微服务之间,一个微服务依赖多个其他的微服务。当一个微服务A依赖的一个微服务B出错时,微服务A会被阻塞,但其他不依赖于B的微服务不会受影响。

当有多个微服务依赖于B时,服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致其他服务都不可用。

那么,依赖于当前服务的其他服务随着时间的推移,最终也会变得不可用,形成级联失败,导致雪崩。

 

ec4e882a7799b1f3def97d928f4a02ce.png

2.解决方案

2.1超时处理

设置超时时间,请求超过设置的时间没有响应,就返回错误信息,不无休止的等待。

2.2仓壁模式(隔离模式)

将系统的请求划分为一个个互不影响的区域。

对不同类型的请求进行隔离,每种类型的隔离互不影响,如果一种类型的请求线程资源耗尽,则对该后续的该类型请求直接返回,不在调用后续资源。

 

bbd51e684431f9c7a8fd76213759f9a0.png

类似的,可以限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。

2.3断路器模式(熔断模式)

如果某个目标服务调用慢或有大量超时,此时就会熔断该服务,对于后续的调用请求,不会再继续调用目标服务,直接返回,快速释放资源。

断路器会统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。

 

15343519876444dd839c4b73ba6c09ed.png

2.4限流

熔断模式和隔离模式都属于出错后的容错处理机制,而限流模式则可以称为预防模式。

限流模式主要是提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。

流量控制:限制业务访问的QPS,避免服务因为流量突增而故障。

 

e34f55157c468319a77ba93630e3b86d.png

3.总结

  • 什么是雪崩问题?
    • 微服务之间相互调⽤,因为调⽤链中的⼀个服务故障,引起整个链路都⽆法访问的情况。
  • 可以认为:
    • 限流是对服务的保护,避免因流量突增而故障,进而避免雪崩,是⼀种预防措施。超时处理、线程隔离、降级熔断是在部分服务故障时,将故障控制在⼀定范围,避免雪崩,是⼀种补救措施。

二、服务保护技术对比

在SpringCloud中支持多种服务保护技术:

  • Netfix Hystrix
  • Sentinel
  • Resilience4J
 

Sentinel

Hystrix

隔离策略

信号量隔离

线程池隔离/信号量隔离

熔断降级策略

基于慢调用比例或异常比例

基于失败比率

实时指标实现

滑动窗口

滑动窗口(基于RxJava)

规则配置

支持多种数据源

支持多种数据源

扩展性

多个扩展点

插件的形式

基于注解的支持

支持

支持

限流

基于QPS,支持基于调用关系的限流

有限的支持

流量整形

支持慢启动

不支持

系统自适应保护

支持

不支持

控制台

开箱即用,可配置规则、查看秒级监控、机器发现等

不完善

常见框架的适配

Servlet、Spring Cloud、Dubbo、gRPC等

Servlet、Spring Cloud Netflix

三、Sentinel介绍和安装

1.初始Sentinel

Sentinel是阿里巴巴开源的⼀款微服务流量控制组件。官网地址:https://sentinelguard.io/zh-cn/index.html

Sentinel 具有以下特征:

  • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500 台以下规模的集群的汇总运行情况。
  • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
  • 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

2.安装Sentinel

将从官网下载的jar包放在任意非中文目录下,执行命令:

java -jar sentinel-dashboard-1.8.1.jar

若修改Sentinel的默认端口、账户、密码,可使用以下配置:

  • 默认端口 server.port 默认为8080
  • 账户 sentinel.dashboard.auth.username 默认为sentinel
  • 密码 sentinel.dashboard.auth.password 默认为sentinel

修改端口号的命令为:

java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar

3.访问Sentinel

访问http://localhost:8080(若为修改则为8080,修改后则为自己设置的端口号),即可看到Sentinel的控制台。

 

693e8c3f9b0734bad3f162cb075dbd58.png

登录后发现是空白的,因为还没有和微服务整合到一起。

 

c47a28d82ef9d1b5cf0dfb1635cf30d0.png

四、微服务整合Sentinel

我们在shop-order中整合Sentinel,并连接Sentinel的控制台。

1.引入Sentinel依赖

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

2.在yml文件,配置控制台

spring: 
 cloud: 
   sentinel: 
     transport: 
       dashboard: localhost:8080 

3.访问

localhost:8091/order/update,触发sentinel的监控。

 

4a0badd70be5597e24812db9ab6d6382.png

查看sentinel的控制台

 

69863d9b01b6c260e3cc0b5fff780e08.png

五、流量控制

解决雪崩的方案之一:限流,是为了避免服务因突发的流量而发生故障,是预防措施。

1.簇点链路

当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的⼀个调用链就叫做簇点链路。簇点链路中被监控的每⼀个接口就是⼀个资源。

默认情况下sentinel会监控SpringMVC的每⼀个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每⼀个端点(Endpoint)就是调用链路中的⼀个资源。

 

3725634afccc05c5bf94fb44520d7cd5.png

流控和熔断都是针对簇点链路中的资源来设置,因此可点击对应资源后面的按钮来设置规则:

  • 流控:流量控制
  • 降级:降级熔断
  • 热点:热点参数限流,是限流的一种
  • 授权:请求的权限控制

2.设置流控规则

要求:给/order/prod/{pid}设置流控规则,QPS不能超过5

2.1在sentinel控制台添加限流规则

8e0f51375a9dd09f662ec048b254e291.png

其中的QPS为每秒查询率,即每秒的响应次数,也就是最大吞吐能力,QPS=请求数req/秒sec

2.2利用jmeter测试

  • 双击jmeter.bat启动jmeter

 

c5fec5b57644f5975d8761a6a53cf856.png

 

558fe34174484eb406822a086843e727.png

即可打开jmeter的界面

 

ae0705eeabfd3b891edb04c96f7ace07.png

  • 添加线程组

 

3caf0262da1984b7be6535a4cf5ae8fc.png

 

2ecba70f60976dad9e23e679585cd55b.png

线程数:代表用户数量

时间:代表用户访问时间

10个线程要在2秒内访问完,那每秒就是访问5个线程

QPS=10/2=5,超过了单机阈值2,所以每秒的5个线程只成功2个,剩下的3个线程会请求失败。

循环次数:代表每个用户的访问次数

  • 添加http请求

 

ee5fb4a7f5a2e74646e1699d62a71c3d.png

 

b640f59de78e2122ecdd696dd7013a28.png

端口号:写的是sentinel中资源/order/prod/{pid}的端口号8091

路径:写的是给资源添加流控规则就写那个资源,/order/prod/{pid}

  • 察看结果树

 

daf83ec579dc7232ee418950d87a81bb.png

 

272394a4807ec45f0f1ca9e242b68180.png

  • 启动测试计划

方式一:单击上面任务栏的启动符号(适用于测试计划中只有一个线程)

0f4b6c8b6b3d8df657787ccda86e5fcd.png

方式二:右键单击线程启动(适用于测试计划中有多个线程)

 

57614f5c8e1d07b431d1c5fc93506f4f.png

结果:可以看到,成功的请求每次只有2个

 

4d0d263d28240871f97640c3c48b32f1.png

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

入门 - Vue中使用axios原理分析及解决前端跨域问题

1. 什么是Axios&#xff1f; Axios&#xff08;ajax i/o system&#xff09;&#xff0c;是Vue创建者主推的请求发送方式&#xff0c;因其简单的配置与良好的性能被前端爱好者所喜爱。众所周知&#xff0c;在进行网页设计时经常需要从后端拿数据&#xff0c;在Web应用初期会将…

python之matplotlib (1 介绍及基本用法)

介绍 matplotlib是Python中的一个绘图库&#xff0c;它提供了一个类似于 MATLAB 的绘图系统。使用matplotlib你可以生成图表、直方图、功率谱、条形图、错误图、散点图等。matplotlib广泛用于数据可视化领域&#xff0c;是 Python 中最著名的绘图库之一。 同样matplotlib的安…

golang实现一个简单的rpc框架

前言 RPC在分布式系统中经常使用&#xff0c;这里写一个简单的demo实践一下。 code 先生成 go.mod 文件 go mod init rpc-try01定义方法 package model// Args 是 RPC 方法的参数结构体 type Args struct {A, B int }// Arith 定义了一个简单的算术服务 type Arith struct{…

:class的用法及应用

参考小满视频 在同一个标签中&#xff0c;class只能有一个&#xff0c;:class也只能有一个 :class的用法 1. :class “非响应式的变量”&#xff08;一般不使用&#xff0c;和写死了一样&#xff09; const a "style1" <span :class"a"></spa…

python-逆序数(赛氪OJ)

[题目描述] 在一个排列中&#xff0c;如果一对数的前后位置与大小顺序相反&#xff0c;即前面的数大于后面的数&#xff0c;那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个元素个数为 4 的数列&#xff0c;其元素为 2,4,3,1&#xff0c;则 (2,…

Stable Diffusion 使用详解(8)--- layer diffsuion

背景 layer diffusion 重点在 layer&#xff0c;顾名思义&#xff0c;就是分图层的概念&#xff0c;用过ps 的朋友再熟悉不过了。没使用过的&#xff0c;也没关系&#xff0c;其实很简单&#xff0c;本质就是各图层自身的编辑不会影响其他图层&#xff0c;这好比OS中运行了很多…

使用 Python构建 Windows 进程管理器应用程序

在这篇博客中&#xff0c;我们将探讨如何使用 wxPython 构建一个简单的 Windows 进程管理器应用程序。这个应用程序允许用户列出当前系统上的所有进程&#xff0c;选择和终止进程&#xff0c;并将特定进程保存到文件中以供将来加载。 C:\pythoncode\new\manageprocess.py 全部…

RabbitMQ实现多线程处理接收消息

前言&#xff1a;在使用RabbitListener注解来指定消费方法的时候&#xff0c;默认情况是单线程去监听队列&#xff0c;但是这个如果在高并发的场景中会出现很多个任务&#xff0c;但是每次只消费一个消息&#xff0c;就会很缓慢。单线程处理消息容易引起消息处理缓慢&#xff0…

推荐算法实战-五-召回(上)

一、传统召回算法 &#xff08;一&#xff09;基于物料属性的倒排索引 在离线时&#xff0c;将具有相同属性的物料集合起来&#xff0c;根据一些后验统计指标将物料排序。 当一个用户在线交互发出请求后&#xff0c;提取用户的兴趣标签&#xff0c;根据标签检索相应物料集合…

直方图均衡化

概念 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法&#xff0c;通过拉伸像素强度分布范围来增强图像对比度。 原理 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布)&#xff0c;从而令强度值分布会在整个范围内…

CSS知识点详解:div盒子模型

盒子模型&#xff1a; 边框&#xff1a; border-color&#xff1a;边框颜色 border-width&#xff1a;边框粗细 1.thin 2.medium 3.thick 4.像素值 border-width:5px ; border-width:20px 2px; border-width:5px 1px 6px; border-width:1px 3px 5px 2px; 这个简写属性…

Java二十三种设计模式-责任链模式(17/23)

责任链模式&#xff1a;实现请求处理的灵活流转 引言 在这篇博客中&#xff0c;我们深入探讨了责任链模式的精髓&#xff0c;从其定义和用途到实现方法&#xff0c;再到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;旨在指导开发者如何…

基于springboot框架的电影订票系统_wqc3k

TOC springboot611基于springboot框架的电影订票系统_wqc3k--论文 绪 论 1.1研究背景和意义 随着科学技术的不断发展&#xff0c;计算机现在已经成为了社会的必需品&#xff0c;人们通过网络可以获得海量的信息&#xff0c;这些信息可以和各行各业进行关联&#xff0c;电影…

Selenium + Python 自动化测试22(PO+数据驱动)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了PO模式和unittest框架结合起来使用。 本篇文章我们综合一下之前学习的内容&#xff0c;如先将PO模式、数据驱动思想和我们生成HTML报告融合起来&#xff0c;综…

如何应对突发技术故障和危机:开发团队的应急策略

开发团队如何应对突发的技术故障和危机&#xff1f; 在数字化时代&#xff0c;软件服务的稳定性对于企业至关重要。然而&#xff0c;即使是大型平台&#xff0c;如网易云音乐&#xff0c;也可能遇到突发的技术故障。网页端出现502 Bad Gateway 报错&#xff0c;且App也无法正常…

如何生成随机数(通过rand函数,srand函数,time函数深入讲解)

目录 1. 随机数的生成 2. srand函数 3. time函数 4. 设置随机数的范围 1. 随机数的生成 既然是猜数字游戏&#xff0c;那么最终的数字答案肯定是重要的&#xff0c;我们要如何实现这个随机数的生成呢&#xff1f; 在这个功能上&#xff0c;C语言提供了一个函数叫rand&…

数据库多表设计:深入理解一对多、一对一、多对多关系 【后端 12】

数据库多表设计&#xff1a;深入理解一对多、一对一、多对多关系 在数据库设计中&#xff0c;表之间的关系决定了如何组织和存储数据。常见的表关系包括一对多、一对一和多对多。在不同的业务场景下&#xff0c;我们会选择不同的关系模式进行数据库设计。本文将通过具体案例介绍…

Excel技巧(一)

快捷键技巧 原文链接 选取某一行的数据直到最后一行&#xff1a;【CTRL SHIFT ↓ 】或者选取一行后按住SHIFT键&#xff0c;双击下边线就可以快速选取区域。 如果表格中有多行空行&#xff0c;可以先按CTRL SHIFT END&#xff0c;再按CTRL SHIFT 上下键调整&#xff0c;…

网络安全之xss靶场练习

目录 一、xss靶场练习 1、Ma Spaghet! 2、Jefff 第一个方法 第二个方法 3、Ugandan Knuckles 4、Ricardo Milos 5、Ah Thats Hawt 6、Ligma 7、Mafia​编辑 8、Ok, Boomer 一、xss靶场练习 靶场地址 https://xss.pwnfunction.com/ 页面显示如下 1、Ma Spaghet! 分析…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——6.vector

1.杨辉三角 . - 力扣&#xff08;LeetCode&#xff09; 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> arr;int i 0;int j 0;for (i…