Sentinel熔断降级规则管理详解

DegradeRuleManagerSentinel 中用于管理 熔断降级规则(DegradeRule) 的核心类 。它负责:

  • 加载、更新和验证熔断规则;
  • 为每个资源创建对应的 熔断器(CircuitBreaker) 实例;
  • 支持动态规则变更(通过 SentinelProperty);
  • 提供规则查询接口。

一、整体目标

根据配置的熔断规则(如慢调用比例、异常比例等),自动触发熔断,防止系统雪崩。

Sentinel 的熔断机制支持三种策略:

  1. 响应时间(RT)过长 → 慢调用比例熔断;
  2. 异常比例过高
  3. 异常数过多(单位时间内)。

DegradeRuleManager 就是这些规则的"管家"。


二、关键组件关系

组件 作用
DegradeRule 熔断规则实体(包含资源名、阈值、时间窗口等)
CircuitBreaker 熔断器接口,具体实现有: - ResponseTimeCircuitBreaker(RT 熔断) - ExceptionCircuitBreaker(异常熔断)
RuleManager<T> 通用规则管理器,按 resource 分组存储规则或熔断器
RulePropertyListener 监听规则变更事件,重建熔断器

三、核心字段解析

java 复制代码
// 存储每个 resource 对应的 CircuitBreaker 列表
private static volatile RuleManager<CircuitBreaker> circuitBreakers = 
    new RuleManager<>(DegradeRuleManager::generateCbs, cb -> cb.getRule().isRegex());

// 存储原始 DegradeRule(用于查询)
private static volatile RuleManager<DegradeRule> ruleMap = new RuleManager<>();
  • circuitBreakers:运行时真正使用的熔断器实例;
  • ruleMap:保存原始规则,用于 getRules() 等 API 返回;
  • RuleManager 支持正则资源匹配(通过第二个参数 lambda 判断是否 regex)。

四、规则加载流程(重点!)

当调用 loadRules(List<DegradeRule>) 或通过 SentinelProperty 动态更新规则时,会触发 RulePropertyListener.configUpdate()

步骤 1:buildCircuitBreakers(list)

遍历所有 DegradeRule

  1. 校验规则合法性isValidRule):

    • 资源名非空;
    • 阈值、时间窗口、最小请求数等参数合法;
    • 对于 RT 熔断:slowRatioThreshold ∈ [0,1]
    • 对于异常比例:count ∈ [0,1](因为是比例);
  2. 设置默认 limitApp (通常为 "default");

  3. 复用或创建 CircuitBreaker

    java 复制代码
    CircuitBreaker cb = getExistingSameCbOrNew(rule);
    • 如果已有相同规则的熔断器 → 复用(避免重复创建);
    • 否则 → 调用 newCircuitBreakerFrom(rule) 创建新实例。

步骤 2:构建 cbMap(resource → List)

步骤 3:更新两个 RuleManager

java 复制代码
circuitBreakers.updateRules(cbMap);  // 运行时使用
ruleMap.updateRules(rules);          // 用于查询

五、熔断器创建逻辑

java 复制代码
private static CircuitBreaker newCircuitBreakerFrom(DegradeRule rule) {
    switch (rule.getGrade()) {
        case DEGRADE_GRADE_RT:
            return new ResponseTimeCircuitBreaker(rule);
        case DEGRADE_GRADE_EXCEPTION_RATIO:
        case DEGRADE_GRADE_EXCEPTION_COUNT:
            return new ExceptionCircuitBreaker(rule);
        default:
            return null;
    }
}
  • RT 熔断ResponseTimeCircuitBreaker
    • 基于 慢调用比例(比如 50% 请求 RT > 1s)触发熔断;
  • 异常相关ExceptionCircuitBreaker
    • 支持 异常比例异常次数 两种模式。

💡 注意:虽然 ExceptionCircuitBreaker 处理两种 grade,但内部会根据 rule.getGrade() 区分逻辑。


