完整教程:【微服务】[限流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: 是否集群。

重启服务,就会出现(持久化的)

【图片】

如果文章对你有一点点帮助,欢迎【点赞、留言、+ 关注】
您的关注是我持续创作的重要动力!有问题欢迎随时交流!多一个朋友多一条路!

posted @ 2025-09-01 11:34  wzzkaifa  阅读(35)  评论(0)    收藏  举报