Sentinel使用指南:从配置到生产实践
Sentinel常规用法详解:从基础配置到生产实践
一、依赖引入与基础配置
1.1 基础依赖引入
在Maven项目中引入Sentinel核心依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>
实践建议:
- 生产环境建议同时引入
sentinel-transport-simple-http
用于与Dashboard通信 - 版本选择应保持与Spring Cloud Alibaba版本兼容
1.2 资源定义方式
Sentinel提供两种资源定义方式:
代码块方式:
try (Entry entry = SphU.entry("queryOrder")) {
// 被保护的业务逻辑
return orderService.queryById(orderId);
} catch (BlockException e) {
// 流控降级处理
return fallbackMethod(orderId);
}
注解方式(需额外引入sentinel-annotation-aspectj
):
@SentinelResource(value = "queryOrder",
blockHandler = "blockHandlerMethod",
fallback = "fallbackMethod")
public Order queryOrder(String orderId) {
// 业务逻辑
}
对比选择:
方式 | 优点 | 缺点 |
---|---|---|
代码块 | 细粒度控制 | 侵入性强 |
注解 | 低侵入 | 灵活性较低 |
二、规则配置详解
2.1 流控规则配置
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule()
.setResource("queryOrder")
.setGrade(RuleConstant.FLOW_GRADE_QPS) // QPS模式
.setCount(100) // 阈值100 QPS
.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP) // 预热模式
.setWarmUpPeriodSec(10); // 预热时间10秒
rules.add(rule);
FlowRuleManager.loadRules(rules);
流控效果对比:
2.2 熔断规则配置
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule()
.setResource("queryOrder")
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
.setCount(0.5) // 异常比例阈值50%
.setTimeWindow(10); // 熔断时间10秒
rules.add(rule);
DegradeRuleManager.loadRules(rules);
熔断策略对比:
- 慢调用比例(SLOW_REQUEST_RATIO)
- 异常比例(EXCEPTION_RATIO)
- 异常数(EXCEPTION_COUNT)
三、生产级实践
3.1 规则持久化方案
推荐通过Nacos实现动态规则配置:
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(
nacosServerAddr, groupId, dataId,
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {})
);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
配置中心对比:
- Nacos:适合Spring Cloud体系
- ZooKeeper:适合Dubbo体系
- Apollo:配置变更管理强大
3.2 最佳配置实践
阈值设定:
- 单机QPS = 系统总容量 / 节点数 * 安全系数(0.7)
- 通过压测确定基准值
- 熔断恢复:
监控集成:
对接Prometheus:
SentinelCollectorRegistry registry = new SentinelCollectorRegistry(); CollectorRegistry.defaultRegistry.register(registry);
四、常见问题排查
规则不生效检查清单:
- 确认资源名称完全匹配(大小写敏感)
- 检查规则是否成功加载到RuleManager
- 确认未触发StatisticSlot的样本数不足保护(默认1000)
性能优化建议:
- 减少不必要的资源埋点
对高频资源启用异步统计:
@SentinelResource(value = "highFreqResource", entryType = EntryType.OUT)
热点参数特殊处理:
Entry entry = null; try { entry = SphU.entry(resourceName, EntryType.IN, 1, paramA); // 业务逻辑 } finally { if (entry != null) { entry.exit(1, paramA); } }
通过以上实践,可以充分发挥Sentinel在生产环境中的流量防护能力。建议结合Sentinel Dashboard实时监控系统状态,并根据业务特点动态调整防护策略。
评论已关闭