六、规则合法性校验(isValidRule

java 复制代码
public static boolean isValidRule(DegradeRule rule) {
    // 基础校验
    boolean baseValid = rule != null && !StringUtil.isBlank(rule.getResource())
        && rule.getCount() >= 0 && rule.getTimeWindow() > 0
        && rule.getMinRequestAmount() > 0 && rule.getStatIntervalMs() > 0;

    if (!baseValid) return false;

    // 正则资源名校验
    if (!RuleManager.checkRegexResourceField(rule)) return false;

    // 按策略细化校验
    switch (rule.getGrade()) {
        case DEGRADE_GRADE_RT:
            return rule.getSlowRatioThreshold() >= 0 && <= 1;
        case DEGRADE_GRADE_EXCEPTION_RATIO:
            return rule.getCount() <= 1; // 比例不能超过 100%
        case DEGRADE_GRADE_EXCEPTION_COUNT:
            return true; // 异常数无上限(但 count >= 0 已校验)
        default:
            return false;
    }
}

设计严谨:不同策略有不同的参数约束。


七、对外提供的 API

方法 用途
loadRules(List<DegradeRule>) 全量替换规则(常用)
setRulesForResource(String, Set<DegradeRule>) 仅更新某个 resource 的规则
getRules() 获取所有规则(只读!)
getRulesOfResource(String) 获取某 resource 的规则集合
getCircuitBreakers(String) 获取某 resource 的熔断器列表(运行时使用)

⚠️ 注释强调:不要直接修改 getRules() 返回的列表,行为未定义!


八、动态规则支持

通过 register2Property(SentinelProperty<List<DegradeRule>>) 可接入动态配置中心(如 Nacos、Apollo):

java 复制代码
// 示例:从 Nacos 推送规则
SentinelProperty<List<DegradeRule>> property = new NacosDataSource<>(...);
DegradeRuleManager.register2Property(property);
  • 当配置中心规则变更 → 触发 configUpdate → 重建熔断器;
  • 实现 无需重启生效

九、设计亮点

  1. 熔断器复用
    getExistingSameCbOrNew 避免重复创建相同规则的熔断器,节省内存。

  2. 分离存储

    • circuitBreakers:运行时高性能访问;
    • ruleMap:用于管理/查询,解耦关注点。
  3. 强校验 + 容错

    无效规则被忽略并打日志,不影响其他规则加载。

  4. 支持正则资源

    通过 RuleManager 的 predicate 支持 resource = "api-*" 类型匹配。


十、使用示例

java 复制代码
DegradeRule rule = new DegradeRule("my-service")
    .setGrade(RuleConstant.DEGRADE_GRADE_RT)
    .setCount(50) // RT 阈值 50ms
    .setSlowRatioThreshold(0.5) // 慢调用比例 50%
    .setTimeWindow(10) // 熔断时长 10s
    .setMinRequestAmount(5); // 至少 5 个请求才触发

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

之后,当 my-service 的慢调用比例超过 50%,Sentinel 会自动熔断 10 秒。


总结

DegradeRuleManager 是 Sentinel 熔断功能的 中枢控制器,它:

  • 接收规则(静态或动态);
  • 验证规则(确保参数合法);
  • 生成熔断器(按策略创建实例);
  • 提供运行时支持 (Slot 通过 getCircuitBreakers 获取熔断器执行检查)。

理解它,就理解了 Sentinel 熔断机制的"配置到执行"全链路。

如果你对 CircuitBreaker 的具体工作原理(如状态机、指标统计)感兴趣,也可以继续深入!

相关推荐
不会写程序的未来程序员3 小时前
Redis 哨兵(Sentinel)原理
数据库·redis·sentinel
lang2015092813 小时前
Sentinel流控规则检查源码级分析
sentinel
lang2015092819 小时前
Sentinel限流核心:ThrottlingController设计详解
服务器·网络·sentinel
lang201509281 天前
Sentinel预热限流:WarmUpController原理详解
java·spring·sentinel
lang201509281 天前
Sentinel流量整形控制器全解析
sentinel
lang201509281 天前
Sentinel三大流控策略全解析
网络·sentinel
lang201509281 天前
Sentinel限流核心逻辑解析
java·python·sentinel
lang201509281 天前
Sentinel核心统计节点:滑动窗口与指标计算
sentinel
lang201509281 天前
深入解析Sentinel核心类StatisticSlot
sentinel