SpringVortexNotes

用户 Feign 降级要承认服务不可用

zjc 于 2026-08-24 发布

代码环境

用户 Feign 接口之前的降级策略是:单个查询返回 data=null 的成功响应,列表返回空列表。这个写法对演示很友好,但有一个语义问题:

查询成功但数据不存在 -> success=true, data=null
下游服务不可用     -> success=true, data=null

调用方无法区分“确实没有这条用户”和“Provider 当前不可用”。这次提交把降级响应统一改成:

private static <T> ApiResponse<T> serviceUnavailable() {
    return ApiResponse.failure(ApiResponseEnum.SERVICE_UNAVAILABLE.code(), "业务繁忙,请稍后再试");
}

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-common/src/main/java/com/zjc/common/api/user/factory/UserFeignFallbackFactory.java

调整后,getUserlist 触发降级时都返回:

{
  "success": false,
  "code": 503,
  "message": "业务繁忙,请稍后再试",
  "data": null
}

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-common/src/test/java/com/zjc/common/api/user/factory/UserFeignFallbackFactoryTest.java

失败原因仍然由 FallbackFactory 拿到并写入日志,包括连接拒绝、超时、下游 503 或反序列化失败;但对外只暴露稳定提示,不透出下游地址、连接类型等基础设施细节。

单元测试同步验证了两件事:单个查询和列表都返回 SERVICE_UNAVAILABLE,并且 data 为空。这样上层不能再把降级误判成普通空结果。

经验总结

降级响应要保留业务语义。查询不到数据和下游不可用是两种完全不同的结果;前者可以是成功响应,后者应该明确失败,让调用方决定重试、提示还是停止后续流程。

评论

评论由 GitHub Discussions 承载,需要 GitHub 账号登录。