diff --git a/docs/src/main/asciidoc/spring-cloud-netflix.adoc b/docs/src/main/asciidoc/spring-cloud-netflix.adoc index ef55c556..86f07abb 100644 --- a/docs/src/main/asciidoc/spring-cloud-netflix.adoc +++ b/docs/src/main/asciidoc/spring-cloud-netflix.adoc @@ -1060,9 +1060,7 @@ NOTE: `PROD-SVC` is the name of the service the Clients will be making requests [[spring-cloud-feign-hystrix]] === Feign Hystrix Support -If Hystrix is on the classpath, by default Feign will wrap all methods with a circuit breaker. Returning a `com.netflix.hystrix.HystrixCommand` is also available. This lets you use reactive patterns (with a call to `.toObservable()` or `.observe()` or asynchronous use (with a call to `.queue()`). - -To disable Hystrix support for Feign, set `feign.hystrix.enabled=false`. +If Hystrix is on the classpath and `feign.hystrix.enabled=true`, Feign will wrap all methods with a circuit breaker. Returning a `com.netflix.hystrix.HystrixCommand` is also available. This lets you use reactive patterns (with a call to `.toObservable()` or `.observe()` or asynchronous use (with a call to `.queue()`). To disable Hystrix support on a per-client basis create a vanilla `Feign.Builder` with the "prototype" scope, e.g.: @@ -1078,6 +1076,10 @@ public class FooConfiguration { } ---- +WARNING: Prior to the Spring Cloud Dalston release, if Hystrix was on the classpath Feign would have wrapped +all methods in a circuit breaker by default. This default behavior was changed in Spring Cloud Dalston in +favor for an opt-in approach. + [[spring-cloud-feign-hystrix-fallback]] === Feign Hystrix Fallbacks diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java index ce23c89e..c187482c 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignClientsConfiguration.java @@ -98,7 +98,7 @@ public class FeignClientsConfiguration { @Bean @Scope("prototype") @ConditionalOnMissingBean - @ConditionalOnProperty(name = "feign.hystrix.enabled", matchIfMissing = true) + @ConditionalOnProperty(name = "feign.hystrix.enabled", matchIfMissing = false) public Feign.Builder feignHystrixBuilder() { return HystrixFeign.builder(); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java index 41442c9a..37cc3620 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityAutoConfiguration.java @@ -74,7 +74,7 @@ public class HystrixSecurityAutoConfiguration { super(ConfigurationPhase.REGISTER_BEAN); } - @ConditionalOnProperty(name = "feign.hystrix.enabled", matchIfMissing = true) + @ConditionalOnProperty(name = "feign.hystrix.enabled", matchIfMissing = false) static class HystrixEnabled { } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java index 09069962..6f0f9856 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/EnableFeignClientsTests.java @@ -35,7 +35,6 @@ import feign.Feign; import feign.Logger; import feign.codec.Decoder; import feign.codec.Encoder; -import feign.hystrix.HystrixFeign; import feign.slf4j.Slf4jLogger; /** @@ -73,7 +72,7 @@ public class EnableFeignClientsTests { @Test public void builderDefaultCorrect() { - HystrixFeign.Builder.class + Feign.Builder.class .cast(this.feignContext.getInstance("foo", Feign.Builder.class)); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java index 27211ed8..c7021046 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignClientOverrideDefaultsTests.java @@ -121,8 +121,8 @@ public class FeignClientOverrideDefaultsTests { @Test public void overrideBuilder() { - Feign.Builder.class.cast(this.context.getInstance("foo", Feign.Builder.class)); - HystrixFeign.Builder.class + HystrixFeign.Builder.class.cast(this.context.getInstance("foo", Feign.Builder.class)); + Feign.Builder.class .cast(this.context.getInstance("bar", Feign.Builder.class)); } @@ -187,7 +187,7 @@ public class FeignClientOverrideDefaultsTests { @Bean public Feign.Builder feignBuilder() { - return Feign.builder(); + return HystrixFeign.builder(); } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/invalid/FeignClientValidationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/invalid/FeignClientValidationTests.java index bd7d235f..db6ed80c 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/invalid/FeignClientValidationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/invalid/FeignClientValidationTests.java @@ -16,7 +16,10 @@ package org.springframework.cloud.netflix.feign.invalid; +import feign.Feign; import feign.hystrix.FallbackFactory; +import feign.hystrix.HystrixFeign; + import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -128,6 +131,10 @@ public class FeignClientValidationTests { } } + @Bean + public Feign.Builder feignBuilder() { + return HystrixFeign.builder(); + } } @Test @@ -158,6 +165,11 @@ public class FeignClientValidationTests { class Dummy { } + @Bean + public Feign.Builder feignBuilder() { + return HystrixFeign.builder(); + } + } @Test @@ -187,6 +199,11 @@ public class FeignClientValidationTests { return null; } } + + @Bean + public Feign.Builder feignBuilder() { + return HystrixFeign.builder(); + } } @Test @@ -217,6 +234,11 @@ public class FeignClientValidationTests { class Dummy { } + @Bean + public Feign.Builder feignBuilder() { + return HystrixFeign.builder(); + } + } @Test @@ -252,5 +274,10 @@ public class FeignClientValidationTests { } } + @Bean + public Feign.Builder feignBuilder() { + return HystrixFeign.builder(); + } + } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java index d928b28c..6550984b 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/valid/FeignClientTests.java @@ -97,7 +97,8 @@ import rx.Single; @SpringBootTest(classes = FeignClientTests.Application.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { "spring.application.name=feignclienttest", "logging.level.org.springframework.cloud.netflix.feign.valid=DEBUG", - "feign.httpclient.enabled=false", "feign.okhttp.enabled=false" }) + "feign.httpclient.enabled=false", "feign.okhttp.enabled=false", + "feign.hystrix.enabled=true"}) @DirtiesContext public class FeignClientTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java index 6645a905..5f22f975 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/hystrix/security/HystrixSecurityTests.java @@ -40,7 +40,7 @@ import org.springframework.web.client.RestTemplate; */ @RunWith(SpringJUnit4ClassRunner.class) @DirtiesContext -@SpringBootTest(classes = HystrixSecurityApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = "username.ribbon.listOfServers=localhost:${local.server.port}") +@SpringBootTest(classes = HystrixSecurityApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = {"username.ribbon.listOfServers=localhost:${local.server.port}","feign.hystrix.enabled=true"}) public class HystrixSecurityTests { @Autowired private CustomConcurrenyStrategy customConcurrenyStrategy;