首页 前端知识 spring boot 2.7 seata 微服务 降级失败问题修复

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

2025-02-28 12:02:23 前端知识 前端哥 243 547 我要收藏

文章引流

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

修复方案

// 添加配置 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);
}
复制
转载请注明出处或者链接地址:https://www.qianduange.cn//article/21989.html
标签
评论
会员中心 联系我 留言建议 回顶部
复制成功!