Sentinel规则详解

发布于:2025-03-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、流量控制规则(Flow Rule)

1.1 核心作用

通过控制请求流量保护系统,防止突发流量导致系统崩溃

1.2 关键参数

参数 说明
resource 资源名称(@SentinelResource定义的值)
grade 阈值类型:QPS(1)或并发线程数(0)
count 触发阈值
strategy 流控策略:直接(0)、关联(1)、链路(2)
controlBehavior 控制效果:快速失败(0)、Warm Up(1)、排队等待(2)

1.3 配置示例

// 通过控制台配置或代码注入
FlowRule rule = new FlowRule();
rule.setResource("orderQuery");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10);  // 每秒最大10次请求
rule.setStrategy(RuleConstant.STRATEGY_DIRECT);
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
FlowRuleManager.loadRules(Collections.singletonList(rule));

1.4 典型场景

  • 秒杀系统:限制商品详情页QPS为1000
  • API网关:对高危接口进行并发线程数控制
  • 核心服务:当关联资源(如支付服务)达到阈值时,限制当前资源访问

二、熔断降级规则(Degrade Rule)

2.1 熔断策略

策略类型 触发条件 适用场景
慢调用比例 响应时间 > RT阈值 且 比例超过阈值 数据库慢查询、外部API调用
异常比例 异常次数比例超过阈值 第三方服务不稳定
异常数 异常数量超过阈值 关键服务异常监控

2.2 熔断状态机

触发熔断条件
熔断时间结束
测试请求成功
测试请求失败
Closed
Open
Half-Open

2.3 配置示例

DegradeRule rule = new DegradeRule();
rule.setResource("paymentService");
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); // 异常比例模式
rule.setCount(0.5);   // 异常比例阈值50%
rule.setTimeWindow(10); // 熔断时长10秒
rule.setMinRequestAmount(5); // 最小请求数
rule.setStatIntervalMs(60*1000); // 统计窗口60秒
DegradeRuleManager.loadRules(Collections.singletonList(rule));

2.4 典型场景

  • 服务雪崩防护:当订单服务异常比例超过60%时熔断
  • 数据库保护:SQL查询平均RT超过500ms且比例超40%时熔断
  • 重试风暴防御:支付接口连续5次异常立即熔断

三、热点参数规则(ParamFlow Rule)

3.1 核心能力

针对方法参数值进行细粒度流量控制

3.2 参数说明

参数 说明
paramIdx 参数索引(从0开始)
paramFlowItemList 特殊值限流配置
durationInSec 统计窗口时间(秒)

3.3 配置示例

ParamFlowRule rule = new ParamFlowRule("searchProduct")
    .setParamIdx(0)  // 控制第一个参数
    .setCount(5);    // 全局QPS阈值

// 对特定参数值单独设置
ParamFlowItem item = new ParamFlowItem().setObject("iPhone15")
    .setClassType(String.class.getName())
    .setCount(1);  // iPhone15的QPS限制为1
rule.setParamFlowItemList(Collections.singletonList(item));

ParamFlowRuleManager.loadRules(Collections.singletonList(rule));

3.4 典型场景

  • 热点商品限流:限制爆款商品ID的查询频率
  • 用户分级控制:对VIP用户ID放宽限制
  • 防爬虫机制:针对特定设备ID进行访问频率控制

四、规则组合应用策略

4.1 电商系统防护案例

graph TD
    A[商品详情页] -->|流控规则| B(QPS≤1000)
    A -->|熔断规则| C(异常比例>40%熔断10秒)
    A -->|热点规则| D(商品ID=1001时QPS≤10)

4.2 配置建议

  1. 分层防护:网关层做全局流控,服务层做细粒度控制
  2. 动态调整:结合监控数据实时调整阈值
  3. 白名单机制:对内部系统IP不做限制

五、最佳实践验证方法

  1. 流量控制验证

    # 使用wrk压测工具
    wrk -t4 -c100 -d30s --latency http://api/product/101
    
  2. 熔断触发验证

    // 单元测试中模拟异常
    when(productService.getDetail(any())).thenThrow(new RuntimeException());
    
  3. 热点规则验证

    // 使用不同参数值连续调用
    IntStream.range(0,10).forEach(i->{
        productService.search("hotItem", ...);
    });
    

六、常见配置误区

  1. 流控与熔断混淆

    • 流控:预防系统过载
    • 熔断:故障发生后的快速恢复
  2. 热点参数索引错误

    // 方法签名:search(String keyword, int type)
    setParamIdx(1) // 对应type参数
    
  3. 统计窗口设置不当

    • 过短:容易误触发
    • 过长:响应延迟

通过合理配置这三类规则,可以构建起完整的系统防护体系。建议在开发环境中使用Sentinel的实时监控功能观察规则生效情况,生产环境建议配合Nacos实现规则持久化。


网站公告

今日签到

点亮在社区的每一天
去签到