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);
    }
相关推荐
快乐非自愿几秒前
Spring Boot集成Spring Security之HTTP请求授权
spring boot·spring·http
不懂9010 分钟前
Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议
spring boot·后端·http·https
代码小白%1 小时前
快速理解Spring 和 Spring Boot 的核心区别
java·spring boot·spring
工业互联网专业1 小时前
基于springboot+vue的融合多源高校画像数据与协同过滤算法的高考择校推荐系统
java·vue.js·spring boot·毕业设计·源码·课程设计·高考择校推荐系统
总是学不会.2 小时前
从“记住我”到 Web 认证:Cookie、JWT 和 Session 的故事
java·前端·后端·开发
虎鲸不是鱼2 小时前
【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建
java·spring boot·spring·maven·mybatis
Neozsvc2 小时前
飞书工单审批对接腾讯电子签:开启合同流程自动化新时代
运维·人工智能·后端·自动化·飞书
℡52Hz★2 小时前
利用node.js搭配express框架写后端接口(一)
后端·node.js·express
IT闫2 小时前
【SpringBoot】——如何在Spring Boot中使用ThreadLocal来存储和获取用户详情信息以及实体类参数验证
java·spring boot·后端
编程诗人华仔3 小时前
若依框架实际国际化前后端统一解决方案
java·vue.js·spring boot·后端·elementui