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);
    }
相关推荐
追逐时光者5 小时前
一款开源、现代化的 WinForm UI 控件库
后端·.net
花月C6 小时前
个性化推荐:基于用户的协同过滤算法
开发语言·后端·算法·近邻算法
cci7 小时前
还在用conda?,试试uv,提高包的安装速度
后端
cci7 小时前
设备每次插入Linux识别的串口不一样?试试udev!
后端
9ilk8 小时前
【C++】--- C++11
开发语言·c++·笔记·后端
码事漫谈9 小时前
VSCode CMake Tools 功能解析、流程与最佳实践介绍
后端
火云牌神9 小时前
本地大模型编程实战(38)实现一个通用的大模型客户端
人工智能·后端
码事漫谈10 小时前
从C++/MFC到CEF与TypeScript的桌面架构演进
后端
weixin_4624462310 小时前
SpringBoot切换Redis的DB
数据库·spring boot·redis
冰块的旅行10 小时前
magic-api使用
后端