代码环境
- 仓库:https://github.com/springvortex/spring-cloud-alibaba.git
- 分支:
release/v1.0.0- JDK:
21- Spring Boot:
4.1.0
邮件发送是有副作用的写操作。service-mail 不可用时,Consumer 不能在本地造一条“发送成功”的响应,否则调用方会以为邮件已经发出,问题会延迟到用户收不到邮件时才暴露。
这次提交给 MailFeignApi 显式接入降级工厂:
@FeignClient(
value = "service-mail",
contextId = "mailFeignApi",
fallbackFactory = MailFeignFallbackFactory.class
)
降级实现只做一件事:
return dto -> ApiResponse.failure(
ApiResponseEnum.SERVICE_UNAVAILABLE.code(), "业务繁忙,请稍后再试");
失败原因在 create(Throwable cause) 里记录 ERROR,用于后续排查 SMTP、服务发现、超时或下游状态;对外响应保持统一的 503 业务码和稳定提示。
这个实现仍然不是完整的可靠投递方案。调用方收到失败后可以重试,但如果要求“邮件最终一定发送”,还需要发送状态落库、重试队列、幂等键和对账机制。当前项目的边界是先把失败如实暴露出来。
MailFeignFallbackFactory 同时加入 AutoConfiguration.imports,并新增清单测试确认用户、邮件两个降级工厂都会被公共模块自动注册。共享 Feign 契约的模块不需要再手动 @Import。
经验总结
读操作可以考虑空数据兜底,写操作的第一原则是诚实。邮件发送失败必须返回失败,后续的补偿和重试才有机会建立在一个真实状态上。
评论
评论由 GitHub Discussions 承载,需要 GitHub 账号登录。