serviceunavailableexception 是微服务中标识下游服务不可用(如 http 503)的业务异常,需通过 feign fallback/fallbackfactory、dubbo mock 或手动检查响应码捕获并降级,结合 resilience4j/sentinel 实现熔断与重试,兜底策略应真实可用且避免空指针。
serviceunavailableexception 通常表示下游服务暂时不可用(如 http 503),在 java 微服务中,它本身不是 spring 或标准库的内置异常,而是常见于 feign、dubbo、自定义 rpc 框架或 http 客户端(如 retrofit、okhttp 封装)中用于标识服务不可达的业务异常。实现降级的核心思路是:捕获该异常,返回兜底逻辑(如默认值、缓存数据、空对象或友好提示),避免故障传播。
明确 ServiceUnavailableException 的来源和触发时机
先确认这个异常来自哪一层:
- 如果是 Feign 客户端,它默认不会抛 ServiceUnavailableException;需配合 Feign 自定义 ErrorDecoder,将 503 响应码转为此异常
- 如果是 Dubbo,可通过 mock 配置 或自定义
ClusterInvoker在 Invoker 失败时触发降级 - 如果是 WebClient/RestTemplate,需手动检查响应状态码,在 503 时主动 throw 此异常,再由上层捕获
使用 @Fallback 或 @FallbackFactory(推荐 Feign 场景)
Feign 支持原生降级机制,无需额外 AOP 或 try-catch:
- 定义 fallback 类,实现远程接口,所有方法返回安全兜底值
- 在
@FeignClient中指定fallback = XxxFallback.class - 更灵活的方式是用
fallbackFactory,可获取原始异常信息,区分处理 ServiceUnavailableException 和其他异常
示例:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
@Override
public UserService create(Throwable cause) {
if (cause instanceof ServiceUnavailableException) {
return new DefaultUserService(); // 返回缓存用户或游客对象
}
return new EmptyUserService();
}
}
结合 Resilience4j 或 Sentinel 做统一熔断降级
当 ServiceUnavailableException 频发时,单纯降级不够,需配合熔断器防止雪崩:
- Resilience4j 的
CircuitBreaker可配置 failureRateThreshold,连续多次抛 ServiceUnavailableException 后自动熔断 - 熔断开启后,所有调用直接走 fallback,不发起远程请求
- 搭配
TimeLimiter防止超时阻塞,RetryConfig可对临时性 503 做有限重试(如指数退避 2 次)
兜底策略要真实可用,不能只是“返回 null”
降级不是掩盖问题,而是保障核心链路可用:
- 查用户信息失败 → 返回本地缓存的旧数据(标注“数据可能已过期”)
- 下单依赖库存服务不可用 → 先生成订单(状态为“待校验库存”),异步补偿
- 推荐服务不可用 → 切换为热门商品静态列表,或按规则降级为“最近浏览”
- 避免空指针:兜底对象尽量用 Optional、非 null 默认值,或明确文档说明降级行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










