当前位置: 首页 > news >正文

微服务的保护

一、雪崩问题及解决方案

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

 

相关文章:

微服务的保护

一、雪崩问题及解决方案 1.雪崩问题 微服务之间&#xff0c;一个微服务依赖多个其他的微服务。当一个微服务A依赖的一个微服务B出错时&#xff0c;微服务A会被阻塞&#xff0c;但其他不依赖于B的微服务不会受影响。 当有多个微服务依赖于B时&#xff0c;服务器支持的线程和并…...

2024前端面试题-网络篇

1.跨域问题 同源策略&#xff1a;需要协议、域名、端口号相同跨域原因&#xff1a;不符合同源策略便会产生跨域问题解决跨域&#xff1a;JSONP、配置代理、通过CORS解决 2.RPC和HTTP的区别 主要区别是序列化和反序列化&#xff0c;RPC通过二进制高效传输&#xff0c;HTTP是j…...

移情别恋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…...

设计模式---简单工厂模式

简单工厂模式&#xff08;Simple Factory Pattern&#xff09; 是一种创建型设计模式&#xff0c;它定义了一个工厂类&#xff0c;通过这个工厂类可以创建不同类型的对象。简单工厂模式的主要目的是将对象的创建逻辑集中在一个地方&#xff0c;简化客户端的代码&#xff0c;使得…...

Vue | Vue 中的 refInForde 用法

refInFor&#xff1a;如果你在渲染函数中给多个元素都应用了相同的 ref 名&#xff0c;那么 $refs.myRef 会变成一个数组。 vue中的refInFor属性是Vue框架中用于在循环渲染的元素上设置引用的一种方式。‌ 在Vue中&#xff0c;‌ref属性通常用于给元素或子组件注册引用信息&am…...

【原创】java+swing+mysql房屋租赁管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…...

Django 中render、redirect 和 HttpResponse的区别

在 Python 的 Web 框架 Django 中&#xff0c;render, redirect 和 HttpResponse 是用于处理 HTTP 响应的不同函数&#xff0c;它们各自有不同的用途&#xff1a; HttpResponse&#xff1a; HttpResponse 是 Django 中最基本的响应对象&#xff0c;用于返回给客户端的 HTTP 响应…...

CRYPTO 2020

分类文章编号安全模型1-6公钥加密,功能加密,见证加密7-12后量子密码13-20密码分析21-31最佳论文32-34多方安全计算35-49真实应用50-55零知识证明56-62格和相关难题63-68泄露和外包加密69-74非交互式零知识证明,共识和延迟函数75-79构建80-85Security Models 1. Handling Ad…...

java 函数接口Consumer简介与示例【函数式编程】【Stream】

Java 8 中的 消费者接口Consumer 是一个函数接口&#xff0c;它可以接受一个泛型 类型参数&#xff0c;它属于java.util.function包。我们来看看Java函数接口库中的定义&#xff1a; FunctionalInterface public interface Consumer<T> {/*** Performs this operation o…...

黑神话:悟空-配置推荐

显卡推荐&#xff08;按类别整理&#xff09; 1. GTX 10系列、GTX 16系列&#xff1a; 如果希望体验光线追踪&#xff0c;建议根据预算升级到RTX 40系列显卡。对于1080p分辨率&#xff0c;至少需要RTX 4060才能流畅运行。 2. RTX 20系列&#xff1a; RTX 2060、RTX 2070&#…...

Android14 蓝牙设备类型修改

Android14 蓝牙设备类型设置修改设置 文章目录 Android14 蓝牙设备类型设置修改设置一、前言二、修改蓝牙设备类型1、蓝牙设备类型和对应的属性2、Debug设备设置和获取蓝牙设备类型3、系统源码中设置蓝牙设备类型4、Java代码中设置蓝牙prop属性可行吗&#xff1f; 三、其他1、A…...

vue3 语法糖<script setup>

在 Vue 3 中&#xff0c;<script setup>是一种新的语法糖&#xff0c;它极大地简化了组件的编写方式。 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。 基本概念 简洁的语法&#xf…...

微服务设计原则——高性能:异步与并发

文章目录 1.异步1.1 调用异步1.2 流程异步1.3 数据流异步1.4 小结 2.并发2.1 请求并发2.2 冗余请求2.3 小结 参考文献 1.异步 对于处理耗时长的任务&#xff0c;如果采用同步等待的方式&#xff0c;会严重降低系统的吞吐量&#xff0c;可以采用异步化进行解决。 异步&#xf…...

机器学习——决策树,朴素贝叶斯

一.决策树 决策树中的基尼系数&#xff08;Gini Index&#xff09;是用于衡量数据集中不纯度&#xff08;或混杂度&#xff09;的指标。基尼系数的取值范围在0到0.5之间&#xff0c;其中0表示数据完全纯&#xff08;同一类别&#xff09;&#xff0c;0.5表示数据完全混杂。 基…...

C语言基础(十)

编译预处理命令&#xff1a; 预编译命令在C语言中用于在编译前进行一些特定的处理和控制&#xff0c;帮助程序员更灵活地管理源代码和控制编译过程。 C语言常用的预编译命令&#xff1a; #include&#xff1a;用于包含头文件&#xff0c;将另一个文件的内容插入到当前文件中…...

人像比对-人证比对-人脸身份证比对-人脸身份证实名认证-人脸三要素对比-实人认证

人脸身份证实名认证是一种基于生物识别技术的身份验证方式&#xff0c;主要依托证件OCR识别技术、活体检测、人脸比对等技术手段&#xff0c;对用户身份信息真实性进行核验&#xff0c;确保用户为真人且为本人。以下是关于人脸身份证实名认证的详细解析&#xff1a; 一、认证流…...

Android 上下滑隐藏显示状态栏

一、DisplayPolicy类中监听滑动事件&#xff0c;然后发送广播事件 Android12类路径&#xff1a; frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.javamSystemGestures new SystemGesturesPointerEventListener(mUiContext, mHandler,new SystemGest…...

USBCAN-II/II+使用方法以及qt操作介绍

一.USBCAN-II/II介绍 USBCAN-II/II 是一款常用的 USB-CAN 转换器&#xff0c;广泛应用于汽车电子、工业自动化等领域。以下是使用该设备的一般步骤和方法&#xff1a; 1. 硬件连接 连接设备&#xff1a;将 USBCAN-II/II 的 USB 接口连接到计算机的 USB 端口。 连接 CAN 网络…...

笔记-系统规划与管理师-案例题-2022年-IT服务部署实施

【说明】 某大型企业去年信息化投入大&#xff0c;完成了重点核心业务系统的建设。由于应急相应预案制定得不充分并且未开展演练&#xff0c;出现了系统性故障时&#xff0c;部分关键的应用系统不可用且在12小时内未能完成恢复业务&#xff0c;给企业带来了较大损失。 为加强该…...

Kubernetes 清理资源常用的 Kubernetes 清理命

清理特定状态的 Pod&#xff1a; 清理 Evicted 状态的 Pod&#xff1a; kubectl get pods --all-namespaces -o wide | grep Evicted | awk {print $1,$2} | xargs -L1 kubectl delete pod -n清理 Error 状态的 Pod&#xff1a; kubectl get pods --all-namespaces -o wide | g…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...