spring boot 2.7 + seata +微服务 降级失败问题修复

文章引流

一个简单而使用的API管理工具

版本号

复制代码
spring boot 2.7.17
spring-cloud-dependencies 2021.0.8
spring-cloud-circuitbreaker-resilience4j 2.1.7
spring-cloud-starter-alibaba-seata 2021.1
jdk 1.8

原因分析

  1. 未配置属性
properties 复制代码
feign.circuitbreaker.enabled=true
# 未开启该配置,则该代码对应的bean 不会初始化
FeignAutoConfiguration.CircuitBreakerPresentFeignTargeterConfiguration.circuitBreakerFeignTargeter()
  1. seata 的配置对feign存在一定的影响
java 复制代码
SeataFeignClientAutoConfiguration.feignBuilder()
// 该bean的配置会影响服务降级的实现过程
// 改bean初始化的是 Feign.builder(),具体的自行看源码
// 进而导致 FeignCircuitBreaker.builder() 无法初始化,源码在 FeignClientsConfiguration.CircuitBreakerPresentFeignBuilderConfiguration.circuitBreakerFeignBuilder

修复方案

java 复制代码
// 添加配置 feign.circuitbreaker.enabled=true
// 自定义 Feign.Builder 对应的Bean的初始化

    @Bean
    @ConditionalOnBean(CircuitBreakerFactory.class)
    public Feign.Builder circuitBreakerFeignBuilder(BeanFactory beanFactory) throws Exception {
       // 此处需要通过反射的方式实现,原因。。。。自己看源码
        Constructor<SeataFeignClient> declaredConstructor =
                SeataFeignClient.class.getDeclaredConstructor(BeanFactory.class);
        declaredConstructor.setAccessible(Boolean.TRUE);
        SeataFeignClient seataFeignClient = declaredConstructor.newInstance(beanFactory);
        return FeignCircuitBreaker.builder().client(seataFeignClient);
    }
相关推荐
风象南28 分钟前
普通人用AI加持赚到的第一个100块
人工智能·后端
冰_河2 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
JavaGuide5 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程5 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
格砸6 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
蝎子莱莱爱打怪6 小时前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
哈密瓜的眉毛美7 小时前
零基础学Java|第三篇:DOS 命令、转义字符、注释与代码规范
后端
用户60572374873087 小时前
AI 编码助手的规范驱动开发 - OpenSpec 初探
前端·后端·程序员
哈密瓜的眉毛美7 小时前
零基础学Java|第二篇:Java 核心机制与第一个程序:从 JVM 到 Hello World
后端