SpringCloudGateway--Sentinel限流、熔断降级
目录
一、概览
二、安装Sentinel
三、微服务整合sentinel
四、限流
1、流控模式
①直接
②关联
③链路
2、流控效果
①快速失败
②Warm Up
③排队等待
五、熔断降级
1、慢调用比例
2、异常比例
3、异常数
一、概览
SpringCloudGateway是一个基于SpringBoot2.x的API网关,它可以帮助实现路由、过滤、容错等功能,同时也是微服务架构中不可或缺的一部分。在这篇博客中,将会了解到如何使用Sentinel实现SpringCloudGateway的限流、熔断降级。
Sentinel是一个轻量级的流量控制框架,它可以帮助我们实现熔断降级、限流等功能,同时也可以与SpringCloudGateway无缝集成。通过使用Sentinel,可以有效地保护微服务架构免受故障和异常的影响。
二、安装Sentinel
官方提供了UI控制台,下载地址:https://github.com/alibaba/Sentinel/releases
将下载好的jar包放到任意非中文路径目录,使用java命令启动,可以修改Sentinel的默认端口、账户、密码;server.port默认8080,sentinel.dashboard.auth.username默认sentinel,sentinel.dashboard.auth.password默认sentinel。
比如我这里放到D盘的Jar文件夹,启动时换成2500端口,命令如下:
java -Dserver.port=25000 -jar D:\Jar\sentinel-dashboard-1.8.2.jar
启动之后访问:http://localhost:25000/,账户密码都是sentinel,第一次启动后界面是空白的,因为还没有进行相关微服务项目的整合。

三、微服务整合sentinel
SpringCloudGateWay项目参考:SpringCloudGateway--自动路由映射与手动路由映射_雨欲语的博客-CSDN博客,源码下载地址:
GitHub - dengyifanlittle/littledyf-test: my-test
添加依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2020.0.RC1</version></dependency>
添加配置文件:
spring:cloud:sentinel:transport:# 服务监控端口dashboard: localhost:25000# 默认 8719,如果8719被占用了会自动从 8719 开始依次 +1 扫描,直至找到未被占用的端口port: 8719
四、限流
启动项目,访问:http://localhost:9999/service/nacos/test,这时再刷新sentinel界面,里面便有数据了

流控规则页面新增:

资源名:指需要进行流控的资源名称。例如,如果我们需要对某个 API 接口进行流控,那么这个 API 接口的地址就是这个规则的资源名。
针对来源:指需要进行流控的请求来源,可以是单个 IP 地址、应用程序、用户等。例如,我们可以为某个 IP 地址创建一个流控规则,或者为某个应用程序创建一个流控规则,填写微服务名,默认 default(不区分来源)。
阈值类型/单位阈值:指流控的阈值类型和具体的阈值。阈值类型可以是并发线程数、QPS(每秒请求数)等,具体的阈值则取决于阈值类型。例如,如果阈值类型为并发线程数,那么阈值可以是 100,表示最多只能有 100 个并发线程在访问这个资源
是否集群:指这个流控规则是否应用于整个集群,如果是,则表示该规则将应用于整个集群范围内的所有实例。如果不是,则表示规则只应用于当前实例。
流控模式:指当超过阈值时,Sentinel 会采取的流控策略。有三种模式,分别为直接流控模式、关联流控模式、链路流控模式。
①直接流控模式:当资源超过阈值时,直接拒绝请求。这是一种比较常见的流控模式,适用于对请求处理能力要求比较高的场景,如秒杀系统。
②关联流控模式:当资源超过阈值时,拒绝请求的同时,还会对关联的资源进行流控。这种流控模式适用于有些资源的请求频率较低,但是对资源的请求能力有较大的影响的场景,如数据库或者缓存。
③链路流控模式:当资源超过阈值时,不仅会对当前请求进行流控,还会对整个请求链路上的资源进行流控。这种流控模式适用于分布式系统中的场景,例如微服务架构下的请求链路。
流控效果:指当流控规则触发时,Sentinel 采取的具体流控效果。
①快速失败:在快速失败的流控效果下,当请求被拒绝后,Sentinel会立即返回错误信息,告诉请求方请求被拒绝。这种流控效果适用于对响应时间要求比较高的场景,例如秒杀系统或高并发的API接口。
②Warm Up:在Warm Up的流控效果下,当系统初次启动或资源被重新分配时,Sentinel会允许一部分请求通过,以减缓流控策略的限制,等待系统稳定后再进行全面的流控。这种流控效果适用于需要短时间内承受高流量的场景,例如系统升级或重启。
③排队等待:在排队等待的流控效果下,当请求被拒绝后,Sentinel会将请求放入等待队列中,等待资源可用后再进行处理。这种流控效果适用于对响应时间要求不是很高的场景,例如消息队列或后台任务。
1、流控模式
①直接
新增流控规则,流控模式选择直接模式,阈值类型QPS,单机阈值1:

