Appearance
Sentinel 学习指南
导航目录
- 一、Sentinel 概述
- 二、为什么需要 Sentinel
- 三、Sentinel 核心概念
- 四、Sentinel 环境搭建与控制台
- 五、服务限流
- 六、熔断与降级
- 七、热点参数限流与系统规则
- 八、与 OpenFeign、Gateway、Nacos 整合
- 九、常见面试题与故障排查
- 十、最佳实践
一、Sentinel 概述
1.1 什么是 Sentinel
Sentinel 是阿里开源的流量治理组件,主要用于保障微服务的稳定性。
它重点解决这些问题:
- 接口流量过大
- 某个下游服务响应过慢
- 异常比例过高
- 热点参数被频繁访问
- 系统负载过高
重点:Sentinel 的核心目标不是“提高性能”,而是“保护系统稳定性”。
1.2 Sentinel 能做什么
- 流量控制
- 熔断降级
- 热点参数限流
- 系统自适应保护
- 授权规则控制
1.3 Sentinel 和 Hystrix 的区别
| 对比项 | Sentinel | Hystrix |
|---|---|---|
| 主要能力 | 流控 + 熔断 + 热点规则 | 熔断降级 |
| 控制台 | 支持 | 一般 |
| 动态规则 | 支持 | 一般 |
| 生态整合 | Spring Cloud Alibaba 更强 | 已逐渐淡出 |
1.4 Sentinel 在微服务中的位置
text
客户端 -> Gateway -> order-service -> user-service / pay-service
↑
SentinelSentinel 可以保护:
- 网关入口流量
- 服务提供者接口
- OpenFeign 远程调用
二、为什么需要 Sentinel
2.1 没有保护机制会怎样
在高并发场景下,如果不做保护,常见后果有:
- 某个接口被打爆
- 下游服务超时拖垮上游
- 线程堆积,整体雪崩
- 热点接口占满资源
2.2 什么是服务雪崩
例如:
order-service调用user-serviceuser-service响应越来越慢order-service大量线程被阻塞- 上游服务也逐步不可用
这就是典型的雪崩效应。
2.3 Sentinel 的核心价值
- 保护自己
- 快速失败
- 避免故障扩散
- 提升系统可用性
三、Sentinel 核心概念
3.1 资源
Sentinel 保护的对象叫“资源”,可以是:
- Controller 接口
- Service 方法
- OpenFeign 调用
- 网关路由
3.2 规则
规则决定如何保护资源。
常见规则:
- 流控规则
- 降级规则
- 热点规则
- 系统规则
- 授权规则
3.3 Sentinel 规则总览
| 规则类型 | 主要作用 | 常见使用场景 |
|---|---|---|
| 流控规则 | 控制访问速率 | 防止接口被打爆 |
| 降级规则 | 熔断和降级 | 下游超时、异常率过高 |
| 热点规则 | 限制热点参数 | 秒杀商品、热门资源 |
| 系统规则 | 从系统维度保护 | CPU、Load、线程数过高 |
| 授权规则 | 控制来源访问 | 黑白名单、来源隔离 |
3.4 流控
限制资源访问速率,避免流量过大。
3.5 降级
当资源慢调用比例、异常比例或异常数过高时,触发熔断降级。
3.6 blockHandler 和 fallback
二者容易混淆:
blockHandler:Sentinel 规则触发时执行fallback:业务方法本身抛异常时执行
重点:blockHandler 和 fallback 是 Sentinel 的高频面试点。
3.7 @SentinelResource
@SentinelResource 可以把方法声明成一个可被 Sentinel 管理的资源。
四、Sentinel 环境搭建与控制台
4.1 引入依赖
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<!-- Sentinel 核心依赖 -->
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>4.2 应用配置
yaml
spring:
application:
# 当前服务名
name: order-service
cloud:
sentinel:
transport:
# Sentinel 控制台地址
dashboard: 127.0.0.1:8080
# 应用启动时提前初始化 Sentinel 连接
eager: true4.3 启动 Sentinel 控制台
bash
# 启动 Sentinel 控制台,默认端口 8080
java -jar sentinel-dashboard-1.8.8.jar4.4 控制台使用步骤
- 启动 Sentinel 控制台
- 启动接入 Sentinel 的微服务
- 访问服务接口,触发资源上报
- 在控制台配置流控、熔断、热点等规则
4.5 控制台常用功能
- 查看实时簇点链路
- 配置流控规则
- 配置降级规则
- 配置热点规则
- 查看机器列表
五、服务限流
5.1 什么是限流
限流就是限制单位时间内允许通过的请求数量。
目的:
- 保护系统
- 防止流量突增打垮服务
5.2 流控阈值类型
Sentinel 流控规则里常见两种阈值类型:
5.2.1 QPS 模式
- 按每秒请求数限制流量
- 更适合 Web 接口场景
5.2.2 线程数模式
- 按并发线程数限制流量
- 更适合方法调用或资源执行耗时较长的场景
5.3 Controller 接口限流示例
java
@RestController
@RequestMapping("/sentinel")
public class SentinelController {
@GetMapping("/test")
@SentinelResource(value = "testResource", blockHandler = "blockHandler")
public String test() {
return "success";
}
// 当触发限流规则时,执行该方法
public String blockHandler(BlockException ex) {
return "当前请求被限流";
}
}5.4 自定义限流兜底类
如果不想把兜底方法写在当前类中,也可以抽到单独类里。
java
public class SentinelBlockHandler {
public static String handleTest(BlockException ex) {
return "请求过于频繁,请稍后再试";
}
}java
@RestController
@RequestMapping("/sentinel")
public class SentinelController {
@GetMapping("/test2")
@SentinelResource(
value = "testResource2",
blockHandlerClass = SentinelBlockHandler.class,
blockHandler = "handleTest"
)
public String test2() {
return "success";
}
}5.5 流控模式
5.5.1 直接模式
- 直接限制当前资源
5.5.2 关联模式
- 关联另一个资源,当关联资源压力过大时限制当前资源
5.5.3 链路模式
- 针对特定调用链路做限流
5.6 流控模式举例
5.6.1 直接模式举例
例如接口 /order/create 的 QPS 最大只能 10。
5.6.2 关联模式举例
例如当 /pay/submit 压力过大时,限制 /order/create,避免核心支付链路被拖慢。
5.6.3 链路模式举例
例如同一个 queryUser() 方法同时被 A 接口和 B 接口调用,只限制来自 A 接口的链路流量。
5.7 流控效果
常见效果:
- 快速失败
- Warm Up
- 匀速排队
5.7.1 快速失败
- 默认模式
- 超过阈值立即拒绝请求
5.7.2 Warm Up
- 冷启动预热
- 系统刚启动时不会立刻放开全部流量
5.7.3 匀速排队
- 请求以匀速通过
- 适合削峰填谷场景
5.8 流控模式总表
| 维度 | 模式 |
|---|---|
| 阈值类型 | QPS、线程数 |
| 流控模式 | 直接、关联、链路 |
| 流控效果 | 快速失败、Warm Up、匀速排队 |
5.9 限流学习重点
- QPS 限流
- 线程数限流
- 直接 / 关联 / 链路模式
- 快速失败 / Warm Up / 匀速排队
六、熔断与降级
6.1 为什么需要熔断降级
当下游服务异常或响应变慢时,如果继续大量请求,只会让系统更糟。
熔断降级的目标是:
- 快速失败
- 返回兜底结果
- 给系统恢复时间
6.2 Sentinel 支持的降级策略
6.2.1 慢调用比例
- 当接口响应时间持续过长时触发熔断
6.2.2 异常比例
- 当异常比例过高时触发熔断
6.2.3 异常数
- 当异常总数超过阈值时触发熔断
6.3 降级策略说明
6.3.1 慢调用比例模式
- 当请求 RT 超过设定阈值
- 且慢调用比例达到设定值
- 触发熔断
6.3.2 异常比例模式
- 当单位时间内异常比例过高
- 触发熔断
6.3.3 异常数模式
- 当单位时间内异常总数达到阈值
- 触发熔断
6.4 熔断状态说明
Sentinel 熔断过程可以理解为:
- 关闭状态:正常通过
- 打开状态:触发熔断,快速失败
- 半开状态:探测恢复情况
重点:熔断不是永久拒绝,而是给系统恢复的时间窗口。
6.5 fallback 示例
java
@RestController
@RequestMapping("/degrade")
public class DegradeController {
@GetMapping("/test/{id}")
@SentinelResource(
value = "degradeTest",
blockHandler = "blockHandler",
fallback = "fallbackHandler"
)
public String test(@PathVariable Long id) {
if (id < 0) {
throw new IllegalArgumentException("id 不能小于 0");
}
return "query success, id = " + id;
}
// Sentinel 规则触发时走这里
public String blockHandler(Long id, BlockException ex) {
return "当前请求被限流或熔断";
}
// 业务异常时走这里
public String fallbackHandler(Long id, Throwable ex) {
return "业务异常,执行 fallback";
}
}6.6 fallbackClass 示例
java
public class SentinelFallbackHandler {
public static String handleFallback(Long id, Throwable ex) {
return "统一 fallback 处理,id = " + id;
}
}java
@RestController
@RequestMapping("/degrade")
public class DegradeController {
@GetMapping("/test2/{id}")
@SentinelResource(
value = "degradeTest2",
fallbackClass = SentinelFallbackHandler.class,
fallback = "handleFallback"
)
public String test2(@PathVariable Long id) {
if (id < 0) {
throw new IllegalArgumentException("参数非法");
}
return "success";
}
}6.7 降级模式总表
| 模式 | 触发条件 | 适合场景 |
|---|---|---|
| 慢调用比例 | RT 高且比例超阈值 | 下游响应慢 |
| 异常比例 | 异常请求占比过高 | 稳定性差 |
| 异常数 | 异常次数超过阈值 | 短时间故障集中爆发 |
6.8 熔断降级学习重点
- 慢调用比例
- 异常比例
- 异常数
- blockHandler 和 fallback
- 兜底方法抽离
七、热点参数限流与系统规则
7.1 什么是热点参数限流
某些参数值会特别热门,例如:
- 商品详情页中的某个热门商品 ID
- 秒杀接口中的某个活动 ID
如果这些参数被大量访问,就可能压垮系统。
7.2 热点参数示例
java
@RestController
@RequestMapping("/hot")
public class HotParamController {
@GetMapping("/test")
@SentinelResource(value = "hotTest", blockHandler = "hotBlockHandler")
public String test(@RequestParam(required = false) String type,
@RequestParam(required = false) String id) {
return "hot param success";
}
public String hotBlockHandler(String type, String id, BlockException ex) {
return "热点参数限流";
}
}7.3 热点参数高级用法
热点参数规则还支持对“某个具体参数值”做单独限制。
例如:
- 普通
id参数 QPS 上限是 10 - 但
id=1001的 QPS 上限单独设置为 2
这非常适合:
- 秒杀商品
- 热门活动
- 热门用户
7.4 系统规则
Sentinel 还支持系统级保护:
- Load 自适应
- CPU 使用率
- 平均 RT
- 入口 QPS
- 并发线程数
7.4.1 Load 模式
- 当系统 Load1 超过阈值时触发保护
7.4.2 CPU 使用率模式
- 当 CPU 使用率过高时触发保护
7.4.3 平均 RT 模式
- 当整体平均响应时间过高时触发保护
7.4.4 入口 QPS 模式
- 当系统整体入口流量过高时触发保护
7.4.5 并发线程数模式
- 当系统并发线程数过高时触发保护
7.5 授权规则
授权规则可以做来源控制,例如:
- 黑名单
- 白名单
7.5.1 白名单模式
- 只允许指定来源访问
7.5.2 黑名单模式
- 拒绝指定来源访问
7.6 来源解析器示例
授权规则通常需要配合来源解析器使用。
java
@Component
public class RequestOriginParserDefinition implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
// 从请求头中解析调用来源,例如 gateway、app、admin
String origin = request.getHeader("origin-app");
return origin == null ? "blank" : origin;
}
}7.7 热点、系统、授权模式总表
| 规则类型 | 模式 |
|---|---|
| 热点参数规则 | 普通参数限流、特定参数值限流 |
| 系统规则 | Load、CPU、平均 RT、入口 QPS、并发线程数 |
| 授权规则 | 白名单、黑名单 |
7.8 热点与系统规则学习重点
- 热点参数限流
- 系统自适应保护
- 授权规则
八、与 OpenFeign、Gateway、Nacos 整合
8.1 OpenFeign + Sentinel
在 Spring Cloud Alibaba 中,OpenFeign 常和 Sentinel 结合使用,实现远程调用保护。
8.1.1 开启配置
yaml
feign:
sentinel:
# 开启 Feign 与 Sentinel 联动
enabled: true8.1.2 Feign 接口示例
java
@FeignClient(name = "user-service", fallbackFactory = UserFeignFallbackFactory.class)
public interface UserFeignClient {
@GetMapping("/user/{id}")
Result<UserDTO> getUserById(@PathVariable("id") Long id);
}8.1.3 FallbackFactory 示例
java
@Component
public class UserFeignFallbackFactory implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable cause) {
return id -> {
// 这里可以记录原始异常 cause
return Result.fail(500, "user-service 不可用,触发降级");
};
}
}重点:在 Feign 场景下,更推荐 FallbackFactory,因为可以拿到原始异常。
8.2 Gateway + Sentinel
Sentinel 也可以保护网关入口流量。
常见场景:
- 对
/api/order/**做限流 - 对登录接口做特殊规则
- 对敏感接口做黑白名单控制
8.2.1 网关流控模式
Gateway 场景下常见两种维度:
- route 维度:按路由 ID 控制
- API 分组维度:按一组接口规则控制
8.2.2 API 分组说明
可以把多个接口归为一个组,例如:
/api/order/**/api/order/query/**/api/order/create/**
统一归到 order-api-group 下做限流。
8.3 Nacos + Sentinel 动态规则
生产环境一般不会把规则只写在控制台里,更推荐持久化到 Nacos。
8.3.1 配置示例
yaml
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
# Nacos 地址
server-addr: 127.0.0.1:8848
# Nacos 中的 Data ID
dataId: order-service-flow-rules
# 规则所在分组
groupId: SENTINEL_GROUP
# 规则类型
rule-type: flowrule-type 常见值包括:
flow:流控规则degrade:降级规则param-flow:热点参数规则system:系统规则authority:授权规则
8.3.2 Nacos 规则 JSON 示例
json
[
{
"resource": "testResource",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0
}
]8.3.3 降级规则 JSON 示例
json
[
{
"resource": "degradeTest",
"grade": 0,
"count": 1000,
"timeWindow": 5,
"slowRatioThreshold": 0.5,
"minRequestAmount": 5,
"statIntervalMs": 1000
}
]8.3.4 热点参数规则 JSON 示例
json
[
{
"resource": "hotTest",
"grade": 1,
"count": 5,
"paramIdx": 0
}
]8.4 联动学习重点
- Feign + Sentinel
- Gateway + Sentinel
- Nacos 持久化规则
- 动态规则推送
九、常见面试题与故障排查
9.1 Sentinel 的核心作用是什么
- 限流
- 熔断
- 降级
- 热点保护
- 系统保护
9.2 blockHandler 和 fallback 有什么区别
blockHandler:规则触发时执行fallback:业务异常时执行
9.3 为什么需要熔断
- 防止下游故障扩散
- 防止线程被长时间占用
- 给系统恢复时间
9.4 Sentinel 控制台看不到服务怎么办
重点排查:
- 是否引入了 Sentinel 依赖
- 控制台地址是否正确
- 服务是否访问过受保护资源
- 控制台和服务之间网络是否打通
9.5 Feign 降级不生效怎么办
- 是否开启了
feign.sentinel.enabled=true fallback/fallbackFactory是否被 Spring 管理- Feign 客户端是否配置正确
9.6 热点规则不生效怎么办
- 检查方法参数是否和规则配置一致
- 检查资源名是否正确
- 检查是否真的命中了热点参数
9.7 高频面试重点
- Sentinel 和 Hystrix 的区别
- 限流、熔断、降级的区别
- blockHandler 和 fallback 的区别
- 热点参数限流
- Feign + Sentinel 如何配合
- 流控模式和流控效果有哪些
- 降级策略有哪些
- 授权规则和系统规则有哪些模式
十、最佳实践
10.1 规则设计建议
- 核心接口必须有限流规则
- 核心依赖必须有熔断降级
- 热点接口要单独配置热点参数规则
10.2 代码设计建议
blockHandler和fallback分工明确- 兜底逻辑尽量统一抽离
- 不要把业务主逻辑写进兜底方法
10.3 生产建议
- Sentinel 规则持久化到 Nacos
- 控制台仅作为查看和调试入口
- 对关键接口配置监控报警
- 配合 Gateway、Feign、Nacos 一起使用
10.4 总结
Sentinel 是 Spring Cloud Alibaba 体系里非常关键的稳定性组件。
- 入门阶段要掌握流控规则和控制台使用
- 进阶阶段要掌握熔断降级、热点参数和系统规则
- 高阶阶段要掌握 Feign、Gateway、Nacos 的联动与生产实践
真正把这些能力用起来,微服务系统才算具备了基础的稳定性保障。