【SpringCloud】【笔记】[熔断降级Sentinel]-----Spring Boot 3 整合 Sentinel 从入门到精通到实战、应用场景;一篇文章搞定
·
三、入门:整合 Spring Boot 3 + Sentinel + MyBatis-Plus + Lombok
1. 环境准备
- JDK 17+(Spring Boot 3 最低要求)
- Maven 3.8+
- Sentinel 控制台
2. 搭建步骤
步骤 1:启动 Sentinel 控制台(同上)
步骤 2:创建 Spring Boot 3 项目,引入依赖
核心依赖,其他环境依赖略过。
pom.xml 核心依赖:
<dependencies>
<!-- Sentinel 核心依赖 + Spring Cloud 适配 不需要指定版本,根据父类cloud 兼容继承即可 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
</dependencies>
步骤 3:配置 application.yml
添加一下配置配置,其他配置略过…
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # 连接 Sentinel 控制台
port: 8719 # 客户端与控制台通信端口(默认 8719,冲突时自动递增)
步骤 4:编写基础代码(Entity + Mapper + Service + Controller)
以“用户查询”为例,整合 MyBatis-Plus 和 Lombok:
实体类 User、Mapper 接口、Service 层、正常编写。此处略过。
Controller 层(添加 Sentinel 注解)
用 @SentinelResource 标记需要保护的接口,指定“限流/熔断后的降级方法”:
package com.example.sentineldemo.controller;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.example.sentineldemo.entity.User;
import com.example.sentineldemo.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor // Lombok 注解:自动注入构造器(替代 @Autowired)
public class UserController {
private final UserService userService;
// @SentinelResource:Sentinel 保护标记,value 为资源名,blockHandler 为限流降级方法
@SentinelResource(value = "sentinelGetUserById", blockHandler = "getUserByIdBlockHandler")
@GetMapping("/getUserById/{id}")
public String getUserById(@PathVariable Long id) {
User user = userService.getUserById(id);
return user != null ? user.toString() : "用户不存在";
}
// 限流/熔断后的降级方法:参数、返回值需与原方法一致,且多一个 BlockException 参数
public String getUserByIdBlockHandler(Long id, Throwable e) {
return "操作过于频繁,请稍后!";
}
}
步骤 5:启动项目并测试限流
- 启动 Spring Boot 项目,访问
http://localhost:8081/user/1(先触发一次接口调用,Sentinel 控制台才会注册服务)。 - 进入 Sentinel 控制台(
http://localhost:8080),在“簇点链路”中找到getUserById资源,点击“流控”按钮,配置规则:- 阈值类型:QPS
- 单机阈值:2(每秒最多允许 2 次请求)
- 快速刷新
http://localhost:8081/user/1,当 QPS 超过 2 时,会返回降级信息“当前请求人数过多,请稍后再试”,限流生效。

