Spring Cloud中Sentinel的两种限流模式介绍
作者:小威要向诸佬学习呀 发布时间:2021-11-22 00:38:10
Sentinel流控模式
Sentinel流量控制主要有以下几种模式:
直接失败模式:在达到流量控制阈值后,直接拒绝请求,返回错误信息。
关联模式:当关联的资源达到流量控制阈值时,将触发当前资源的流量控制。
Warm Up模式:在系统启动时,允许一定量的请求通过,防止出现系统冷启动时大量请求被拒绝的情况。
排队等待模式:在达到流量控制阈值后,请求将进入队列等待,直到有资源可用时再处理请求。
热点规则:对于一些热点资源,可以设置特定的流量控制规则,以防止热点资源被过多请求占用导致系统崩溃。
说明:由于篇幅原因,本篇文章先介绍前两种模式,即直接失败模式和关联模式。
直接失败模式
Sentinel的直接失败模式是一种流量控制策略,它可以在系统达到预设的流量阈值时直接拒绝请求,而不是将请求放入队列等待处理。该模式可以避免系统资源过度消耗,并且可以快速响应请求,提高系统的可用性。
具体来说,Sentinel的直接失败模式可以通过以下步骤实现:
1.配置流量阈值:在Sentinel中,可以通过配置规则来设置系统的流量阈值,例如:每秒最多处理100个请求。
2.监控流量:Sentinel会监控系统的流量,当流量达到预设的阈值时,Sentinel会触发流量控制策略。
3.直接拒绝请求:在直接失败模式下,当流量达到阈值时,Sentinel会直接拒绝请求,并返回错误信息给客户端,而不是将请求放入队列等待处理。
4.统计流量:Sentinel会统计系统的流量情况,并根据配置的规则进行限流,以保证系统的稳定性和可用性。
首先,我们需要添加Sentinel依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
然后,在启动类上添加@EnableSentinel注解启用Sentinel:
@SpringBootApplication
@EnableSentinel
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
接下来,我们定义一个Controller,其中包含一个需要进行流量控制的方法:
@RestController
public class DemoController {
@GetMapping("/hello")
@SentinelResource(value = "hello", fallback = "fallback")
public String hello() {
return "Hello, World!";
}
public String fallback() {
return "Sorry, the service is busy, please try again later.";
}
}
在上面的代码中,我们使用@SentinelResource注解标记了hello()方法,并指定了一个fallback方法。当Sentinel进行流量控制并触发熔断时,会自动调用fallback方法返回一个固定的响应。
接下来,我们需要在Sentinel Dashboard中配置流量控制规则。打开Dashboard,进入流控规则页面,添加一个新的规则,将控制台模式设置为直接失败,并设置阈值和时间窗口等参数。保存规则后,我们就可以开始测试了。
当流量超过阈值时,Sentinel会拒绝请求并返回一个固定的响应,即fallback方法中定义的响应。这就是Sentinel的直接失败模式。
关联模式
Sentinel的关联模式是一种流量控制策略,它可以根据不同的资源之间的关联关系来进行流量控制。比如,如果一个接口的访问频率过高,可能会导致其所依赖的其他接口也受到影响,此时就可以使用关联模式来控制流量。
关联模式的实现需要定义资源之间的关联关系,并为每个资源设置独立的流控规则。在实际使用中,可以通过配置文件或代码来定义关联关系和流控规则。
以下是一个使用代码实现Sentinel关联模式的示例:
// 定义资源关联关系
private static final String RESOURCE_A = "resourceA";
private static final String RESOURCE_B = "resourceB";
private static final String RESOURCE_C = "resourceC";
// 定义流控规则
private static final FlowRule RULE_A = new FlowRule(RESOURCE_A)
.setCount(10) // 每秒最多处理10个请求
.setGrade(RuleConstant.FLOW_GRADE_QPS);
private static final FlowRule RULE_B = new FlowRule(RESOURCE_B)
.setCount(20) // 每秒最多处理20个请求
.setGrade(RuleConstant.FLOW_GRADE_QPS);
private static final FlowRule RULE_C = new FlowRule(RESOURCE_C)
.setCount(30) // 每秒最多处理30个请求
.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 定义资源关联关系
private static final Set<FlowRule> RULES_A = new HashSet<>();
private static final Set<FlowRule> RULES_B = new HashSet<>();
private static final Set<FlowRule> RULES_C = new HashSet<>();
static {
RULES_A.add(RULE_A);
RULES_A.add(RULE_B);
RULES_B.add(RULE_B);
RULES_C.add(RULE_C);
}
// 注册流控规则
FlowRuleManager.loadRules(RULES_A);
FlowRuleManager.loadRules(RULES_B);
FlowRuleManager.loadRules(RULES_C);
// 定义资源关联关系
DegradeRule degradeRuleA = new DegradeRule(RESOURCE_A)
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT)
.setCount(5) // 每秒最多处理5个异常
.setTimeWindow(10); // 统计时间窗口为10秒
DegradeRule degradeRuleB = new DegradeRule(RESOURCE_B)
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT)
.setCount(10) // 每秒最多处理10个异常
.setTimeWindow(10); // 统计时间窗口为10秒
DegradeRule degradeRuleC = new DegradeRule(RESOURCE_C)
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT)
.setCount(15) // 每秒最多处理15个异常
.setTimeWindow(10); // 统计时间窗口为10秒
// 定义资源关联关系
private static final Set<DegradeRule> DEGRADE_RULES_A = new HashSet<>();
private static final Set<DegradeRule> DEGRADE_RULES_B = new HashSet<>();
private static final Set<DegradeRule> DEGRADE_RULES_C = new HashSet<>();
static {
DEGRADE_RULES_A.add(degradeRuleA);
DEGRADE_RULES_A.add(degradeRuleB);
DEGRADE_RULES_B.add(degradeRuleB);
DEGRADE_RULES_C.add(degradeRuleC);
}
// 注册降级规则
DegradeRuleManager.loadRules(DEGRADE_RULES_A);
DegradeRuleManager.loadRules(DEGRADE_RULES_B);
DegradeRuleManager.loadRules(DEGRADE_RULES_C);
在上面的代码中,我们定义了三个资源:RESOURCE_A、RESOURCE_B、RESOURCE_C,并为每个资源设置了独立的流控规则和降级规则。同时,我们还定义了资源之间的关联关系,即RESOURCE_A和RESOURCE_B关联,RESOURCE_B和RESOURCE_C关联。
通过这种方式,当RESOURCE_A的流量达到限制时,Sentinel会自动触发降级操作,从而避免RESOURCE_B和RESOURCE_C受到影响。同样地,当RESOURCE_B的流量达到限制时,Sentinel会自动触发降级操作,从而避免RESOURCE_C受到影响。
来源:https://blog.csdn.net/qq_53847859/article/details/130566565


