Feign 降级工厂比 fallback 多知道一件事

zjc 于 2026-08-13 发布

远程调用一定会有失败。OpenFeign 支持在失败时走 fallback,但项目选择的是 FallbackFactory,因为它能拿到失败原因。排查线上问题时,这一件事非常关键。

一、工厂能拿到异常

@Slf4j
@Component
public class UserFeignFallbackFactory implements FallbackFactory<UserFeignApi> {
    @Override
    public UserFeignApi create(Throwable cause) {
        log.error("调用 service-provider 用户接口失败,触发降级", cause);
        return new UserFeignApi() {
            // 返回兜底数据
        };
    }
}

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

连接拒绝、读超时、下游 503、反序列化失败,都会出现在 cause 里。普通 fallback 只知道“进了兜底”,不知道为什么。

二、降级策略要跟业务走

项目里的用户接口采用可用性优先:

这适合演示和部分读取场景,但不适合所有业务。下单、扣库存、支付这类操作更应该暴露失败,让用户重试,而不是返回一个看似成功的空结果。

三、成功包装不代表没有降级

降级响应使用统一 ApiResponse,上层必须检查 data。如果调用方只看 success,就会把“服务不可用但优雅返回”误判成“查询结果为空”。

四、降级日志要能聚合

记录失败原因、目标服务、接口方法和关键参数,可以快速回答三个问题:

  1. 是哪个下游不可用。
  2. 是超时还是连接失败。
  3. 影响了多少请求。

五、经验总结

降级不是把异常藏起来,而是把失败转换成系统设计好的响应。想清楚一致性优先还是可用性优先,比写一个空返回重要得多。