SpringCloudAlibaba 服务保护 Sentinel 项目集成实践
目录
- 一、简介
- 1.1、服务保护的基本概念
- 1.1.1、服务限流/熔断
- 1.1.2、服务降级
- 1.1.3、服务的雪崩效应
- 1.1.4、服务的隔离的机制
- 1.2、Sentinel的主要特性
- 1.3、Sentinel整体架构
- 1.4、Sentinel 与 Hystrix 对比
- 二、Sentinel控制台部署
- 3.1、版本选择和适配
- 3.2、本文使用各组件版本
- 3.3、官方推荐版本
- 3.4、部署Sentinel控制台
- 3.4.1、下载 sentinel-dashboard jar包
- 3.4.2、启动 sentinel-dashboard
- 三、项目集成 Sentinel 实现简单流控
- 3.1、项目中添加 Sentinel 集成包
- 3.2、简单集成(不使用Sentinel控制台配置)
- 3.2.1、添加流控规则
- 3.2.2、使用 3.2.1 加载的流控规则
- 3.2.2.1、硬编码使用流控规则
- 3.2.2.2、使用@SentinelResource指定流控规则
- 3.3、集成 Sentinel 控制台实现流控规则动态配置
- 3.3.1、添加Sentinel控制台连接配置
- 3.3.2、通过控制台添加新流控规则测试效果
- 3.3.2.1、先准备一个接口(这个接口只简单返回一个字符串)
- 3.3.2.2、控制台添加流控规则
- 3.3.2.3、测试流控效果
- 四、项目整合 Nacos 实现 Sentinel 规则持久化
- 4.1、添加 Sentinel 集成 Nacos 包
- 4.2、Nacos配置中心创建我们的流控规则(kerwin-user-flow-rules)
- 4.3、配置文件配置加载Nacos配置中心流控规则json
- 4.4、验证配置是否有效
- 五、常用规则配置JSON解析以及加载
- 5.1、流量控制规则(FlowRule)
- 5.1.1、配置流控规则JSON
- 5.1.2、配置文件配置加载Nacos配置中心流控规则json
- 5.2、熔断降级规则(DegradeRule)
- 5.2.1、配置熔断降级规则JSON
- 5.2.2、配置文件配置加载Nacos配置中心熔断降级规则json
- 5.3、热点参数规则(ParamFlowRule)
- 5.3.1、配置熔断降级规则JSON
- 5.3.2、配置文件配置加载Nacos配置中心熔断降级规则json
- 5.4、系统保护规则(SystemRule)
- 5.4.1、配置熔断降级规则JSON
- 5.4.2、配置文件配置加载Nacos配置中心熔断降级规则json
- 六、Sentinel 规则触发响应信息统一处理
一、简介
Sentinel 是 SpringCloud Alibaba 家族的服务保护组件,很多项目在前中期没有遇到流量突增不太注意服务保护的重要性,当流量突增打爆应用服务或数据库时束手无策,可以不配置流控规则,但是需要时一定可以热加载使用,本文会对集成Sentinel以及动态拉取Nacos配置规则实现热加载流控规则进行讲解。
官网地址
1.1、服务保护的基本概念
1.1.1、服务限流/熔断
- 服务限流目的是为了更好的保护我们的服务,在高并发的情况下,如果客户端请求的数量达到一定极限(后台可以配置阈值),请求的数量超出了设置的阈值,开启自我的保护,直接调用我们的服务降级的方法,不会执行业务逻辑操作,直接走本地falback的方法,返回一个友好的提示。
1.1.2、服务降级
- 在高并发的情况下, 防止用户一直等待,采用限流/熔断方法,使用服务降级的方式返回一个友好的提示给客户端,不会执行业务逻辑请求,直接走本地的falback的方法。
给出一个友好提示:当前排队人数过多,稍后重试!
1.1.3、服务的雪崩效应
- 默认的情况下,Tomcat或者是Jetty服务器只有一个线程池去处理客户端的请求,
这样的话就是在高并发的情况下,如果客户端所有的请求都堆积到同一个服务接口上,
那么就会产生tomcat服务器所有的线程都在处理该接口,可能会导致其他的接口无法访问。
假设我们的tomcat线程最大的线程数量是为20,这时候客户端如果同时发送100个请求会导致有80个请求暂时无法访问,就会转圈。
1.1.4、服务的隔离的机制
- 服务的隔离机制分为信号量和线程池隔离模式
服务的线程池隔离机制:每个服务接口都有自己独立的线程池,互不影响,缺点就是占用cpu资源非常大。
服务的信号量隔离机制:最多只有一定的阈值线程数处理我们的请求,超过该阈值会拒绝请求。
1.2、Sentinel的主要特性
- Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
1.3、Sentinel整体架构
有特殊需要还可以将自定义规则插入调用链路中。
1.4、Sentinel 与 Hystrix 对比
Sentinel | Hystrix | |
---|---|---|
隔离策略 | 信号量隔离 | 线程池隔离/信号量隔离 |
熔断降级策略 | 基于响应时间或失败比率 | 基于失败比率 |
实时指标实现 | 滑动窗口 | 滑动窗口(基于 RxJava) |
规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持慢启动、匀速器模式 | 不支持 |
系统负载保护 | 支持 | 不支持 |
控制台 | 开箱即用,可配置规则、查看秒级监控、机器发现等 | 不完善 |
常见框架的适配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
二、Sentinel控制台部署
3.1、版本选择和适配
使用 SpringCloud Alibaba 家族组件,要注意一下版本兼容问题,避免出现一些奇怪的问题,这里会说明本文使用的各组件版本,以及 SpringCloud Alibaba 推荐的各版本适配。
3.2、本文使用各组件版本
部分组件对版本兼容要求其实没有那么高,比如Nacos,不一定要按照官方推荐版本,差几个小版本没有什么影响,我本地使用的一直是Nacos2.0.2,代码集成实现基本都一样。
JDK:1.8.0
Spring-Boot:2.3.12.RELEASE
Spring-Cloud:Hoxton.SR12
Spring-Cloud-Alibaba:2.2.9.RELEASE
Nacos:2.0.2
Sentinel:1.8.5
3.3、官方推荐版本
官方版本说明
3.4、部署Sentinel控制台
3.4.1、下载 sentinel-dashboard jar包
这里使用sentinel-dashboard-1.8.5
,这里提供两个下载地址,需要其它版本可以自行去github下载,如果有条件建议直接下载sentinel-dashboard
源码部署,后续需要对sentinel-dashboard
源码进行改造才能进行流控规则双向同步。。
github下载地址
百度网盘地址
3.4.2、启动 sentinel-dashboard
java -Dserver.port=8180 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar
- -Dserver.port=8180
sentine 服务控制台端口 - -Dsentinel.dashboard.auth.username=sentinel
sentine 控制台登录账号,不设置默认sentinel - -Dsentinel.dashboard.auth.password=123456
sentine 控制台登录密码,不设置默认sentinel - -Dcsp.sentinel.dashboard.server=localhost:8180
将控制台自身注册到server - -Dproject.name=sentinel-dashboard
控制台服务自己项目名称
三、项目集成 Sentinel 实现简单流控
3.1、项目中添加 Sentinel 集成包
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
3.2、简单集成(不使用Sentinel控制台配置)
3.2.1、添加流控规则
流控规则是由FlowRuleManager
类统一管理的,只要将规则编辑好加载到FlowRuleManager
类中即可,也可以使用一个接口来添加,添加前先获取已有规则然后追加,比较简单这里不过多说明。
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;@Slf4j
@Configuration
public class SentinelRuleInitConfiguration {public final static String GETUSER_KEY = "getUserInfo";@PostConstructpublic void initSentinelRule() {// 先从FlowRuleManager获取已有规则List<FlowRule> rules = FlowRuleManager.getRules();// 判断FlowRuleManager中是否存在规则,如果不存在则新建一个ArrayList用于存放rules = rules != null ? rules : new ArrayList<>();FlowRule rule1 = new FlowRule();// 设置资源名称rule1.setResource(GETUSER_KEY);// QPS控制在1以内rule1.setCount(1);// QPS限流rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);rule1.setLimitApp("default");rules.add(rule1);FlowRuleManager.loadRules(rules);log.info(">>>限流服务接口配置加载成功>>>");}
}
3.2.2、使用 3.2.1 加载的流控规则
3.2.2.1、硬编码使用流控规则
@GetMapping("/user/info-01")public String getUserInfo01(){Entry entry = null;try {// 指定 3.2.1 中的资源名称entry = SphU.entry(SentinelRuleInitConfiguration.GETUSER_KEY);// 执行我们服务需要保护的业务逻辑return "张三" + RandomUtil.randomNumbers(5);} catch (Exception e) {e.printStackTrace();return "该服务接口已经达QPS上线!";} finally {// SphU.entry(xxx) 需要与 entry.exit() 成对出现,否则会导致调用链记录异常if (entry != null) {entry.exit();}}}
在浏览器快速调用几次就能看到触发限流规则响应指定信息。
3.2.2.2、使用@SentinelResource指定流控规则
//@SentinelResource value参数:流量规则资源名称、//blockHandler 限流/熔断出现异常执行的方法//Fallback 服务的降级执行的方法@SentinelResource(value = SentinelRuleInitConfiguration.GETUSER_KEY, blockHandler = "getUserInfoQpsException")@GetMapping("/user/info-02")public String getUserInfo02(){return "张三" + RandomUtil.randomNumbers(5);}/*** 被限流后返回的提示*/public String getUserInfoQpsException(BlockException e) {e.printStackTrace();return "该接口已经被限流啦!";}
使用注解也是一样的,只是触发限流规则后会走我们指定的blockHandler
3.3、集成 Sentinel 控制台实现流控规则动态配置
3.3.1、添加Sentinel控制台连接配置
spring:application:name: kerwin-usercloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# 配置Sentinel控制台连接信息 建议通过启动参数配置transport:# 控制台ip:端口dashboard: localhost:8180# 应用注册端口 默认8719port: 18819
PS:要是通过配置文件配置无法注册到 Sentinel控制台,可以通过JVM启动参数配置试一下
-Dcsp.sentinel.dashboard.server=127.0.0.1:8180
-Dcsp.sentinel.api.port=18819
-Dproject.name=kerwin-user
- 参数说明:
-Dcsp.sentinel.dashboard.server:指定控制台地址和端口。
-Dproject.name:在sentinel控制台中展示的项目名称。
-Dcsp.sentinel.api.port:指定客户端监控 API 的端口(默认是 8719),如控制台修改规则,则会向该端口推送规则信息。
注册成功后可以看到多了一个kerwin-user
,并且之前配置的流控规则也被加载到控制台。
3.3.2、通过控制台添加新流控规则测试效果
3.3.2.1、先准备一个接口(这个接口只简单返回一个字符串)
@GetMapping("/user/info-03")public String getUserInfo03(){return "李四" + RandomUtil.randomNumbers(5);}
3.3.2.2、控制台添加流控规则
除了通过@SentinelResource
指定接口使用的资源名称,还可以将资源名设置成接口完整地址是会被自动匹配的,在spring-cloud-starter-alibaba-sentinel
包中已经做了适配。
3.3.2.3、测试流控效果
快速请求几次可以看到触发了流控,响应了Sentinel
的默认流控提示信息,这个响应信息可以做统一处理,文章末尾提供实现代码。
四、项目整合 Nacos 实现 Sentinel 规则持久化
- 因为
Sentinel
客户端是将规则数据存储在本地JVM
中,Sentinel
控制台会读取客户端的规则到控制台显示,Sentinel
控制台只做规则读取和规则配置并不会做数据的存储,规则修改之后Sentinel
会将规则PUSH
到客户端,当客户端重启以后新增规则也会消失,如果Sentinel
控制台重启客户端没有重启这个时候Sentinel
控制台又能将客户端缓存中的规则和族点链路信息读取到控制台。- 解决方法一:修改
Sentinel
客户端源码在新增和修改规则时将数据重新储存到数据库或者本地文件,当客户端宕机重启后Sentinel
控制台根据客户端唯一标识取出对应数据push到客户端。 - 解决方法二:集成
Nacos
等工具,将规则信息储存在配置中心,在客户端项目启动时去读取,也可以随时修改可以做到动态更新,但是做不到Sentinel
控制台修改规则然后同步到nacos配置中心。
- 解决方法一:修改
4.1、添加 Sentinel 集成 Nacos 包
sentinel
读取nacos
配置需要添加这个适配包。
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>
4.2、Nacos配置中心创建我们的流控规则(kerwin-user-flow-rules)
规则JSON
[{"resource": "/user/info-03","limitApp": "default","grade": 1,"count": 2,"strategy": 0,"controlBehavior": 0,"clusterMode": false}
]
- 各字段含义
- resource:这是流控规则所针对的资源名称,你要依据实际业务情况对其进行替换。
- limitApp:指定受此规则限制的调用来源,default 表示对所有调用来源都生效。
- grade:流控阈值类型,1 代表 QPS(每秒查询率),0 代表线程数。
- count:设定的流控阈值。在上述例子中,QPS 的阈值为 2,即每秒请求数量超过 2 时就会触发流控。
- strategy:流控策略,0 表示直接对当前资源进行限流。
- controlBehavior:流控效果,0 代表快速失败,也就是请求超过阈值时直接拒绝。
- clusterMode:是否为集群流控模式,false 表示使用单机流控模式。
4.3、配置文件配置加载Nacos配置中心流控规则json
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# 使用nacos来做持久化datasource:## 配置流控规则,名字任意ds-flow:nacos:## nacos的地址server-addr: 172.16.8.169:8848## 配置IDdataId: kerwin-user-flow-rulesusername: nacospassword: nacosnamespace: springcloud-component-example## 配置分组,默认是DEFAULT_GROUPgroupId: DEFAULT_GROUP## 配置存储的格式data-type: json## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现rule-type: flow
4.4、验证配置是否有效
重启应用服务查看 Sentinel
控制台 Nacos
中配置的规则是否注册上,如果成功可以看到刚刚配置的规则已经加载到流控规则中,但是之前我们通过代码配置的流控规则没了,这是因为Sentinel
加载Nacos
中配置规则在我们通过代码配置之后,通过代码配置的规则被覆盖了,不过线上环境也不推荐使用代码直接配置,还是统一使用配置中心比较合适。
五、常用规则配置JSON解析以及加载
这里会对所有服务保护规则JSON配置参数做解析,将对应规则配置到Nacos配置中心,在配置文件中指定规则加载即可。
5.1、流量控制规则(FlowRule)
5.1.1、配置流控规则JSON
- Nacos配置中心添加流控规则
kerwin-user-flow-rules
- 规则JSON
[{"resource": "youResource","limitApp": "default","grade": 1,"count": 10,"strategy": 0,"controlBehavior": 0,"clusterMode": false} ]
- 字段解释:
- resource:此为流控规则所针对的资源名称,代表了系统里某个具体的功能或者服务,像某个接口的调用。
- limitApp:指定受该规则限制的调用来源。default 意味着对所有调用来源都生效;也可以填入具体的应用名,实现对特定调用来源的限流。
- grade:流控阈值类型,具体取值如下:
- 0:代表线程数限流,即当并发线程数超过阈值时触发限流。
- 1:代表 QPS(每秒查询率)限流,即当每秒的请求数超过阈值时触发限流。
- count:流控阈值,其含义由 grade 字段决定。若 grade 为 0,它就是最大并发线程数;若 grade 为 1,它就是每秒允许的最大请求数。
- clusterMode:是否为集群流控模式。false 表示单机流控模式;true 表示集群流控模式。
- strategy:流控策略,具体取值如下:
- 0:直接对当前资源进行限流。
- 1:关联资源限流,当关联资源的 QPS 超过设置的阈值时,对当前资源进行限流。
- 2:链路限流,是指只对指定链路的请求进行限流。在复杂的系统中,一个资源可能会被多个不同的链路调用,链路流控可以针对特定的调用链路进行流量控制,而不影响其他链路对该资源的访问。。
- refResource:关联或入口资源名,当strategy 为 2或3时有效,
- controlBehavior:流控效果,具体取值如下:
- 0:快速失败,当请求超过阈值时,直接拒绝请求并抛出限流异常。
- 1:Warm Up(预热),让系统有一个预热的过程,避免瞬间流量过大。
- 2:匀速排队,请求会进入队列进行排队,按照固定的速率处理请求。
- 3:Warm Up + 匀速排队,结合了预热和匀速排队的特性。
- warmUpPeriodSec:仅在 controlBehavior 为 1(Warm Up)或者 3(Warm Up + 匀速排队)时有效,代表预热的时长,单位是秒。
- maxQueueingTimeMs:仅在 controlBehavior 为 2(匀速排队)或者 3(Warm Up + 匀速排队)时有效,代表请求在队列中的最大排队时间,单位是毫秒。若排队时间超过该值,请求将被拒绝。
- slowRatioThreshold:仅在 controlBehavior 为 2(匀速排队)或者 3(Warm Up + 匀速排队)时有效,代表慢调用比例阈值。当慢调用(处理时间超过某个阈值的请求)的比例超过该阈值时,会调整排队的速率。
5.1.2、配置文件配置加载Nacos配置中心流控规则json
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# 使用nacos来做持久化datasource:## 配置规则,名字任意ds-flow:nacos:## nacos的地址server-addr: 172.16.8.169:8848## 配置IDdataId: kerwin-user-flow-rulesusername: nacospassword: nacosnamespace: springcloud-component-example## 配置分组,默认是DEFAULT_GROUPgroupId: DEFAULT_GROUP## 配置存储的格式data-type: json## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现## flow:流控 degrade:熔断降级 param-flow:热点参数规则 system:系统保护规则 authority:授权规则rule-type: flow
5.2、熔断降级规则(DegradeRule)
5.2.1、配置熔断降级规则JSON
- Nacos配置中心添加流控规则
kerwin-user-degrade-rules
- 规则JSON
[{"resource": "youResource","count": 0.5,"timeWindow": 10,"grade": 0,"minRequestAmount": 5,"statIntervalMs": 10000,"slowRatioThreshold": 0.5,"maxAllowedRt": 200}
]
- 字段解释:
- resource:要进行熔断降级控制的资源名称,代表了系统中的某个特定功能或服务,例如某个接口的调用。
- count:熔断阈值,具体含义根据 grade 字段的值而定。
- 当 grade 为 0(错误比例策略)时,count 表示错误请求数占总请求数的比例阈值,范围是 0.0 - 1.0。例如,值为 0.5 表示错误比例达到 50% 时触发熔断。
- 当 grade 为 1(平均响应时间策略)时,count 表示平均响应时间的阈值(单位:毫秒)。例如,值为 200 表示平均响应时间超过 200 毫秒时触发熔断。
- 当 grade 为 2(异常数策略)时,count 表示异常请求数的阈值。
timeWindow:熔断的时长,单位为秒。例如,值为 10 表示熔断持续 10 秒,在这期间对该资源的请求会被直接熔断处理。
- grade:降级策略,有以下几种取值:
- 0:错误比例策略,根据错误请求数占总请求数的比例来判断是否熔断。
- 1:平均响应时间策略,根据请求的平均响应时间来判断是否熔断。
- 2:异常数策略,根据异常请求数来判断是否熔断。
- minRequestAmount:最小请求数,只有在统计周期内的请求数达到该值时,才会进行熔断判断。例如,设置为 5 表示当请求数至少为 5 时,才会根据 count 和 grade 的规则判断是否熔断。
- statIntervalMs:统计时长,单位为毫秒,用于统计错误比例、平均响应时间或异常数。例如,值为 10000 表示统计最近 10 秒内的数据。
- slowRatioThreshold:慢调用比例阈值,仅在平均响应时间策略(grade 为 1)下有效。它表示慢调用(响应时间超过 maxAllowedRt)在总请求数中的占比阈值,范围是 0.0 - 1.0。例如,值为 0.5 表示慢调用比例达到 50% 时触发熔断。
- maxAllowedRt:最大允许的响应时间,仅在平均响应时间策略(grade 为 1)下有效。当请求的响应时间超过该值时,该请求会被视为慢调用。
5.2.2、配置文件配置加载Nacos配置中心熔断降级规则json
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# 使用nacos来做持久化datasource:ds-flow:nacos:server-addr: 172.16.8.169:8848dataId: kerwin-user-flow-rulesusername: nacospassword: nacosnamespace: springcloud-component-examplegroupId: DEFAULT_GROUPdata-type: jsonrule-type: flow## 配置熔断降级规则,名字任意ds-degrade:nacos:## nacos的地址server-addr: 172.16.8.169:8848## 配置IDdataId: kerwin-user-degrade-rulesusername: nacospassword: nacosnamespace: springcloud-component-example## 配置分组,默认是DEFAULT_GROUPgroupId: DEFAULT_GROUP## 配置存储的格式data-type: json## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现## flow:流控 degrade:熔断降级 param-flow:热点参数规则 system:系统保护规则 authority:授权规则rule-type: degrade
5.3、热点参数规则(ParamFlowRule)
5.3.1、配置熔断降级规则JSON
-
Nacos配置中心添加流控规则
kerwin-user-param-flow-rules
-
规则JSON
[{"resource": "youResource","count": 5,"grade": 1,"paramIdx": 0,"durationInSec": 1,"controlBehavior": 0,"clusterMode": false,"clusterConfig": {"thresholdType": 1,"fallbackToLocalWhenFail": true},"paramFlowItemList": [{"classType": "java.lang.String","object": "paramValue","count": 10}]} ]
-
字段解释:
- resource:要进行热点参数流控的资源名称,代表系统中的某个特定功能或接口。
- count:针对普通参数值的流控阈值。当参数不是 paramFlowItemList 中指定的特殊值时,使用该阈值进行流控。
- grade:流控阈值类型,1:表示基于 QPS(每秒查询率)进行流控。
- paramIdx:参数索引,指定要对方法参数列表中哪个位置的参数进行热点流控。索引从 0 开始,例如 0 表示第一个参数。
- durationInSec:统计时长,单位为秒。Sentinel 会在这个时间段内统计参数的访问情况,以判断是否触发流控。
- controlBehavior:流控效果,取值如下:
- 0:快速失败,当请求超过阈值时直接拒绝请求。
- 1:Warm Up(预热),系统启动初期允许较低的流量,随着时间推移逐渐增加到正常阈值。
- 2:匀速排队,请求会进入队列,按照固定速率处理,避免流量突发。
- clusterMode:是否为集群流控模式。true 表示开启集群流控,false 表示使用单机流控。
- clusterConfig:集群流控的相关配置,是一个对象,包含以下字段:
- thresholdType:集群阈值类型,0 表示全局阈值,即整个集群共享一个阈值;1 表示单机均摊阈值,每个节点有自己的阈值。
- fallbackToLocalWhenFail:当集群流控失败时,是否回退到单机流控模式,true 表示回退,false 表示不回退。
- paramFlowItemList:针对特定参数值的流控规则列表,是一个数组,数组中的每个对象包含以下字段:
- classType:参数类型 int、double、java.lang.String、long、float、char、byte
- object:特定的参数值。
- count:针对该特定参数值的流控阈值,会覆盖普通参数的 count 阈值。
5.3.2、配置文件配置加载Nacos配置中心熔断降级规则json
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# 使用nacos来做持久化datasource:## 配置规则,名字任意ds-param-flow:nacos:## nacos的地址server-addr: 172.16.8.169:8848## 配置IDdataId: kerwin-user-param-flow-rulesusername: nacospassword: nacosnamespace: springcloud-component-example## 配置分组,默认是DEFAULT_GROUPgroupId: DEFAULT_GROUP## 配置存储的格式data-type: json## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现## flow:流控 degrade:熔断降级 param-flow:热点参数规则 system:系统保护规则 authority:授权规则rule-type: param-flow
5.4、系统保护规则(SystemRule)
5.4.1、配置熔断降级规则JSON
- Nacos配置中心添加流控规则
kerwin-user-system-rules
- 规则JSON
[{"highestCpuUsage": -1,"avgRt": -1,"maxThread": -1,"qps": 10,"highestSystemLoad": -1}
]
- 字段解释:
- highestCpuUsage:最大 CPU 使用率,超过该值时触发系统保护。
- avgRt:平均响应时间,超过该值时触发系统保护。
- maxThread:最大线程数,超过该值时触发系统保护。
- qps:最大 QPS,超过该值时触发系统保护。
- highestSystemLoad:最大系统负载,超过该值时触发系统保护。
5.4.2、配置文件配置加载Nacos配置中心熔断降级规则json
spring:cloud:sentinel:# 设置sentinel为热加载 默认为falseeager: true# 使用nacos来做持久化datasource:## 配置规则,名字任意ds-system:nacos:## nacos的地址server-addr: 172.16.8.169:8848## 配置IDdataId: kerwin-user-system-rulesusername: nacospassword: nacosnamespace: springcloud-component-example## 配置分组,默认是DEFAULT_GROUPgroupId: DEFAULT_GROUP## 配置存储的格式data-type: json## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现## flow:流控 degrade:熔断降级 param-flow:热点参数规则 system:系统保护规则 authority:授权规则rule-type: system
六、Sentinel 规则触发响应信息统一处理
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws Exception {String msg = "触发服务保护!";if (ex instanceof FlowException) {msg = "请求过于频繁,被限流了!";} else if (ex instanceof DegradeException) {msg = "请求过于频繁,被降级了!";} else if (ex instanceof ParamFlowException) {msg = "热点数据请求过于频繁!";} else if (ex instanceof SystemBlockException) {msg = "请求过于频繁,触发系统限制!";} else if (ex instanceof AuthorityException) {msg = "授权规则不通过!";}response.setCharacterEncoding("utf-8");response.setHeader("Content-Type", "application/json;charset=utf-8");response.setContentType("application/json;charset=utf-8");Map<String, Object> resultMap = new HashMap<>();resultMap.put("code",500);resultMap.put("msg",msg);String errJson = JSON.toJSONString(resultMap);new ObjectMapper().writeValue(response.getWriter(), errJson);}
}
触发流控规则后调用了SentinelExceptionHandler
中的handle
响应了我们自定义的异常信息。
相关文章:
SpringCloudAlibaba 服务保护 Sentinel 项目集成实践
目录 一、简介1.1、服务保护的基本概念1.1.1、服务限流/熔断1.1.2、服务降级1.1.3、服务的雪崩效应1.1.4、服务的隔离的机制 1.2、Sentinel的主要特性1.3、Sentinel整体架构1.4、Sentinel 与 Hystrix 对比 二、Sentinel控制台部署3.1、版本选择和适配3.2、本文使用各组件版本3.…...
【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置
【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数设置 文章目录 【深度学习|DenseNet-121】Densely Connected Convolutional Networks内部结构和参数…...
【问题】Qt c++ 界面 lineEdit、comboBox、tableWidget.... SIGSEGV错误
蛋疼的错误集锦----今日分错误: 在主界面或者对话框的构造函数中,准备对一些对象赋值初始化值时,报了以上错误。!!!! 一脸懵逼的,各种确认,因为是最基础的赋值想不到错在…...
Hugging Face 推出最小体积多模态模型,浏览器运行成为现实!
1. SmolVLM 模型家族简介 1.1 什么是 SmolVLM-256M 和 SmolVLM-500M,它们为何如此重要? 在人工智能的多模态模型领域,如何在有限的计算资源下实现强大性能一直是一个重要的挑战。SmolVLM-256M 和 SmolVLM-500M 是最近推出的两款视觉语言模型,它们不仅突破了传统“大模型”…...
30289_SC65XX功能机MMI开发笔记(ums9117)
建立窗口步骤: 引入图片资源 放入图片 然后跑make pprj new job8 可能会有bug,宏定义 还会有开关灯报错,看命令行注释掉 接着把ture改成false 然后命令行new一遍,编译一遍没报错后 把编译器的win文件删掉, 再跑一遍虚拟机命令行…...
提供ZYNQ,MPSOC,RFSOC生成BOOT.BIN的小工具
如图: 这里提供了三种.bif,三种批处理.bat文件,一个bootgen.exe可执行文件和这个批处理文件运行是需要的动态库文件。 我们先看一下.bat文件,以BOOT_RFSOC为例: del temp\boot.bin bootgen -image output_rfsoc.bif -arch zynqmp…...
滤波电路汇总
0、前言 1. 引言 滤波电路是电子系统中不可或缺的组成部分,其主要功能是选择性地通过或衰减特定频率范围内的信号。在现代电子技术中,滤波电路广泛应用于信号处理、通信系统、音频设备、电源设计等多个领域。通过滤波,可以去除信号中的噪声和干扰,提高信号的质量和稳定性…...
springboot 动态配置定时任务
要在Spring Boot中动态配置定时任务,可以使用ScheduledTaskRegistrar类来实现。 首先,创建一个定时任务类,该类需要实现Runnable接口。例如: Component public class MyTask implements Runnable {Overridepublic void run() {/…...
Github 2025-01-25Rust开源项目日报Top10
根据Github Trendings的统计,今日(2025-01-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目1Vue项目1JavaScript项目1Deno: 现代JavaScript和TypeScript运行时 创建周期:2118 天开发语言:Rust, JavaScript协议类型…...
【Linux网络编程】数据链路层
前言: 数据链路层非常简单,对于程序员来说,这里只需要大致了解即可,本篇文章不做重点说明。 数据链路层介绍 数据链路层是OSI位于物理层之上和网络层之下,这一层的报文叫做帧。它的主要任务是确保数据从一个节点可靠地…...
MongoDB 数据库备份和恢复全攻略
在当今数据驱动的时代,数据库的稳定运行和数据安全至关重要。MongoDB 作为一款流行的 NoSQL 数据库,以其灵活的文档模型和高扩展性备受青睐。然而,无论数据库多么强大,数据丢失的风险始终存在,因此掌握 MongoDB 的备份…...
一文了解性能优化的方法
背景 在应用上线后,用户感知较明显的,除了功能满足需求之外,再者就是程序的性能了。因此,在日常开发中,我们除了满足基本的功能之外,还应该考虑性能因素。关注并可以优化程序性能,也是体现开发能…...
百度APP iOS端磁盘优化实践(上)
01 概览 在APP的开发中,磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长,如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验,详细介绍iOS沙盒环境下的文件存储规范,探讨业务缓…...
人工智能丨基于机器学习的视觉 CV 处理技术
从自动驾驶汽车到面部识别系统,CV无处不在,赋予计算机“看”的能力。无论是图像处理、模式识别,还是视频分析,机器学习都是推动这些技术进步的核心动力。这篇文章将深入探讨基于机器学习的计算机视觉处理技术,包括它的…...
SparX实战:使用SparX实现图像分类任务(一)
摘要 SparX是一种新提出的稀疏跨层连接机制,旨在提升视觉Mamba和Transformer网络的性能。该论文由香港大学的俞益洲教授及其研究团队撰写,并将在AAAI 2025会议上发表。论文的主要目标是解决现有视觉模型在跨层特征聚合方面的不足,尤其是在计…...
vue事件总线(原理、优缺点)
目录 一、原理二、使用方法三、优缺点优点缺点 四、使用注意事项具体代码参考: 一、原理 在Vue中,事件总线(Event Bus)是一种可实现任意组件间通信的通信方式。 要实现这个功能必须满足两点要求: (1&#…...
[c语言日寄]assert函数功能详解
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
08-Elasticsearch
黑马商城作为一个电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的,存在很多问题。 首先,查询效率较低。 由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很…...
贪心算法-条约游戏II
hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! /*** 计算到达数组最后一个元素的最小跳跃次数* param {number[]} nums - 输入的整数数组* return {number} - 最小跳跃次数*/ function jump(nums) {// 数…...
Hive:内部表和外部表,内外转换
内部表和外部表 内部表示例 给表添加数据 外部表示例 给表添加数据 外部表示例 用location指定表目录位置,那么表的位置在实际指定的位置,但是可以被映射 外部表和内部表的区别 删除表后使用show tables in shao; 已经没有被删除的表,说明元数据已经被删除(mysql里面存放),但是…...
AndroidCompose Navigation导航精通1-基本页面导航与ViewPager
文章目录 前言基本页面导航库依赖导航核心部件简单NavHost实现ViewPagerPager切换逻辑图阐述Pager导航实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来…...
基于ESP8266的多功能环境监测与反馈系统开发指南
项目概述 本系统集成了物联网开发板、高精度时钟模块、环境传感器和可视化显示模块,构建了一个智能环境监测与反馈装置。通过ESP8266 NodeMCU作为核心控制器,结合DS3231实时时钟、DHT11温湿度传感器、光敏电阻和OLED显示屏,实现了环境参数的…...
十三先天记
没有一刻,只有当下在我心里。我像星星之间的空间一样空虚。他们是我看到的第一件事,我知道的第一件事。 在接下来的时间里,我意识到我是谁,我是谁。我知道星星在我上方,星球的固体金属体在我脚下。这个支持我的世界是泰…...
JVM垃圾回收器的原理和调优详解!
全文目录: 开篇语前言摘要概述垃圾回收器分类及原理1. Serial 垃圾回收器2. Parallel 垃圾回收器3. CMS 垃圾回收器4. G1 垃圾回收器 源码解析示例代码 使用案例分享案例 1:Web 服务的 GC 调优案例 2:大数据任务的 GC 优化 应用场景案例垃圾回…...
TypeScript 学习 -类型 - 5
类 属性必须初始化 在构造函数中赋值在定义时给一个默认值 子类 子类构造函数必须使用 super() 修饰符 默认是 publicprivate 只能在当前类中被调用protected 只能在当前类 或 子类中被调用readonly 一定要被初始化, 不可以修改static 静态成员 / 静态函数 构造函数 如果被定义…...
Django 项目中使用 MySQL 数据库的完整指南
在现代 Web 开发中,数据库是应用程序的核心组件之一。Django 作为一个强大的 Python Web 框架,默认支持多种数据库后端,包括 SQLite、PostgreSQL 和 MySQL。本文将详细介绍如何在 Django 项目中使用 MySQL 作为数据库,并实现多环境(开发、测试、生产)的配置管理。 ©…...
单片机基础模块学习——PCF8591芯片
一、A/D、D/A模块 A——Analog 模拟信号:连续变化的信号(很多传感器原始输出的信号都为此类信号)D——Digital 数字信号:只有高电平和低电平两种变化(单片机芯片、微控制芯片所能处理的都是数字信号) 下面…...
gradle和maven的区别以及怎么选择使用它们
目录 区别 1. 配置方式 2. 依赖管理 3. 构建性能 4. 灵活性和扩展性 5. 多项目构建 如何选择使用 选择 Maven 的场景 选择 Gradle 的场景 区别 1. 配置方式 Maven: 使用基于 XML 的 pom.xml 文件进行配置。所有的项目信息、依赖管理、构建插件等都在这个文…...
【面试】【前端】前端网络面试题总结
一、前端网络面试题总结 网络相关知识是前端开发的核心内容之一,面试中通常会考察协议、网络模型、性能优化及常见网络问题的处理。以下是针对前端网络面试题的总结: (一)协议森林(大话网络协议) 网络协议…...
Qt 5.14.2 学习记录 —— 이십일 Qt网络和音频
文章目录 1、UDP带有界面的Udp服务器(回显服务器) 2、TCP回显服务器 3、HTTP客户端4、音频 和Linux的网络一样,Qt封装了Linux的网络API,即Socket API。网络编程是在应用层写,需要传输层支持,传输层有UDP和T…...
C++小病毒-1.0勒索(更新次数:2)
内容供学习使用,不得转卖,代码复制后请1小时内删除,此代码会危害计算机安全,谨慎操作 在C20环境下,并在虚拟机里运行此代码!,病毒带来后果自负! 使用时请删除在main()里的注释,并修改位置至C:\\(看我代码注释)//可以改成WIN Main() #include <iostream> #i…...
labelimg闪退的解决办法
其实就是你的python版本太高不稳定不支持labelimg 标记时出现闪退 问题原因:python版本过高 解决方案 第一步: 在python3.9以上的版本运行软件会闪退,这个时候我们需要创建一个3.9或者及以下的虚拟环境 conda cr…...
使用脚本执行地理处理工具
确定工具箱的别名,查看当前使用的arcgis的许可级别,确保工具可访问后,即可使用脚本执行工具. 操作方法 1.在arcmap中打开目标地图 2.打开python窗口 3.创建一个变量,引用要裁剪的输入要素类 in_features "<路径>" 4.创建一个变量,引用用于裁剪的图层 cl…...
【数据分享】2014-2025年我国道路数据(免费获取/全国/分省)
道路数据是我们在各项研究中经常使用的数据!道路数据虽然很常用,但是却基本没有能下载最近年份道路数据的网站,所以很多人不知道如何获到道路数据。 本次我们给大家分享的是2014-2025年的全国范围的道路数据!数据格式为shp矢量格…...
Mybatis-plus 更新 Null 的策略踩坑记
一个bug 在一个管理页面,有一个非必填字段被设置成空了并提交更新,再次打开的时候,发现字段还在,并没有被更新成功。 使用的数据库映射框架是 Mybatis-plus ,对于Mybatis 在更新字段的时候会对空进行校验,…...
图解 script 标签中的 async 和 defer 属性
<script> 当浏览器解析到这个标签时,它会立即停止解析HTML文档,转而去加载并执行这个脚本。这意味着如果将<script>放在页面顶部,它可能会延迟整个页面的加载速度,因为浏览器必须等待脚本执行完毕才能继续解析HTML。…...
C++ Lambda 表达式的本质及原理分析
目录 1.引言 2.Lambda 的本质 3.Lambda 的捕获机制的本质 4.捕获方式的实现与底层原理 5.默认捕获的实现原理 6.捕获 this 的机制 7.捕获的限制与注意事项 8.总结 1.引言 C 中的 Lambda 表达式是一种匿名函数,最早在 C11 引入,用于简化函数对象的…...
08.OSPF 特殊区域及其他特性
OSPF 特殊区域及其他特性 一. 前言OSPF的四个特殊区域Stub末梢区域Totally Stub完全末梢区域NSSATotally NSSA完全的NSSA二.Stub 区域和 Totally Stub 区域(1)网络规模变大引发的问题(2)传输区域和末端区域(3)Stub 区域(4)Totally Stub 区域三.NSSA 区域和 Totally NSS…...
计网week1+2
计网 一.概念 1.什么是Internet 节点:主机及其运行的应用程序、路由器、交换机 边:通信链路,接入网链路主机连接到互联网的链路,光纤、网输电缆 协议:对等层的实体之间通信要遵守的标准,规定了语法、语义…...
日志收集Day008
1.zk集群优化 修改zookeeper的堆内存大小,一般情况下,生产环境给到2G足以,如果规模较大可以适当调大到4G。 (1)配置ZK的堆内存 vim /app/softwares/zk/conf/java.env export JAVA_HOME/sortwares/jdk1.8.0_291 export JVMFLAGS"-Xms2…...
使用PC版本剪映制作照片MV
目录 制作MV模板时长调整拖动边缘缩短法分割删除法变速法整体调整法 制作MV 导入音乐 导入歌词 点击歌词 和片头可以修改字体: 还可以给字幕添加动画效果: 导入照片,自动创建照片轨: 修改片头字幕:增加两条字幕轨&…...
性能测试全链路监控模式有哪些?
目录 性能测试全链路监控的模式有哪些呢? 1. 调用链追踪(Trace) 2. 分布式追踪与日志聚合 3. 实时性能指标采集 4. 资源利用率监控 5. 自动化测试与回滚机制 6. 用户体验质量(QoE)评估 性能测试中的全链路监控模…...
【吉林乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移内容测评
标题中的“吉林省乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移”揭示了这是一个地理信息系统(GIS)相关的数据集,主要用于描绘吉林省的乡镇边界。这个数据集包含了一系列的文件,它们是ArcGIS软件能够识别和处理的Shape…...
SpringAI 搭建智能体(二):搭建客服系统智能体
在现代人工智能应用中,智能体(Agent) 是一个重要的概念,它的核心能力是自主性与灵活性。一个智能体不仅能够理解用户的需求,还能拆解任务、调用工具完成具体操作,并在复杂场景中高效运行。在本篇博客中&…...
JAVA设计模式:依赖倒转原则(DIP)在Spring框架中的实践体现
文章目录 一、DIP原则深度解析1.1 核心定义1.2 现实比喻 二、Spring中的DIP实现机制2.1 传统实现 vs Spring实现对比 三、Spring中DIP的完整示例3.1 领域模型定义3.2 具体实现3.3 高层业务类3.4 配置类 四、Spring实现DIP的关键技术4.1 依赖注入方式对比4.2 自动装配注解 五、D…...
LeetCode题练习与总结:N 叉树的前序遍历--589
一、题目描述 给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。 示例 1: 输入:root [1,null,3,2,4,nu…...
WebSocket 详解:全双工通信的实现与应用
目录 一、什么是 WebSocket?(简介) 二、为什么需要 WebSocket? 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket…...
【漫话机器学习系列】064.梯度下降小口诀(Gradient Descent rule of thume)
梯度下降小口诀 为了帮助记忆梯度下降的核心原理和关键注意事项,可以用以下简单口诀来总结: 1. 基本原理 损失递减,梯度为引:目标是让损失函数减少,依靠梯度指引方向。负梯度,反向最短:沿着负…...
Vue 3 中的 TypeScript:接口、自定义类型与泛型
在 Vue 3 中,TypeScript 提供了强大的类型系统,帮助我们更好地管理代码的类型安全。通过使用 接口(Interface)、自定义类型(Type Aliases) 和 泛型(Generics),我们可以编…...
[SaaS] 内容创意生产平台
1.即梦 2.讯飞绘镜 typemovie 3.Krea.ai 4.Pika 5.runway 6.pixVerse 7....