From f983826496a7f6be51c1d96942f324ef679448e4 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 11 Jan 2021 11:56:20 +0100 Subject: [PATCH] Setting default feign builder only when circuit breaker is missing or disabled; fixes gh-1816 --- .../TraceFeignClientAutoConfiguration.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java index 59741e3e3..69dc11de2 100644 --- a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java @@ -22,9 +22,11 @@ import feign.okhttp.OkHttpClient; import org.springframework.beans.factory.BeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.AnyNestedCondition; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.FeignContext; @@ -34,6 +36,7 @@ import org.springframework.cloud.sleuth.instrument.web.client.feign.OkHttpFeignC import org.springframework.cloud.sleuth.instrument.web.client.feign.SleuthFeignBuilder; import org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignAspect; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; @@ -51,13 +54,6 @@ import org.springframework.context.annotation.Scope; @AutoConfigureBefore(FeignAutoConfiguration.class) public class TraceFeignClientAutoConfiguration { - @Bean - @ConditionalOnMissingBean - @Scope("prototype") - Feign.Builder feignBuilder(BeanFactory beanFactory) { - return SleuthFeignBuilder.builder(beanFactory); - } - @Bean TraceFeignAspect traceFeignAspect(BeanFactory beanFactory) { return new TraceFeignAspect(beanFactory); @@ -85,4 +81,35 @@ public class TraceFeignClientAutoConfiguration { } + @Configuration(proxyBeanMethods = false) + @Conditional(CircuitBreakerMissingOrDisabledCondition.class) + protected static class CircuitBreakerMissingConfiguration { + + @Bean + @ConditionalOnMissingBean + @Scope("prototype") + Feign.Builder feignBuilder(BeanFactory beanFactory) { + return SleuthFeignBuilder.builder(beanFactory); + } + + } + + private static class CircuitBreakerMissingOrDisabledCondition extends AnyNestedCondition { + + CircuitBreakerMissingOrDisabledCondition() { + super(ConfigurationPhase.PARSE_CONFIGURATION); + } + + @ConditionalOnMissingClass("org.springframework.cloud.client.circuitbreaker.CircuitBreaker") + static class NoCircuitBreakerClassFound { + + } + + @ConditionalOnProperty(value = "feign.circuitbreaker.enabled", havingValue = "false", matchIfMissing = true) + static class CircuitBreakerDisabled { + + } + + } + }