猜你喜欢
- 需要装一个插件:File - Settings- Plugins - 搜索gson 安装GsonFromat;如下两张图安装完成后 ,新建一
- collect通知flow执行public suspend inline fun <T> Flow<T>.colle
- <dependency> <groupId>org.projectlombok</g
- 最近部门打算优化下 APP 在低端机上的卡顿情况,既然想优化,就必须获取卡顿情况,那么如何获取卡顿情况就是本文目的。一般主线程过多的 UI
- 最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换;由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各
- 前言Postman是一款Http请求模拟工具.它可以模拟各种Http Request,使用起来十分的方便.使用背景利用Spring Boot
- Hi~大家好,出来创业快3个月了,一切还不错,前一段时间用了业余时间搞了个问答类网站YQMA.想做中国的stackoverflow,哈哈,只
- 一、简介编写手机App时,有时需要使用文字转语音(Text to Speech)的功能,比如开车时阅读收到的短信、导航语音提示、界面中比较重
- jax-ws handler 的详解及简单实例aop技术一般用于某个对象的函数调用的日志,认证等。webservice是远程的函
- 效果图如下所示:代码:<LinearLayout android:orientation="horizontal
- 问题描述问题原因出现该问题的原因是项目Project当中的jdk与电脑当中的jdk版本不一致造成的。解决方法1、查看本机的jdk版本:命令提
- 背景某项目,客户要求使用已有的 weblogic 部署已经开发好的 springboot,于是乎对 springboot 进行了部分配置的调
- 前言Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,它有两个核心方法:exchange(V
- 对于以下数据,如何在运行时通过字符串来得到静态变量UIPath的值。public class GameMainMenu : UIClass{
- 前言:经常会看到有一些app的banner界面可以实现循环播放多个广告图片和手动滑动循环。本以为单纯的ViewPager就可以实
- 前言坚持是一件比较难的事,坚持并不是自欺欺人的一种自我麻痹和安慰,也不是做给被人的,我觉得,坚持的本质并没有带着过多的功利主义,如果满是功利
- 1、注解@PathVariable:将请求url中的占位符参数与控制器方法入参绑定起来(Rest风格请求)@RequestHeader:获取
- 本文实例讲述了Java编程使用卡片布局管理器。分享给大家供大家参考,具体如下:运行效果:完整示例代码:package com.han;imp
- Android 四种获取屏幕宽度的方法方法一: WindowManager wm = (WindowManager) this
- 本项目是前端vue3,后端springboot开发 需求为:前端导入表格,后端处理表格存储数据,点击按钮可以导出表格。上传效果:前端点击上传