当前位置: 首页 > news >正文

Feign - 降级选 fallback 还是 fallbackFactory

在这里插入图片描述

01前言

什么时候用 fallback,什么时候用 fallbackFactory,以及怎样写才不会踩坑。

02 5 行对比表,一眼看懂差异

在这里插入图片描述

03代码实战

3.1 fallback 极简示例

@FeignClient(name = "payment-svc", fallback = PaymentFallback.class)
public interface PaymentClient {@PostMapping("/pay")PaymentResult pay(@RequestBody PaymentRequest req);
}@Component
public class PaymentFallback implements PaymentClient {@Overridepublic PaymentResult pay(PaymentRequest req) {// 固定返回失败,简单粗暴return PaymentResult.error("支付服务开小差了~");}
}

注解:

  1. @FeignClient 直接指向降级类 PaymentFallback。
  2. 整个容器里只有一个 PaymentFallback Bean,高并发时别忘了保证无状态。
  3. 无法感知异常类型,适合提示类兜底文案。

3.2 fallbackFactory 进阶示例

@FeignClient(name = "user-svc", fallbackFactory = UserFallbackFactory.class)
public interface UserClient {@GetMapping("/user/{id}")User getUser(@PathVariable Long id);
}@Component
public class UserFallbackFactory implements FallbackFactory<UserClient> {private static final Logger log = LoggerFactory.getLogger(UserFallbackFactory.class);@Overridepublic UserClient create(Throwable cause) {// 这里可以拿到异常,做各种骚操作return new UserClient() {@Overridepublic User getUser(Long id) {log.warn("用户服务跪了, 原因: {}", cause.getMessage());if (cause instanceof FeignException.NotFound) {return User.unknown(id);          // 404 → 未知用户} else if (cause instanceof TimeoutException) {return User.temporary(id);        // 超时 → 临时用户}return User.defaultUser(id);          // 其他 → 默认用户}};}
}

注解:

  1. 每次远程调用失败都会触发 create(Throwable),异常对象随便玩。
  2. 返回的是匿名内部类,天然线程封闭,再也不用加锁。
  3. 根据异常类型返回不同策略,让降级更智能。

04线程安全对比

为什么 fallbackFactory 更省心?

// ❌ 错误示范:fallback 单例里带状态
@Component
public class UnsafeFallback implements SomeClient {private int counter = 0;public String count() {counter++;                // 多线程并发会乱return "Count: " + counter;}
}// ✅ 正确姿势:fallbackFactory 每次都 new
public class SafeFallbackFactory implements FallbackFactory<SomeClient> {public SomeClient create(Throwable cause) {return new SomeClient() {private int counter = 0;   // 线程私有,安全!public String count() {counter++;return "Count: " + counter;}};}
}

05混合打法

又想打日志又想高性能?

public class HybridFallbackFactory implements FallbackFactory<SomeClient> {// 预先 new 好一个单例,避免重复创建private static final SomeClient STATIC_FALLBACK = new StaticFallback();@Overridepublic SomeClient create(Throwable cause) {// 只做日志记录,然后返回同一个单例log.error("远程调用失败", cause);return STATIC_FALLBACK;}private static class StaticFallback implements SomeClient {public String getData() {return "static-fallback";}}
}

06性能小贴士
高并发如何减轻 fallbackFactory 的 GC 压力?

public class CachingFallbackFactory implements FallbackFactory<SomeClient> {private final Map<Class<? extends Throwable>, SomeClient> cache = new ConcurrentHashMap<>();@Overridepublic SomeClient create(Throwable cause) {return cache.computeIfAbsent(cause.getClass(),k -> new SomeClient() {public String get() {return "Error: " + k.getSimpleName();}});}
}

注解:

  1. 用异常类型做 key,同一个异常类只 new 一次。
  2. ConcurrentHashMap 线程安全,并发无锁。
  3. 适合异常类型有限且 QPS 极高的场景。

总结

• 业务简单、返回固定文案 → 用 fallback,写完收工。
• 需要看异常、想玩策略、还要线程安全 → 直接上 fallbackFactory。

http://www.xdnf.cn/news/1331245.html

相关文章:

  • HTTP/1.1 与 HTTP/2 全面对比:性能革命的深度解析
  • Final Cut Pro X Mac fcpx音视频剪辑编辑
  • MacBook Pro M1升级Burp Suite2025.8
  • 实时视频技术选型深度解析:RTSP、RTMP 与 WebRTC 的边界
  • AI on Mac, Your Way!全本地化智能代理,隐私与性能兼得
  • STM32存储结构
  • 【JavaEE】多线程(线程安全问题)
  • 中国大学MOOC-C语言第九周指针(上)
  • 数据结构:利用旋转在AVL树中维持平衡(Inserting in AVL with Rotation)
  • 自建开发工具IDE(一)之拖找排版—仙盟创梦IDE
  • RabbitMQ 基础
  • 吱吱企业通讯软件保证内部通讯安全,搭建数字安全体系
  • Windows 中的“计数器”
  • TDengine IDMP 运维指南(数据导入导出)
  • 第三阶段数据-3:数据库脚本生成,备份与还原,分离与附加
  • RabbitMQ:SpringAMQP Topic Exchange(主题交换机)
  • Oracle:配置让插入语句时id自动输入
  • 生产环境MongoDB分片策略优化与故障排查实战经验分享
  • 翻译记忆库(TMX)与机器翻译的结合应用
  • ​​pytest+yaml+allure接口自动化测试框架
  • 计算机视觉(二)------OpenCV图像视频操作进阶:从原理到实战
  • MYSQL-增删查改CRUD
  • 遥感机器学习入门实战教程|Sklearn 案例④ :多分类器对比(SVM / RF / kNN / Logistic...)
  • 【C++】--指针与引用深入解析和对比
  • 2025 | 腾讯混元RLVMR颠覆强化学习:可验证推理奖励引爆AI智能体新范式!
  • 文本智能抽取:如何用NLP从海量文本中“炼“出真金?-告别无效阅读,让AI成为你的“信息炼金师
  • git 生成 Patch 和打 Patch
  • 在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)
  • 汽车ECU实现数据安全存储(机密性保护)的一种方案
  • 网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!