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);
    }
相关推荐
岁岁种桃花儿6 分钟前
SpringCloud从入门到上天:Nacos做微服务注册中心(二)
java·spring cloud·微服务
Anita_Sun31 分钟前
一看就懂的 Haskell 教程 - 类型推断机制
后端·haskell
Anita_Sun43 分钟前
一看就懂的 Haskell 教程 - 类型签名
后端·haskell
七八星天1 小时前
C#代码设计与设计模式
后端
砍材农夫1 小时前
threadlocal
后端
神奇小汤圆2 小时前
告别手写HTTP请求!Spring Feign 调用原理深度拆解:从源码到实战,一篇搞懂
后端
布列瑟农的星空2 小时前
前端都能看懂的Rust入门教程(三)——控制流语句
前端·后端·rust
汤姆yu2 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶2 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习