文章引流
一個簡單而使用的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
原因分析
- 未配置屬性
feign.circuitbreaker.enabled=true
# 未開啟該配置,則該代碼對應的bean 不會初始化
FeignAutoConfiguration.CircuitBreakerPresentFeignTargeterConfiguration.circuitBreakerFeignTargeter()
- 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);}