Sentinel(哨兵)是阿里巴巴开源的轻量级分布式系统流量防护组件,定位为分布式系统的流量防卫兵,核心解决微服务架构下的流量失控、依赖故障扩散、系统过载等问题,保障服务高可用。
一、核心定位
(1)定位:流量控制、熔断降级、系统保护、热点防护、访问控制。
(2)多语言:Java(主)、Go、Rust、C++,支持云原生(Envoy WASM/eBPF)。
(3)生态:无缝集成 Spring Cloud Alibaba、Dubbo、gRPC、WebFlux 等。
二、Sentinel核心概念
(1)资源(Resource)
① 被 Sentinel 保护的对象:接口、方法、代码块、服务调用、数据库访问等。
② 用 @SentinelResource 或 API 包裹后成为可防护资源。
(2)规则(Rule)
① 定义资源的防护策略:流控、熔断、降级、热点、系统、授权。
② 支持动态配置(控制台/API/配置中心),无需重启应用。
三、可视化界面控制台------Dashboard
1、管理服务
① 可视化监控:实时查看资源调用、流控/熔断记录
② 规则管理:动态配置流控、熔断、热点等规则
③ 集群管理:支持集群限流与规则推送
④ 接入:启动 Dashboard 后,客户端配置控制台地址即可
2、 SpringCloud集成Sentinel
(1)依赖 引入
<!-- Sentinel 核心 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>sentinel-spring-webmvc-adapter</artifactId>
<version>1.8.8</version>
</dependency>
<!-- 控制台客户端 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.8</version>
</dependency>
(2)application.yml 配置(连接 Dashboard)
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080 # 控制台地址
port: 8719 # 本机和控制台通信端口
web-context-unify: false # 按 URL 细粒度限流
3、Sentinel Dashboard搭建
下载 jar 包后运行
java -jar sentinel-dashboard-1.8.8.jar
访问:账号/密码: sentinel / sentinel
四、核心功能
1. 流量控制(Flow Control)
① 目标:削峰填谷,防止流量峰值打垮服务
② 指标:QPS、线程数、并发数
③ 策略:快速失败、排队等待、预热启动、匀速器
④ 场景:秒杀限流、API 网关入口限流、服务间调用限流
⑤ 具体实例:
例如有如下业务接口:
@GetMapping("/api/product/list")
public String productList() {
return "商品列表";
}
dashboard配置(流控规则):
资源名: /api/product/list
阈值类型:QPS
单机阈值:10(每秒最多10次)
流控模式:直接
流控效果:快速失败
超过直接报错: Blocked by Sentinel (flow limiting)
2. 熔断降级(Circuit Breaking)
① 目标:故障隔离,防止下游故障引发雪崩
② 触发条件: 异常比例/异常数和慢调用比例(响应超时)
③ 状态机:CLOSED(正常)→ OPEN(熔断拒绝)→ HALF-OPEN(半开试探)→ CLOSED
④ 场景:下游服务超时/宕机、第三方接口不稳定
⑤ 具体实例:
代码示例:
@GetMapping("/api/order/get")
@SentinelResource(
value = "getOrder",
fallback = "orderFallback" // 熔断后走降级方法
)
public String getOrder(Long orderId) {
if (orderId == 999) {
throw new RuntimeException("异常");
}
return "订单详情:" + orderId;
}
// 降级兜底
public String orderFallback(Long orderId, Throwable e) {
return "订单服务繁忙,请稍后再试:" + e.getMessage();
}
面板配置(熔断规则)
- 资源名: getOrder
- 熔断策略:异常比例
- 比例:0.5(50%异常就熔断)
- 熔断时长:10秒
- 最小请求数:5
3. 热点参数限流(Hot Parameter)
① 目标:针对高频参数单独限流,避免热点数据打垮系统
② 示例:商品ID=1001 被高频访问,单独限制该 ID 的 QPS
③ 场景:商品详情、用户中心、热点新闻
代码示例:
@GetMapping("/api/product/detail")
@SentinelResource(value = "productDetail")
public String productDetail(@RequestParam("skuId") Long skuId) {
return "SKU详情:" + skuId;
}
面板配置(热点规则):
资源名: productDetail
参数索引:0(对应第一个参数 skuId)
单机阈值:5
统计窗口:1s
效果:同一个 skuId 每秒最多5次访问。
4. 系统自适应保护(System Protection)
① 目标:从系统全局维度防过载,而非单一接口
② 指标:CPU 使用率、系统负载、入口 QPS、内存
③ 策略:系统负载高时自动限流,优先保障核心服务
面板配置(系统规则):
CPU 使用率:0.7(CPU ≥70% 自动限流)
最大QPS:1000
负载保护(Linux):根据系统 load 限流
防止服务器被打满、OOM。
5. 来源访问控制(Authority)
① 目标:按调用来源黑白名单控制访问
② 场景:内部服务/第三方调用权限控制、防恶意请求
例如有如下网关传来源:
// 定义来源解析器
@Component
public class MyRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
// 从请求头获取来源 appA / appB / gateway
return request.getHeader("source");
}
}
面板配置(授权规则)
资源名: /api/*
流控应用: appA
类型:黑名单 / 白名单
五、典型应用场景
① 微服务 API 网关入口限流
② 服务间调用熔断降级
③ 电商秒杀/大促流量控制
④ 数据库/缓存访问保护
⑤ 第三方接口调用防护
⑥ 热点数据(商品/用户)限流