使用jemeter进行测试,线程数量、现成启动时间、运行次数分别设置为1、1、4:

可以看到有一个成功,三个失败,且失败信息是sentinel默认:


删除原有规则,新增流控规则,流控模式选直接,阈值类型选择并发线程数,单机阈值设置为2,微服务中只启动一个service即可,并修改其中代码:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author dengyifan* @create 2023/11/1 17:02* @description*/@RestController
@RequestMapping("/nacos")
public class NacosTestController {@GetMapping("/test")public String test() throws InterruptedException {Thread.sleep(2000);return "8088";}
}
并发线程数表示1秒内访问该API接口的线程数,当排队的线程数达到设定的阈值的时候就会进行限流操作,这种通常是出现在访问接口响应很慢的时候,因此代码里面主动休眠2秒模拟。jmeter模拟测试时线程数设置为10,其余为1:

可以看到返回结果中成功两次,其余8次失败,并返回sentinel默认错误信息:

如果将sentinel的流控规则删除,则全部成功:

②关联
新增流控规则,流控模式选择关联,阈值类型选择QPS,单机阈值设置为2,关联资源填写另外的访问接口:

在我们的微服务中新增两个接口:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author dengyifan* @create 2023/11/1 17:02* @description*/@RestController
@RequestMapping("/nacos")
public class NacosTestController {@GetMapping("/test-one")public String testOne() {return "8088-one";}@GetMapping("/test-two")public String testTwo() {return "8088-two";}
}
在jmeter中线程组设置为1、1、10:

设置两个http请求,分别设置为test-one和test-two:

启动测试,可以发现模拟test-one的接口两个成功,8个失败,模拟test-two的接口10个全部成功,因为设置了关联模式,并且test-one关联了test-two接口,当test-two接口的访问超过2的时候,就会让test-one的处于失败状态。这种:


③链路
对于链路模式,比如A路径会访问到资源C,B路径也会访问到资源C,此时配置链路模式,入口资源设置为A,当访问A达到一定限制就会触发限流,B没有配置,则不会触发。
配置文件增加:
sentinel.web-context-unify=false
在gateway项目中新建Controller和Service:
import com.littledyf.service.SentinelTestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author dengyifan* @create 2023/11/9 10:41* @description*/
@RestController
@RequestMapping("/test")
public class SentinelTestController {@Autowiredprivate SentinelTestService sentinelTestService;@GetMapping("/test-sentinel")public String testSentinel() {return sentinelTestService.testSentinel();}
}
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;/*** @Author dengyifan* @create 2023/11/9 10:42* @description*/
@Service
public class SentinelTestService {@SentinelResource("sentinel")public String testSentinel() {return "test sentinel";}
}
其中@SentinelResource("sentinel")是手动设置资源名,sentinel只会扫描controller层的资源,service通过注解设置。
新增链路流控:

jmeter添加测试:

启动测试查看结果可发现4次里面3次失败:

2、流控效果
①快速失败
之前流控模式都是使用快速失败,即直接失败,抛出异常。
②Warm Up
warm up是指预热,比如一些秒杀环节,之前系统流量不高,当秒杀开启突然升高,这个时候开启预热模式,让通过的流量缓慢增加,能够达到设定阈值为止,这样能够很好的保护系统。
其中会有一个默认1的coldFactor,该值为3,请求QPS从threshold/3开始,经过设置的预热时间后达到设定的阈值,比如我们现在进行以下设置:

即刚开始有5/3个,后面经过3秒后达到设定的阈值5。
jmeter设置:

启动后可以看到前几秒都有失败的,经过3秒后,就稳定达到5个成功:

③排队等待
排队等待即让请求均匀通过,其实跟漏桶算法是对应的,选择排队等待,必须要将类型设置为QPS,否则是无效的:

jmeter设置:

效果:

五、熔断降级
新增熔断规则界面:

资源名:指需要进行流控的资源名称。例如,如果我们需要对某个 API 接口进行流控,那么这个 API 接口的地址就是这个规则的资源名。
熔断策略:表示触发熔断的条件
①慢调用比例
②异常比例
③异常数
最大RT:当资源的响应时间超过设定的阈值,则统计计数
比例阈值:表示触发熔断的比例阈值,当某个熔断策略的比例超过该阈值,触发熔断
熔断时长:表示触发熔断后,保持熔断状态的时间,一般是为了避免熔断状态过早结束,导致系统负载过高
最小请求数:表述触发熔断的最小请求数,当某个资源的请求数不足该值时,不触发熔断
统计时长:表示熔断策略统计的时间范围,例如最近10秒内的统计数据
1、慢调用比例
为了模拟慢调用,在接口中进行1000毫秒的休眠达到响应慢的作用:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author dengyifan* @create 2023/11/1 17:02* @description*/@RestController
@RequestMapping("/nacos")
public class NacosTestController {@GetMapping("/test")public String test() throws InterruptedException {Thread.sleep(1000);return "8088";}
}
熔断设置:

jmeter设置:

结果:

刚运行完之后,在5秒内继续运行,可以看到结果都是失败状态,都被熔断处理了。
2、异常比例
代码修改成会出现异常的情况:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @Author dengyifan* @create 2023/11/1 17:02* @description*/@RestController
@RequestMapping("/nacos")
public class NacosTestController {@GetMapping("/test")public String test() throws Exception {String s = null;if (s.equals("1")){return "1";}return "8088";}
}
新增熔断规则,熔断策略选择异常比例:

jmeter设置不变,其中前5个都会抛出空指针异常,后面5个是直接熔断:


