完整教程:【微服务】[限流Sentinel][笔记2]----Sentinel控制台规则详细讲解
文章目录
第一章:【入门】
1、介绍
英文官网 https://github.com/alibaba/Sentinel
中文官网 https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
Sentinel是什么?
(熔断、降级、限流)Spring Cloud Sentinel 是分布式系统的流量控制组件,可实现流量控制、熔断降级、系统负载保护等,保障服务稳定性。
去哪下? https://github.com/alibaba/Sentinel/releases
与hystrix对比
| 特性描述 | Hystrix | Sentinel |
|---|---|---|
| 监控平台 | 需要程序员自己手工搭建监控平台 | 独立组件,独立运行 |
| 配置方式 | 没有一套web界面进行细粒度配置 (流控、速率控制、服务熔断、服务降级等) | 直接界面化的细粒度统一配置 |
| 配置编码 | 只能在代码里编写规则 | 配置可以写在代码里面 也可以配置在控制台 |
2、安装Sentinel控制台
(略过,参考安装笔记)
第二章:【流控规则】
- 资源名:唯一名称,默认请求路径
- 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
- 阈值类型/单机阈值:
- QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
- 线程数:当调用该api的线程数达到阈值的时候,进行限流
- 是否集群:不需要集群
- 流控模式:
- 直接:api达到限流条件时,直接限流
- 关联:当关联的资源达到阈值时,就限流自己
- 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
流控效果:
- 快速失败:直接失败,抛异常
- Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
- 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
1、[流控模式]—直接、关联、链路
【关联例子】
当B接口达到阈值,A接口限流。例如:支付接口B到阈值快顶不住了,限制下单A接口。
可自行测试。大批量线程高并发访问B,导致A失效了!!
【图片】
【链路例子】
根据上游来源的路径做限制。
【图片】
2、[流控效果]—快速失败、预热、排队
【图片】
快速失败(默认的流控处理)
直接失败,抛出异常 Blocked by Sentinel (flow limiting)
Warmup预热
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值
限流 冷启动
【图片】
单机赋值10,预热5秒=====意思是低流量时候,突然来大流量,此时5秒内只能让10/3=3 个成功,5秒后才能达到10个。
应用场景
秒杀场景,一开抢,可能会系统崩溃,先预热。
排队等待
匀速排队,阈值必须设置为QPS,超过了会让队列里,挨个迅速通过,等待超过时间就返回错误
【图片】
第三章:【熔断降级规则】
熔断是什么?类似于电路中的保险丝,到达阈值会跳闸一段时间,然后再恢复
熔断策略有【慢调用比例】【异常比例】【异常数】配置
1、[慢调用比例]
【图片】
以上配置的说明:
在每 1 秒的统计周期内,如果响应时间超过 200 毫秒的请求占比达到 50% 且请求数量不少于 5 个,则触发熔断,熔断时长为 10 秒。
这样可以有效防止该资源因慢调用导致系统性能下降或崩溃。
2、[异常比例]
【图片】
以上配置的说明:
统计一秒内的请求,数量大于5且异常比例超过50% ,则触发熔断,该资源在接下来的 10 秒内不再接受请求。
1、[异常数]
【图片】
以上配置的说明:
统计一秒内的请求,请求数量大于10且异常数超过3个 ,则触发熔断,该资源在接下来的 10 秒内不再接受请求。
第四章:【热key限流】
可以针对对接口的参数进行设置,如发送短信,key为手机号,一分钟内只能发送一次,防止恶意多发。
@GetMapping("/sendSms")
@SentinelResource(value = "sentinelSendSms",blockHandler = "sendSmsHandler")
public String testHotKey(@RequestParam(value = "phone",required = false) String phone,
@RequestParam(value = "name",required = false) String name) {
//int age = 10/0;
return "------testHotKey";
}
//兜底方法
public String sendSmsHandler (String phone, String name, BlockException exception){
return "------deal_testHotKey,o(╥﹏╥)o";
}
配置如下:
根据参数手机号(下标为0),限制60秒内只能请求一次,多的执行兜底。
【图片】
第五章:【系统规则】
系统规则:系统级别的,比如系统到达配置的qps 20万, 触发默认堵塞处理器。
【图片】
| 选项名称 | 含义说明 | 单位 | 计算过程与值的含义 |
|---|---|---|---|
| 系统负载(load) | 当系统负载超过设定阈值, 且系统当前并发线程数超过系统容量时, 触发保护机制 | - | 阈值通常设置为 CPU 核心数的 1~3 倍(如 4 核 CPU 可设为 8), 需结合系统实际负载能力调整 |
| RT(响应时间) | 当接口平均响应时间超过阈值,触发降级保护 | 毫秒 | 统计单位时间内接口的平均响应时间,超过阈值则触发规则 (如设置 100ms,即平均 RT>100ms 触发) |
| 线程数 | 当接口并发线程数超过阈值,触发保护 | 个 | 统计接口当前正在处理的线程数量,超过设定值则限制新请求 (如设置 20,即并发线程 > 20 时触发) |
| 入口 QPS | 限制系统的总入口 QPS,防止流量过大压垮系统 | QPS | 统计单位时间内进入系统的总请求数,超过设定值则限流 (如设置 1000,即每秒请求 > 1000 时触发) |
| CPU 使用率 | 当系统 CPU 使用率超过阈值,触发保护机制 | % | 基于操作系统的 CPU 使用率统计,超过设定百分比则触发 (如设置 80,即 CPU 使用率 > 80% 时触发) |
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.system.SystemBlockException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class CustomSentinelBlockHandler
implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
// 区分异常类型(系统规则触发的是SystemBlockException)
String msg;
int code = 500;
if (e instanceof SystemBlockException) {
msg = "系统资源紧张,请稍后再试(触发系统规则保护)";
code = 10001;
// 自定义业务错误码
} else {
msg = "请求被限流,请稍后再试";
code = 10002;
}
// 返回JSON格式响应
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("{\"code\":" + code + ",\"msg\":\"" + msg + "\",\"data\":null}");
}
}
第六章:【持久化】
一旦我们重启应用,Sentinel规则将消失,生产环境需要将配置规则进行持久化
实现:服务配置并连接到nacos做持久化,配置规则到json里。(引入相关nacos依赖)
<!-- Sentinel 集成 Nacos 数据源的关键依赖(必须添加) -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!-- 版本需与Sentinel核心依赖版本一致,如1.8.6 -->
</dependency>
配置:略过其他配置只显示要添加的配置。
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel 控制台 地址
port: 8719
datasource: #持久化配置
ds1:
nacos:
server-addr: localhost:8848
dataId: cloudalibaba-sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
添加Nacos业务规则配置(配置列表–新建配置)
【图片】
添加内容
[
{
"resource": "/retaLimit/byUrl",// 资源名称
"limitApp": "default",// 来源应用
"grade": 1,// 阈值类型,0表示线程数,1表示QPS;
"count": 1,// 单机阈值;
"strategy": 0,// 流控模式,0表示直接,1表示关联,2表示链路;
"controlBehavior": 0,// 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
"clusterMode": false // 是否集群
}
]
resource: 资源名称;
limitApp: 来源应用;
grade: 阈值类型,0表示线程数,1表示QPS;
count: 单机阈值;
strategy: 流控模式,0表示直接,1表示关联,2表示链路;
controlBehavior: 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode: 是否集群。
重启服务,就会出现(持久化的)
【图片】
如果文章对你有一点点帮助,欢迎【点赞、留言、+ 关注】,
您的关注是我持续创作的重要动力!有问题欢迎随时交流!多一个朋友多一条路!

浙公网安备 33010602011771号