一、简介
Sentinel 是阿里巴巴开源、面向分布式微服务的流量治理组件 ,以流量 为切入点,实现限流、熔断降级、系统保护,保障服务稳定性,承接阿里多年双 11 大促流量防护场景。 GitHub:https://github.com/alibaba/Sentinel 官网:https://sentinelguard.io/
定位:不止熔断,是一套完整流量防护体系;Spring Cloud Alibaba 标配组件,替代已停止维护的 Hystrix。
二、五大核心能力
1. 流量控制(FlowRule)
限制资源访问速率,防止突发流量打垮服务。
阈值类型:QPS(每秒请求数)、并发线程数
流控策略:直接限流、关联限流、链路限流
流控效果(流量整形)
直接拒绝(默认):超过阈值立即拒绝
Warm Up 预热:冷启动缓慢抬升阈值,保护刚启动服务
匀速排队(漏桶):固定速率放行,削峰填谷,适合秒杀
2. 熔断降级(DegradeRule)
下游服务不稳定时,快速失败,防止服务雪崩。支持3 种熔断策略:
慢调用比例:超过最大 RT 的请求占比超标(下游接口变慢)
异常比例:异常请求占比超标
异常数:单位窗口异常总数超标(低流量场景)
熔断状态:Closed → Open → Half-Open
Open:直接拒绝;时间窗结束进入半开,探测一次请求;成功则恢复,失败继续熔断。
3. 热点参数限流(HotParamRule)
细粒度限流:针对请求参数值限流 例:限制商品 ID=1001 每秒最多访问 5 次,不影响其他商品;防 "热点商品、单个用户刷接口"。
4. 系统自适应保护(SystemRule)
从整机维度防护,根据 CPU 负载、平均 RT、入口 QPS、线程数自适应限流,防止服务器整体被打挂。
5. 权限控制(AuthorityRule)
黑白名单:根据调用方 origin 来源,允许 / 拒绝访问资源。
三、核心概念
-
资源 Resource 被保护对象:接口、方法、代码块(
@SentinelResource、SphU API 定义) -
规则 Rule 流控 / 降级 / 热点 / 系统 / 权限规则,支持动态推送
-
Slot Chain(责任链) Sentinel 底层核心流水线:请求依次经过统计、限流、熔断等插槽
-
滑动窗口 指标统计底层实现,默认 1s 窗口,记录 QPS、异常数、RT,用于实时判断是否触发规则
四、@SentinelResource 常用注解
@SentinelResource(
value = "resourceName", // 资源名(必须)
blockHandler = "handleBlock", // 限流/熔断触发(BlockException)
fallback = "handleFallback" // 业务异常兜底
)
blockHandler:限流、熔断、权限拒绝触发
fallback:业务代码抛出异常兜底(不包含限流异常)
五、Sentinel Dashboard 控制台
可视化面板,能力:
实时秒级监控、簇点链路查看调用树
在线编辑各类防护规则,动态推送到应用
⚠️ 默认内存规则 :应用重启规则丢失;生产必须对接持久化数据源:Nacos / Apollo / ZooKeeper / Redis
六、Sentinel vs Hystrix(高频面试)
|-------|----------------------------|--------------------|
| 对比项 | Sentinel | Hystrix |
| 维护状态 | 持续活跃维护 | Netflix 官方停止维护 |
| 隔离方式 | 信号量隔离(并发线程数限流) | 线程池隔离 + 信号量 |
| 核心能力 | 限流 + 熔断 + 热点 + 系统保护 + 流量整形 | 仅熔断降级,限流能力弱 |
| 熔断策略 | 慢调用比例 / 异常比例 / 异常数 3 种 | 仅失败比例 |
| 流量整形 | 预热、匀速排队 | 不支持 |
| 控制台 | 功能完备,实时监控 + 动态规则 | 简陋 |
| 规则持久化 | 原生支持 Nacos 等 | 需自行实现 |
核心结论:新项目微服务优先 Sentinel。
七、简单 SpringBoot 接入示例
1. 依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2. 配置
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080 #控制台地址
port: 8719 #客户端通信端口
spring: cloud: sentinel: transport: dashboard: 127.0.0.1:8080 #控制台地址 port: 8719 #客户端通信端口
3. 代码
@RestController
public class DemoController {
@GetMapping("/hello")
@SentinelResource(value = "helloResource", blockHandler = "blockHandler")
public String hello(){
return "ok";
}
//限流/熔断兜底
public String blockHandler(BlockException e){
return "访问过于频繁,请稍后重试";
}
}
八、生产常见问题
规则重启丢失:必须接入 Nacos 持久化
Feign 调用不生效:开启
feign.sentinel.enabled=true全局异常处理器吞异常 → Sentinel 无法统计业务异常
区分
blockHandler和fallback使用场景集群限流:单机限流无法应对多实例,开启集群流控