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

不用 @CircuitBreaker 注解,自定义 Resilience4j 熔断器 + AOP 实现

前一篇写了 基于 Feign + Resilience4j 的微服务熔断防雪崩优化方案。这次同一套系统又要加熔断,但走 Feign 那条路走不通了。

三个接口直连 HTTP 调外部数据接口,返回体用业务码表达失败,不抛异常。现成的@CircuitBreaker注解只认异常,用不上,只能自己搭一套。

一、场景

三个接口都调外部数据服务,返回统一封装:

classRemoteResult<T>{privateintcode;// 0=成功,500106=远程服务异常,其他=业务码privateTdata;...}

调用方拿到结果自己判code。HTTP 200 也可能是失败。跟前一篇 Feign 那套差在这里:

  • 上一篇走 Feign,用ErrorDecoder在解码阶段把"系统异常码"转成特殊异常抛给 Resilience4j,异常路径触发熔断。
  • 这一篇直连 HTTP,RestTemplate拿回一个对象,方法里没有异常,熔断器数不到失败次数。

Resilience4j 的@CircuitBreaker注解默认只识别异常。要让它认业务码,得走recordResult回调——一个Predicate<Object>,让你自己定义什么样的返回值算失败。所以这套方案没用注解,而是包了一层自己的装饰器。

二、类图

业务代码只调代理 Bean,注解标在代理 Bean 的方法上,切面拦截并交给底层熔断器执行。

三、调用时序

熔断打开时,切面反射从方法签名RemoteResult<T>里拿到 T,new T()包一个空的RemoteResult.success(...)作为兜底。业务代码看到的永远是同类型的返回值,不用判空、不用 catch。

四、核心代码

注解——空注解,参数全靠约定:

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public@interfaceRemoteCircuitBreakerProtected{}

代理 Bean——集中管理受保护的调用,解决 AOP self-invocation 问题:

@ComponentpublicclassRemoteFacade{@ResourceprivateRemoteUtilremoteUtil;@RemoteCircuitBreakerProtectedpublicRemoteResult<RespA>queryA(ReqAreq){returnremoteUtil.queryA(req);}@RemoteCircuitBreakerProtectedpublicRemoteResult<RespB>queryB(ReqBreq){returnremoteUtil.queryB(req);}// ...}

切面——统一 fallback 反射构造:

@Around("@annotation(com.example.cb.RemoteCircuitBreakerProtected)")publicObjectaround(ProceedingJoinPointpjp){Methodmethod=((MethodSignature)pjp.getSignature()).getMethod();returnbreaker.decorateSupplier(()->proceed(pjp),e->buildFallback(method));}privateObjectbuildFallback(Methodmethod){// 从 RemoteResult<T> 拿到 TParameterizedTypetype=(ParameterizedType)method.getGenericReturnType();Class<?>dataClass=(Class<?>)type.getActualTypeArguments()[0];try{returnRemoteResult.success(dataClass.getDeclaredConstructor().newInstance());}catch(ReflectiveOperationExceptione){returnRemoteResult.success(null);}}

熔断器工厂——recordResult 定义什么样的返回值算失败:

CircuitBreakerConfigconfig=CircuitBreakerConfig.custom().failureRateThreshold(60).minimumNumberOfCalls(6).slidingWindowSize(10).waitDurationInOpenState(Duration.ofSeconds(10)).permittedNumberOfCallsInHalfOpenState(3).slowCallRateThreshold(80).slowCallDurationThreshold(Duration.ofSeconds(10))// ↓↓↓ 关键.recordResult(response->{if(responseinstanceofRemoteResult<?>r&&r.getCode()==REMOTE_SERVICE_ERROR_CODE){returntrue;// 业务码算失败}returnfalse;}).build();

五、recordResult 的边界

recordResult只处理调用正常返回、但返回值本身表示业务失败的情况。如果方法内部抛了异常(RestTemplate 超时、连接失败),Resilience4j 默认会把这次调用记为失败,recordResult根本不会被调用。

所以这套方案实际上覆盖两条失败路径:

  • 抛异常 → 走 Resilience4j 默认失败识别(超时、网络异常等)
  • 不抛异常但业务码是失败 → 走 recordResult 兜底

两条合起来才不会漏掉"HTTP 200 也可能失败"的情况。

六、小结

这套方案落到代码上就三件事:

  • recordResult负责识别业务码失败,补上"HTTP 200 也是失败"这条路径
  • AOP 切面从方法签名的泛型里反射构造 fallback,业务代码不用写 lambda
  • 代理 Bean 把受保护的调用集中起来,同时避开 AOP self-invocation 的坑

再加个其他接口,只需要往代理 Bean 加一个方法、标个注解,调用方走代理 Bean。熔断的判定阈值、fallback 语义、日志格式都不用重写。

和前一篇 Feign 方案配起来,两条外部调用形态都有解法:能拦截解码的走ErrorDecoder,直接拿到封装对象的走recordResult+ AOP。

http://www.jsqmd.com/news/1245665/

相关文章:

  • ChatGPT Work早期测试:工作场景AI助手部署与API集成指南
  • 推荐一下广东服务不错的无缝焊接窗门窗源头工厂:优选 - 品牌推广大师
  • 通知:泰格豪雅石家庄2026年7月最新网点地址及客户服务热线 - 亨得利官方服务中心
  • 想验证监控灵不灵?stress 一键压满 CPU 内存,模拟服务器风暴。
  • GPT 5.6 连续编码 10 小时,纯 Python 啃下 Word 二进制格式——doc2docx 实现拆解
  • 基于VS2013与MFC实现经典生命游戏:元胞自动机算法与桌面应用开发实践
  • 什么是房地产电子沙盘?
  • 《天灵诀》手游正版下载与安全验证全攻略
  • 还在为论文头秃?这5个AI论文写作工具让你效率翻倍!
  • 【Linux网络·加餐】frp内网穿透
  • WebSocket安全漏洞挖掘与防御实战指南
  • input的多人格
  • TI TMS570LS0714汽车安全MCU:ASIL-D级功能安全架构与实时控制实战
  • I2C控制寄存器深度解析:从协议原理到DMA与引脚配置实战
  • Tiva TM4C123x ROM API实战:CRC、Flash与FPU模块深度解析与应用
  • 2026年7月最新宇舶重庆前滩太古里维修保养服务电话 - 亨得利钟表维修中心
  • 2026年7月最新伯爵唐山万象汇维修保养服务电话 - 亨得利钟表维修中心
  • 基于Docker容器化技术的微信Webhook机器人项目深度解析:从环境部署到自动化消息收发的全流程实战指南
  • 建筑动画:从方案可视化到城市展示的数字基建
  • SolidWorks材料库本地化实践与GB标准材料添加指南
  • 深入解析Tiva™ TM4C1294 GPIO寄存器:从底层原理到高级应用
  • TM4C123BH6ZRB ADC模块深度解析:采样序列器与硬件平均实战
  • Model Router 如何实现智能模型选择?一文讲清大模型路由机制(2026最新版)
  • 2026年AI编程工具终极实测:Cursor vs Claude Code vs 文心快码,谁能让开发效率翻倍?
  • C++实战:构建家政装修公司全流程管理平台的设计与实现
  • C++ std::set 深度解析:从红黑树原理到高效应用实践
  • 2026年天宁区渗水维修企业推荐,防水维修/卫生间防水维修/渗水维修/漏水维修/阳台漏水维修,渗水维修服务商选哪家 - 品牌推荐师
  • 2026 年更新:玉树州有实力的运动场膜结构顶棚品牌综合实力解析,揭秘:顶棚的秘密,如何让运动场效率翻倍? - 行业推荐官[官方】--
  • 如何保证 Redis 分布式锁的高可用和高性能?
  • 基于Unity3D与ROS2搭建SLAM仿真实验室:低成本算法验证平台