代码环境
- 仓库:https://github.com/springvortex/spring-cloud-alibaba.git
- 分支:
release/v1.0.0- JDK:
21- Spring Boot:
4.1.0
用户 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(), "业务繁忙,请稍后再试");
}
调整后,getUser 和 list 触发降级时都返回:
{
"success": false,
"code": 503,
"message": "业务繁忙,请稍后再试",
"data": null
}
失败原因仍然由 FallbackFactory 拿到并写入日志,包括连接拒绝、超时、下游 503 或反序列化失败;但对外只暴露稳定提示,不透出下游地址、连接类型等基础设施细节。
单元测试同步验证了两件事:单个查询和列表都返回 SERVICE_UNAVAILABLE,并且 data 为空。这样上层不能再把降级误判成普通空结果。
经验总结
降级响应要保留业务语义。查询不到数据和下游不可用是两种完全不同的结果;前者可以是成功响应,后者应该明确失败,让调用方决定重试、提示还是停止后续流程。
评论
评论由 GitHub Discussions 承载,需要 GitHub 账号登录。