3、异常数
熔断策略选择异常数跟异常比例类似,只是异常比例变为异常数了而已
sentinel还可以配置热点规则以及系统自适应限流。热点规则就类似于微博热搜一样,有时候突然一个热点访问量大,这时候可以进行限流设置,很多时候热点都会进行相应的缓存,比如加上一级缓存、二级缓存等,这些实际就是为了保护系统而进行的设置。
相关文章:
SpringCloudGateway--Sentinel限流、熔断降级
目录 一、概览 二、安装Sentinel 三、微服务整合sentinel 四、限流 1、流控模式 ①直接 ②关联 ③链路 2、流控效果 ①快速失败 ②Warm Up ③排队等待 五、熔断降级 1、慢调用比例 2、异常比例 3、异常数 一、概览 SpringCloudGateway是一个基于SpringBoot2.x的…...
ARMday02(汇编语法、汇编指令)
汇编语法 汇编文件中的内容 1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做…...
docker容器中运行jar 出现invalid or corrupt jarfile
1,背景: 在本地java开发完毕之后,想要打包成docker镜像,方便安装。由于本地没有docker环境,也懒得装了。有一台测试的linux机器可以使用,所以先在本地打包生成xxx.jar,然后拷贝到有docker环境的…...
PHP+MySQL人才招聘小程序系统源码 带完整前端+后端搭建教程
在当今竞争激烈的人才市场中,招聘平台的需求日益增长。传统的招聘平台往往需要投入大量的人力物力进行维护和管理,这对于许多中小企业来说是一个沉重的负担。因此,开发一个简单易用、高效便捷的招聘平台显得尤为重要。 PHP是一种流行的服务器…...
MongoDB常用的语句
mongodb 可视化工具: Robo3T。 DataGrip,对mongodb的日期格式不友好。 MongoDB常用的语句: 注意,凡是涉及到日期类型的,最好都用这种格式 ISODate(“2023-03-27T16:00:00.000Z”) MongoDB倒序,查询&am…...
MIPSsim模拟器 使用说明
(一) 启动模拟器 双击MIPSsim.exe,即可启动该模拟器。模拟器启动时,自动将自己初始化为默认状态。所设置的默认值为: u所有通用寄存器和浮点寄存器为全0; u内存清零; u流水寄存器为全0ÿ…...
javascript用localStorage存储用户搜索词记录,并在搜索框下展显搜索词记录
//首先是storage的一封装 //storage.js文件 function storage(){//设置storage密钥this.ms"mystorage";}//以下为函数的原型方法//获得localStorage值storage.prototype.getLocalfunction(key){//先检查设置的localStorage的密钥var mydatalocalStorage.getItem(thi…...
20231108在Ubuntu22.04下编译安装cmake-3.27.7.tar.gz
20231108在Ubuntu22.04下编译安装cmake-3.27.7.tar.gz 2023/11/8 17:28 缘起,编译cv180zb的时候提示说cmake的版本低! OBJCOPY platform/generic/firmware/payloads/test.bin OBJCOPY platform/generic/firmware/fw_dynamic.bin OBJCOPY platfor…...
如此理解sed会简单
缘由 以前总觉得sed的语法过于难懂,用的时间都不一定会想起来怎么用。 每次都需要先查找帮助,然后才能应用,但随后又忘 😦 直到今天通过man sed链接到sed官网上对sed的介绍,才明白它竟然是如此的简单明了࿰…...
数据库-MySQL之数据库必知必会1-9章
检索数据 1.检索不重复的行 从 Customers 表中检索所有的 ID select DISTINCT cust_id from Customers;DISTINCT表示去掉重复的行 2.限制结果-分页 SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。…...
Selenium+Python自动化测试环境搭建
selenium python 自动化测试 —— 环境搭建 关于 selenium Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7、8、9)、Mozilla Firefox、Mozilla Suite等。 Selenium 框架底层使用JavaS…...
k8s存储卷 PV和PVC
目录 emptyDir存储卷 hostPath存储卷 nfs共享存储卷 PVC 和 PV 生命周期 一个PV从创建到销毁的具体流程如下: 静态pvc 动态pvc 3、定义PVC 4、测试访问 搭建 StorageClass NFS,实现 NFS 的动态 PV 创建 1、在stor01节点上安装nfs࿰…...
【架构】后端项目经典分层架构介绍
文章目录 前言分层架构项目实践示例项目结构 其他知识 前言 开发后端项目时,我们最常见的一种架构模式就是分层架构 。 所谓的分层架构,就是把系统自上而下分为多个不同的层,每一层都有特定的功能和职责,且只和自己的直接上层与…...
二叉树的中序遍历
一、题目。 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:…...
什么是代理IP池?真实测评IP代理商的IP池是否真实?
代理池充当多个代理服务器的存储库,提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务,而无需担心被检测或阻止的风险。代理池为各种在线活动(例如网页抓取、安全浏览等)提高后勤保障。 读完…...
接收表单数据
如果您尝试按下提交按钮,浏览器将显示“Method Not Allowed”错误。这是因为到目前为止,前一节中的登录视图函数完成了一半的工作。它可以在网页上显示表单,但是还没有逻辑来处理用户提交的数据。这是Flask-WTF使工作变得非常简单的另一个领域…...
串口通信(11)-CRC校验介绍算法
本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…...
什么是Java虚拟机(JVM),它的作用是什么?
什么是Java虚拟机(JVM) Java虚拟机(Java Virtual Machine,JVM)是Java平台的关键组成部分,它是一种在不同操作系统上运行Java程序的虚拟计算机。 JVM的作用是执行Java字节码(Java bytecode&#…...
力扣876:链表的中间结点
力扣876:链表的中间结点 题目描述: 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5]…...
三菱FX3U系列—原点回归指令
目录 一、简介 二、指令形式 1、原点指令[ZRN/DZRN] 2、带搜索的原点回归指令[DSZR] 三、回归指令运行过程 1、ZRN原点回归运行过程 2、带搜索的原点回归运行过程 四、特殊辅助继电器 五、特殊输出模块 六、总结 一、简介 用于将电机或伺服驱动器控制的轴回到预定的原…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
