DegradeRuleManager是 Sentinel 中用于管理 熔断降级规则(DegradeRule) 的核心类 。它负责:
- 加载、更新和验证熔断规则;
- 为每个资源创建对应的 熔断器(CircuitBreaker) 实例;
- 支持动态规则变更(通过
SentinelProperty); - 提供规则查询接口。
一、整体目标
根据配置的熔断规则(如慢调用比例、异常比例等),自动触发熔断,防止系统雪崩。
Sentinel 的熔断机制支持三种策略:
- 响应时间(RT)过长 → 慢调用比例熔断;
- 异常比例过高;
- 异常数过多(单位时间内)。
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:
-
校验规则合法性 (
isValidRule):- 资源名非空;
- 阈值、时间窗口、最小请求数等参数合法;
- 对于 RT 熔断:
slowRatioThreshold ∈ [0,1]; - 对于异常比例:
count ∈ [0,1](因为是比例);
-
设置默认
limitApp(通常为"default"); -
复用或创建
CircuitBreaker:javaCircuitBreaker 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→ 重建熔断器; - 实现 无需重启生效。
九、设计亮点
-
熔断器复用
getExistingSameCbOrNew避免重复创建相同规则的熔断器,节省内存。 -
分离存储
circuitBreakers:运行时高性能访问;ruleMap:用于管理/查询,解耦关注点。
-
强校验 + 容错
无效规则被忽略并打日志,不影响其他规则加载。
-
支持正则资源
通过
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 的具体工作原理(如状态机、指标统计)感兴趣,也可以继续深入!