一、核心概念
1. 资源(Resource)
- 定义:Sentinel 中的核心保护对象,可以是接口、方法、代码块等。例如:
/order/query
接口、/user/{id}
方法。 - 来源:
- 自动监控:Sentinel 默认监控 Spring MVC 的每个端点(Controller 方法)。
- 手动定义:通过
@SentinelResource
注解或Entry
API 定义资源。
2. 规则(Rule)
- 类型:
- QPS 限流:按每秒请求数(Queries Per Second)限制流量。
- 线程数限流:限制同时处理请求的线程数。
- 关联限流:当关联资源触发阈值时,对当前资源限流。
- 链路限流:针对特定调用链路的入口进行限流。
- 热点参数限流:对某些参数值进行独立限流(如商品 ID)。
- 流控模式:
- 直接模式:统计当前资源的请求,触发阈值时直接限流(默认模式)。
- 关联模式:统计关联资源的请求,触发阈值时限流当前资源。
- 链路模式:统计从指定链路访问到本资源的请求,触发阈值时限流指定链路。
二、操作步骤(详细版)
1. 集成 Sentinel
(1)添加依赖
在 Spring Boot 项目中,添加以下 Maven 依赖:
<!-- Sentinel 核心依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>
<!-- Sentinel 与 Spring Cloud 集成 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Sentinel 控制台依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.6</version>
</dependency>
(2)配置 Sentinel 控制台
在 application.yml
中配置 Sentinel 控制台地址:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
(3)启动 Sentinel 控制台
下载并运行 Sentinel 控制台:
java -jar sentinel-dashboard-1.8.6.jar
访问 http://localhost:8080
,默认账号密码为 sentinel/sentinel
。
2. 配置流控规则
(1)通过控制台添加规则
- 登录 Sentinel 控制台,进入 流控规则 页面。
- 点击“新建”,填写以下信息:
- 资源名:需要限流的资源(如
/order/query
)。 - 针对来源:默认为
default
(不限流特定来源)。 - 阈值类型:选择 QPS 或 线程数。
- 单机阈值:设置阈值(如 QPS=5)。
- 流控模式:选择直接、关联或链路。
- 流控效果:选择快速失败、Warm Up 或排队等待。
- 资源名:需要限流的资源(如
- 保存规则,实时生效。
(2)通过代码动态配置
使用 FlowRuleManager
动态添加规则:
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("order/query"); // 资源名
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS 限流
rule.setCount(5); // 阈值
rule.setLimitApp("default"); // 针对来源
rules.add(rule);
FlowRuleManager.loadRules(rules);
3. 测试限流规则
(1)使用 JMeter 压测
- 在 JMeter 中创建 HTTP 请求,设置目标接口(如
/order/query
)。 - 设置线程组:20 个线程,持续时间 2 秒(QPS=10)。
- 运行测试,观察 Sentinel 控制台的实时监控数据,验证限流是否生效。
(2)手动测试
在浏览器中快速刷新接口(如 /order/query
),触发限流后会返回错误信息:
Blocked by Sentinel (flow limiting)
三、常见错误及解决方案
1. 限流规则未生效
- 原因:
- 资源名不匹配(如未正确配置
@SentinelResource
)。 - 阈值设置过低或过高。
- Sentinel 控制台未正确连接。
- 资源名不匹配(如未正确配置
- 解决方案:
- 检查资源名是否与接口路径一致。
- 通过日志查看
Sentinel
的规则加载情况。 - 确保应用与 Sentinel 控制台网络连通。
2. 关联模式未生效
- 原因:
- 关联资源未正确配置。
- 未触发关联资源的阈值。
- 解决方案:
- 确保关联资源的请求量达到阈值。
- 在控制台检查关联资源的监控数据。
3. 链路模式未生效
- 原因:
- 调用链路未正确标记。
- 未使用
@SentinelResource
注解定义资源。
- 解决方案:
- 确保调用链路中的每个方法都标记为资源。
- 使用
@SentinelResource
注解明确资源名。
四、注意事项
合理划分资源粒度:
- 过粗:无法精准控制(如对整个服务限流)。
- 过细:增加内存开销(如每个方法独立限流)。
- 建议:按业务逻辑划分资源(如
/order/create
和/order/query
)。
动态调整规则:
- 通过 Sentinel 控制台动态修改规则,无需重启服务。
- 避免频繁修改规则导致性能抖动。
监控与告警:
- 在 Sentinel 控制台中实时监控 QPS、线程数等指标。
- 配置告警规则,及时发现异常流量。
流控效果选择:
- 快速失败:适用于对系统处理能力已知的场景(如压测后确定阈值)。
- Warm Up:适用于突发流量场景,避免冷启动崩溃。
- 排队等待:适用于均匀流量场景(如漏桶算法)。
五、使用技巧
使用注解简化配置:
@RestController public class OrderController { @GetMapping("/order/query") @SentinelResource(value = "order/query", blockHandler = "handleBlock") public String queryOrder() { return "Order details"; } public String handleBlock(BlockException ex) { return "Blocked by Sentinel"; } }
热点参数限流:
- 对特定参数值(如商品 ID)进行独立限流:
@GetMapping("/product/{id}") @SentinelResource(value = "product/{id}", blockHandler = "handleBlock") public String getProduct(@PathVariable String id) { return "Product " + id; }
- 对特定参数值(如商品 ID)进行独立限流:
自定义异常处理:
- 通过
blockHandler
和fallback
方法处理限流和降级逻辑。
- 通过
链路模式的调用链分析:
- 使用
@SentinelResource
注解标记链路中的每个方法,确保调用链路清晰。
- 使用
六、最佳实践
1. 高并发接口的限流
- 场景:秒杀活动、促销页面。
- 策略:
- 设置 QPS 限流(如 1000 QPS)。
- 使用 Warm Up 模式,避免冷启动崩溃。
- 对热点参数(如商品 ID)单独限流。
2. 关联资源限流
- 场景:支付接口和查询接口竞争数据库资源。
- 策略:
- 当支付接口(
/order/pay
)的 QPS 超过阈值时,对查询接口(/order/query
)限流。 - 配置关联规则,确保优先处理支付请求。
- 当支付接口(
3. 链路模式的调用链保护
- 场景:不同业务入口调用同一服务(如
/api/v1/user
和/api/v2/user
)。 - 策略:
- 对
/api/v1/user
的入口限流,避免影响/api/v2/user
的调用。
- 对
七、性能优化
资源粒度优化:
- 避免过度划分资源,减少内存开销。
- 合并相似资源(如
/user/{id}
可统一限流)。
规则优化:
- 简化规则数量,避免冗余配置。
- 使用动态规则(如 Nacos 数据源)管理规则。
线程池配置:
- 调整 Sentinel 内部线程池大小,适应高并发场景。
- 避免线程池阻塞影响业务逻辑。
缓存与异步处理:
- 对高频请求使用缓存,减少后端压力。
- 异步处理非关键路径请求,提高响应速度。
监控与调优:
- 定期分析 Sentinel 监控数据,优化阈值设置。
- 使用压测工具(如 JMeter)验证限流效果。
八、总结
Sentinel 的流量控制规则是保障微服务稳定性的重要工具。通过合理划分资源、配置流控模式和阈值,结合动态规则管理与性能优化,可以有效应对高并发场景,防止系统崩溃。实际应用中,建议结合业务场景选择合适的流控策略,并通过监控与测试持续优化规则。