SpringVortexNotes

邮件 Feign 降级不能伪装发送成功

zjc 于 2026-08-24 发布

代码环境

邮件发送是有副作用的写操作。service-mail 不可用时,Consumer 不能在本地造一条“发送成功”的响应,否则调用方会以为邮件已经发出,问题会延迟到用户收不到邮件时才暴露。

这次提交给 MailFeignApi 显式接入降级工厂:

@FeignClient(
        value = "service-mail",
        contextId = "mailFeignApi",
        fallbackFactory = MailFeignFallbackFactory.class
)

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

降级实现只做一件事:

return dto -> 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/mail/factory/MailFeignFallbackFactory.java

失败原因在 create(Throwable cause) 里记录 ERROR,用于后续排查 SMTP、服务发现、超时或下游状态;对外响应保持统一的 503 业务码和稳定提示。

这个实现仍然不是完整的可靠投递方案。调用方收到失败后可以重试,但如果要求“邮件最终一定发送”,还需要发送状态落库、重试队列、幂等键和对账机制。当前项目的边界是先把失败如实暴露出来。

MailFeignFallbackFactory 同时加入 AutoConfiguration.imports,并新增清单测试确认用户、邮件两个降级工厂都会被公共模块自动注册。共享 Feign 契约的模块不需要再手动 @Import

经验总结

读操作可以考虑空数据兜底,写操作的第一原则是诚实。邮件发送失败必须返回失败,后续的补偿和重试才有机会建立在一个真实状态上。

评论

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