java异常本身不触发sentinel熔断,需让异常穿透资源边界并被统计;应在最外层兜底,资源方法内原样抛出runtimeexception类异常;配置degrade_grade_exception_ratio规则,设置最小请求数、异常比例阈值和熔断时间;熔断后通过fallback(业务异常)或blockhandler(sentinel阻塞)执行降级。

Java 异常处理本身不直接触发熔断,Sentinel 的熔断降级是基于运行时指标统计的独立机制。要让异常真正驱动熔断,关键不是“捕获异常”,而是让异常被 Sentinel 捕获并纳入统计——这要求异常必须穿透到 Sentinel 的资源边界内,且未被提前吞掉。
异常必须逃逸出 Sentinel 资源保护范围
如果在 SphU.entry() 或 @SentinelResource 包裹的方法内部就用 try-catch 吞掉了异常,Sentinel 就无法感知这次调用失败,自然不会计入异常比例或异常数统计。
正确做法是:只在最外层(如 Controller 或 Feign fallback)做兜底处理,资源方法体内让业务异常原样抛出。
- ✅ 允许 RuntimeException、IOException 等未检查异常向上抛出
- ✅ 自定义业务异常继承 RuntimeException,避免被静默吞掉
- ❌ 不要在资源方法里 catch Exception 后 return null 或 log 完事
配置异常比例熔断规则
当异常能正常上报后,需显式配置 DegradeRule,启用 ERROR_RATIO 策略:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 设置最小请求数(如
minRequestAmount = 5),避免低流量下误熔断 - 设定异常比例阈值(如
count = 0.5表示 50%) - 指定熔断持续时间(如
timeWindow = 60秒),期间所有请求直接走降级逻辑
示例代码:
DegradeRule rule = new DegradeRule("orderService:query").setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
.setCount(0.6) // 60% 异常率
.setMinRequestAmount(10)
.setTimeWindow(30);
DegradeRuleManager.loadRules(Collections.singletonList(rule));
熔断触发后执行降级逻辑
熔断进入 OPEN 状态后,后续请求不再真正调用下游,而是立即执行降级(fallback)。有两种主流方式:
-
编程式:用
try-catch BlockException,在 catch 块中返回默认值或缓存数据 -
注解式:在
@SentinelResource中指定fallback方法,该方法签名需与原方法一致,且仅处理业务异常;或指定blockHandler处理限流/熔断等 Sentinel 自身异常
注意:fallback 不会捕获 BlockException,它只响应业务异常;而 blockHandler 才响应熔断、限流等触发的阻塞。
与 Feign 集成时的异常传导要点
使用 OpenFeign + Sentinel 时,Feign 默认会把 HTTP 4xx/5xx 转为 FeignException 抛出,这类异常可被 Sentinel 统计。但需确认:
- Feign 配置未开启
decode404 = true(否则 404 会被转为 null,不触发异常统计) - 自定义
ErrorDecoder未把异常转为静默返回 - Feign 接口方法声明抛出异常(如
throws ServiceException),有助于 AOP 正确拦截
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










