Sentinel
Sentinel 以 Resource 为保护对象,通过实时统计和规则判断提供流量控制、并发限制、熔断降级、热点参数限流、系统自适应保护与授权控制。
保护目标
| 问题 | 机制 | 作用 |
|---|---|---|
| 突发流量超过容量 | QPS 限流、Warm Up、匀速排队 | 控制进入资源的速率 |
| 慢调用占满工作线程 | 并发线程数控制 | 限制同时执行的调用数量 |
| 下游持续失败或变慢 | 熔断器 | 在 Open 窗口快速失败,Half-Open 探测恢复 |
| 热点参数集中访问 | Param Flow | 对指定参数值单独限流 |
| 机器整体负载过高 | System Rule | 根据 Load、CPU、入口 QPS 等实施保护 |
限流、隔离、熔断和降级不是同一概念。限流控制进入速度,并发隔离限制占用量,熔断根据下游健康状态暂时切断调用,Fallback 定义失败后的业务返回。
Slot Chain
Slot 分别构建调用上下文、聚合指标并执行规则。实际 Slot 顺序和扩展点以所用 Sentinel 版本为准。
接入
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>yaml
spring:
cloud:
sentinel:
transport:
dashboard: ${SENTINEL_DASHBOARD:127.0.0.1:8858}
eager: trueDashboard 用于查看指标和编辑规则,不在应用请求链路上。Dashboard 不可用不应导致已加载规则失效,但无法继续观察和修改规则;生产还需要认证、访问控制和高可用方案。
Resource 与异常处理
java
@SentinelResource(
value = "OrderService.create",
blockHandler = "handleBlocked",
fallback = "handleFailure"
)
public Order create(CreateOrderCommand command) {
return orderRepository.create(command);
}blockHandler处理 Sentinel 规则触发的BlockException。fallback处理业务执行抛出的异常,具体排除项由配置决定。- Handler 的参数和返回类型必须符合注解约定。
- Fallback 不应伪造成功结果;订单、支付等场景应返回明确失败、降级数据或异步受理状态。
流量控制
| 维度 | 选择 |
|---|---|
| 阈值类型 | QPS 或并发线程数 |
| 调用关系 | 当前资源、关联资源、入口链路、调用来源 |
| 控制效果 | 快速失败、Warm Up、匀速排队 |
匀速排队用于削平突发,不等于提供持久消息队列;等待队列受进程内存、超时和实例生命周期限制。线程数规则是轻量并发限制,也不等于把业务切换到独立线程池。
熔断降级
Sentinel 1.8+ 的常见熔断策略包括慢调用比例、异常比例和异常数。
熔断规则需要最小请求数、统计窗口和熔断时长共同约束。低流量接口若只设置异常比例,可能因少量失败频繁熔断。
OpenFeign
yaml
spring:
cloud:
openfeign:
sentinel:
enabled: true不同版本的属性前缀曾发生变化,应以目标版本配置元数据为准。FallbackFactory 适合保留原始异常,但必须区分超时、熔断、限流和业务错误。
规则持久化
| 模式 | 数据流 | 适用性 |
|---|---|---|
| 原始模式 | Dashboard 直接推送客户端内存 | 仅用于测试,重启丢失 |
| Pull | 客户端定期从文件或存储拉取 | 简单但更新延迟和一致性有限 |
| Push | 配置中心为事实源,客户端监听变化 | 生产常用,需要改造 Dashboard 或治理平台 |
生产 Push 模式应当是“控制台/治理平台 → Nacos 等配置中心 → Sentinel Client”,而不是 Dashboard 只写客户端后再期待客户端反向持久化。
xml
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>规则需要版本、审计、灰度和回滚。应监控规则版本、加载错误、Blocked QPS、通过 QPS、线程数和熔断状态。
使用边界
- System Rule 是实例级最后防线,不替代容量规划和自动扩缩容。
- 授权规则基于调用来源标识,不应替代网关认证和零信任身份。
- 限流阈值来自容量测试与 SLO,不应只凭线上峰值设置。
- 服务端重试会放大流量,必须与超时、熔断和 Retry Budget 联合设计。
- Sentinel 保护应用进程;网关、消息队列、数据库和外部依赖仍需各自的保护机制。