CAM350输出PDF全攻略:从Gerber到标准图纸的精准转换
2026/6/6 14:24:07
DegradeSlot是Sentinel(阿里巴巴开源的流量治理组件)中的熔断降级插槽的实现。它属于 Sentinel 责任链(Slot Chain)中的一环,专门用于实现熔断(Circuit Breaking)功能。
下面我将逐层解释它的作用、结构和关键逻辑,帮助你深入理解。
Sentinel 使用责任链模式来处理每一次资源访问(比如一个 API 接口)。每个功能(限流、熔断、系统保护等)由一个ProcessorSlot实现,并按顺序组成一条链。
entry():请求进入时调用(前置处理)exit():请求结束时调用(后置处理)DegradeSlot是其中负责熔断降级的插槽。
@Spi(order=Constants.ORDER_DEGRADE_SLOT)publicclassDegradeSlotextendsAbstractLinkedProcessorSlot<DefaultNode>@Spi:Sentinel 的 SPI 扩展机制,表示这是一个可插拔的组件。order = Constants.ORDER_DEGRADE_SLOT:指定在责任链中的执行顺序(通常在限流之后、系统规则之前)。AbstractLinkedProcessorSlot<DefaultNode>:说明它处理的是DefaultNode类型的统计节点(用于记录 QPS、响应时间等指标)。entry()—— 请求进入时检查熔断状态@Overridepublicvoidentry(Contextcontext,ResourceWrapperresourceWrapper,DefaultNodenode,intcount,booleanprioritized,Object...args)throwsThrowable{performChecking(context,resourceWrapper);// ← 关键:熔断检查fireEntry(...);// 继续责任链}performChecking()做了什么?voidperformChecking(Contextcontext,ResourceWrapperr)throwsBlockException{List<CircuitBreaker>circuitBreakers=DegradeRuleManager.getCircuitBreakers(r.getName());if(circuitBreakers==null||circuitBreakers.isEmpty()){return;// 没有熔断规则,直接放过}for(CircuitBreakercb:circuitBreakers){if(!cb.tryPass(context)){// ← 尝试通过熔断器thrownewDegradeException(cb.getRule().getLimitApp(),cb.getRule());}}}tryPass():falseDegradeException,请求被熔断拒绝💡
tryPass()内部会根据熔断策略(慢调用比例、异常比例、异常数等)判断是否放行。
exit()—— 请求结束后上报结果,更新熔断状态@Overridepublicvoidexit(Contextcontext,ResourceWrapperr,intcount,Object...args){EntrycurEntry=context.getCurEntry();// 如果请求已经被 block(比如被限流),就不需要更新熔断统计if(curEntry.getBlockError()!=null){fireExit(...);return;}List<CircuitBreaker>circuitBreakers=DegradeRuleManager.getCircuitBreakers(r.getName());if(circuitBreakers==null||circuitBreakers.isEmpty()){fireExit(...);return;}// 只有正常完成的请求才会上报给熔断器if(curEntry.getBlockError()==null){for(CircuitBreakercircuitBreaker:circuitBreakers){circuitBreaker.onRequestComplete(context);// ← 关键:上报本次请求结果}}fireExit(...);}blockError == null时上报?onRequestComplete()
onRequestComplete()会:
- 记录本次请求耗时
- 判断是否异常(通过
Tracer.trace(ex)标记)- 更新滑动窗口统计数据
- 触发熔断状态转换(CLOSE → OPEN / OPEN → HALF_OPEN → CLOSE)
[请求进入] ↓ DegradeSlot.entry() ↓ performChecking() → 检查熔断器状态 ├─ 若 OPEN → 抛 DegradeException(快速失败) └─ 若 CLOSED/HALF_OPEN → 放行 ↓ 业务逻辑执行 ↓ DegradeSlot.exit() ↓ onRequestComplete() → 上报耗时/异常 → 更新熔断状态| 特性 | 说明 |
|---|---|
| 非侵入式 | 业务代码无需关心熔断,Sentinel 自动拦截 |
| 多策略支持 | 异常比例、慢调用比例、异常数等(由CircuitBreaker实现类决定) |
| 实时反馈 | 每次请求完成后立即更新熔断状态 |
| 隔离性 | 每个资源(resource name)独立管理熔断器 |
假设你配置了一条熔断规则:
资源:
/api/order
策略:慢调用比例 > 50%(RT > 500ms),熔断时长 10s
那么:
/api/order的请求中有超过一半响应时间 > 500msCircuitBreaker会自动切换到OPEN状态performChecking()阶段直接抛DegradeExceptionentry,而统计在exit?A:这是责任链的标准做法——前置检查 + 后置清理/统计。
DegradeException是什么?A:Sentinel 自定义的BlockException子类,表示因熔断被拒绝。
A:可以通过 SPI 替换CircuitBreaker实现,或使用DegradeRuleManager.loadRules()动态加载规则。
DegradeSlot是 Sentinel 实现熔断降级的核心组件:
DegradeRuleManager和CircuitBreaker接口支持多种策略它体现了“故障快速失败 + 自动恢复”的容错设计理念,是微服务稳定性的重要保障。
如果你正在使用 Sentinel,理解DegradeSlot有助于你更好地配置和排查熔断问题。