四、精通:Sentinel 核心规则与高级用法
1. 4 大核心规则配置(控制台 + 代码)
(1)流量控制规则(限流)
- 配置场景:限制接口 QPS/线程数,防止流量过载。
- 控制台配置:簇点链路 → 流控 → 选择阈值类型(QPS/线程数)+ 阈值。
- 代码配置(硬编码,不推荐,推荐动态配置):
// 在项目启动时初始化限流规则
@Configuration
public class SentinelRuleConfig {
@PostConstruct
public void initFlowRule() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("getUserById"); // 资源名(与 @SentinelResource 的 value 一致)
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 阈值类型:QPS
rule.setCount(2); // QPS 阈值 2
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
}
(2)熔断降级规则
- 配置场景:服务调用超时/错误率过高时,自动熔断,避免故障扩散。
- 控制台配置:簇点链路 → 降级 → 选择策略(慢调用比例/错误比例/错误数)。
- 例:慢调用比例 → 最大RT(500ms)→ 比例阈值(0.5)→ 熔断时长(5s):当 50% 的请求响应时间超过 500ms,熔断 5 秒。
(3)热点参数限流
- 配置场景:对接口中高频参数值限流(如“查询商品接口”中,某热门商品 ID 被频繁访问)。
- 控制台配置:热点规则 → 新增 → 选择资源(getUserById)→ 设置参数索引(0 表示第一个参数 id)→ 阈值(如 QPS=5)。
(4)系统自适应保护
- 配置场景:监控服务 CPU、内存,当系统负载过高时主动限流。
- 控制台配置:系统规则 → 新增 → 选择阈值类型(CPU 使用率/负载/内存)→ 阈值(如 CPU 使用率 80%)。
2. 规则持久化(解决重启丢失问题)
Sentinel 默认规则保存在内存,服务重启后丢失,生产环境需持久化到 Nacos/Apollo。以 Nacos 为例:
- 引入 Nacos 依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
- 配置 Nacos 数据源(application.yml):
spring:
cloud:
sentinel:
datasource:
ds1: # 数据源名称(自定义)
nacos:
server-addr: localhost:8848 # Nacos 地址
data-id: sentinel-flow-rules # Nacos 中规则配置的 dataId
group-id: DEFAULT_GROUP # 分组
rule-type: flow # 规则类型(flow:限流,degrade:熔断)
- 在 Nacos 控制台新建
sentinel-flow-rules配置,内容为 JSON 格式的限流规则:
[
{
"resource": "getUserById",
"grade": 1, // 1=QPS,0=线程数
"count": 2,
"clusterMode": false
}
]
重启服务后,规则会从 Nacos 加载,修改 Nacos 配置可实时更新规则。
五、原理:Sentinel 核心设计思想
1. 核心概念:资源与规则
- 资源:Sentinel 保护的对象,如接口方法(
@SentinelResource标记)、服务调用、甚至一段代码块。 - 规则:对资源的管控策略(限流、熔断等),规则触发时执行预设逻辑(降级、阻塞)。
2. 工作流程(3 步)
- 资源定义:通过
@SentinelResource或代码手动标记资源(如SphU.entry("resourceName"))。 - 规则检查:Sentinel 对进入资源的请求,实时检查是否命中规则(限流、熔断等)。
- 执行逻辑:
- 未命中规则:正常执行资源逻辑。
- 命中规则:执行降级方法(
blockHandler)或直接抛出异常。
3. 底层实现:滑动窗口计数器(限流核心)
Sentinel 用“滑动窗口”统计 QPS,相比传统“固定窗口”(如 1 秒一个窗口),能更精准避免“窗口边界”的流量突刺问题:
- 例:1 秒划分为 10 个小窗口(每个 100ms),统计最近 1 秒内的小窗口请求数总和,超过阈值则限流。
六、实战:生产环境典型应用场景
1. 接口限流(最常用)
- 场景:对外暴露的 API 接口(如用户登录、商品查询),防止恶意请求或突发流量击垮服务。
- 配置:QPS 阈值根据服务性能设定(如单机 QPS=100),结合集群限流(分布式场景下统一控制集群总 QPS)。
2. 服务熔断降级(微服务调用)
- 场景:A 服务调用 B 服务(如订单服务调用支付服务),当 B 服务超时/错误率高时,A 服务熔断调用,返回默认结果(如“支付服务繁忙,稍后重试”)。
- 配置:熔断策略设为“错误比例”(如错误率>50% 熔断 10 秒),避免 B 服务故障拖垮 A 服务。
3. 热点商品保护(电商场景)
- 场景:电商秒杀中,某热门商品 ID 被高频访问,单独对该商品 ID 限流,不影响其他商品查询。
- 配置:热点参数限流 → 参数索引 0(商品 ID)→ 对值为“1001”的商品设置 QPS=100,其他商品 QPS=500。
4. 系统保护(兜底措施)
- 场景:当服务 CPU 使用率超过 85% 或内存不足时,主动限流所有非核心接口(如推荐、广告接口),保障核心接口(如下单、支付)可用。
- 配置:系统规则 → CPU 使用率阈值=85%,触发后对非核心资源限流。
七、总结
Sentinel 是微服务流量治理的“瑞士军刀”,相比 Resilience4j、Hystrix,其动态规则、可视化控制台、生态适配性更适合生产环境;整合 Spring Boot 3 + MyBatis-Plus + Lombok 后,能快速实现接口防护与业务开发的结合。核心是掌握“资源定义-规则配置-降级逻辑”三步用法,结合生产场景选择限流、熔断或热点保护策略,最终保障服务高可用。
更多推荐


所有评论(0)