diff --git a/docs/src/main/asciidoc/spring-cloud-openfeign.adoc b/docs/src/main/asciidoc/spring-cloud-openfeign.adoc index 76ffcd11..2020df23 100644 --- a/docs/src/main/asciidoc/spring-cloud-openfeign.adoc +++ b/docs/src/main/asciidoc/spring-cloud-openfeign.adoc @@ -15,7 +15,7 @@ To use Feign create an interface and annotate it. It has pluggable annotation support including Feign annotations and JAX-RS annotations. Feign also supports pluggable encoders and decoders. Spring Cloud adds support for Spring MVC annotations and for using the same `HttpMessageConverters` used by default in Spring Web. -Spring Cloud integrates Ribbon and Eureka, as well as Spring Cloud LoadBalancer to provide a load-balanced http client when using Feign. +Spring Cloud integrates Eureka, as well as Spring Cloud LoadBalancer to provide a load-balanced http client when using Feign. [[netflix-feign-starter]] === How to Include Feign @@ -52,7 +52,7 @@ public interface StoreClient { } ---- -In the `@FeignClient` annotation the String value ("stores" above) is an arbitrary client name, which is used to create either a https://github.com/Netflix/ribbon[Ribbon] load-balancer (see <>) or https://github.com/spring-cloud/spring-cloud-commons/blob/master/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/ReactiveLoadBalancer.java[Spring Cloud LoadBalancer]. +In the `@FeignClient` annotation the String value ("stores" above) is an arbitrary client name, which is used to create a https://github.com/spring-cloud/spring-cloud-commons/blob/master/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/client/BlockingLoadBalancerClient.java[Spring Cloud LoadBalancer client]. You can also specify a URL using the `url` attribute (absolute value or just a hostname). The name of the bean in the application context is the fully qualified name of the interface. @@ -63,12 +63,7 @@ The load-balancer client above will want to discover the physical addresses for the "stores" service. If your application is a Eureka client then it will resolve the service in the Eureka service registry. If you don't want to use Eureka, you can simply configure a list of servers -in your external configuration (see -<>). - -WARNING: In order to maintain backward compatibility, is used as the default load-balancer implementation. -However, Spring Cloud Netflix Ribbon is now in maintenance mode, so we recommend using Spring Cloud LoadBalancer instead. -To do this, set the value of `spring.cloud.loadbalancer.ribbon.enabled` to `false`. +in your external configuration. [[spring-cloud-feign-overriding-defaults]] === Overriding Feign Defaults @@ -110,18 +105,16 @@ public interface StoreClient { } ---- -Spring Cloud Netflix provides the following beans by default for feign (`BeanType` beanName: `ClassName`): +Spring Cloud OpenFeign provides the following beans by default for feign (`BeanType` beanName: `ClassName`): * `Decoder` feignDecoder: `ResponseEntityDecoder` (which wraps a `SpringDecoder`) * `Encoder` feignEncoder: `SpringEncoder` * `Logger` feignLogger: `Slf4jLogger` * `Contract` feignContract: `SpringMvcContract` * `Feign.Builder` feignBuilder: `HystrixFeign.Builder` -* `Client` feignClient: if Ribbon is in the classpath and is enabled it is a `LoadBalancerFeignClient`, otherwise if Spring Cloud LoadBalancer is in the classpath, `FeignBlockingLoadBalancerClient` is used. +* `Client` feignClient: if Spring Cloud LoadBalancer is in the classpath, `FeignBlockingLoadBalancerClient` is used. If none of them is in the classpath, the default feign client is used. -NOTE: `spring-cloud-starter-openfeign` contains both `spring-cloud-starter-netflix-ribbon` and `spring-cloud-starter-loadbalancer`. - The OkHttpClient and ApacheHttpClient feign clients can be used by setting `feign.okhttp.enabled` or `feign.httpclient.enabled` to `true`, respectively, and having them on the classpath. You can customize the HTTP client used by providing a bean of either `org.apache.http.impl.client.CloseableHttpClient` when using Apache or `okhttp3.OkHttpClient` when using OK HTTP. diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java index 5468d184..e525ad3d 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignAutoConfiguration.java @@ -89,9 +89,9 @@ public class FeignAutoConfiguration { } // the following configuration is for alternate feign clients if - // ribbon is not on the class path. + // SC loadbalancer is not on the class path. // see corresponding configurations in FeignRibbonClientAutoConfiguration - // for load balanced ribbon clients. + // for load-balanced clients. @Configuration(proxyBeanMethods = false) @ConditionalOnClass(ApacheHttpClient.class) @ConditionalOnMissingBean(CloseableHttpClient.class) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClient.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClient.java index 7d603fb4..d0b4b3f4 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClient.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClient.java @@ -26,9 +26,9 @@ import org.springframework.core.annotation.AliasFor; /** * Annotation for interfaces declaring that a REST client with that interface should be - * created (e.g. for autowiring into another component). If ribbon is available it will be - * used to load balance the backend requests, and the load balancer can be configured - * using the same name (i.e. value) as the feign client. + * created (e.g. for autowiring into another component). If SC LoadBalancer is available + * it will be used to load balance the backend requests, and the load balancer can be + * configured using the same name (i.e. value) as the feign client. * * @author Spencer Gibb * @author Venil Noronha diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java index 8837bfc0..841c92ef 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/FeignClientFactoryBean.java @@ -77,7 +77,7 @@ class FeignClientFactoryBean private Class fallbackFactory = void.class; @Override - public void afterPropertiesSet() throws Exception { + public void afterPropertiesSet() { Assert.hasText(this.contextId, "Context id must be set"); Assert.hasText(this.name, "Name must be set"); } @@ -253,7 +253,7 @@ class FeignClientFactoryBean } throw new IllegalStateException( - "No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?"); + "No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?"); } @Override diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/DefaultFeignLoadBalancerConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/DefaultFeignLoadBalancerConfiguration.java index e148e9ab..fa7e291b 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/DefaultFeignLoadBalancerConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/DefaultFeignLoadBalancerConfiguration.java @@ -19,13 +19,13 @@ package org.springframework.cloud.openfeign.loadbalancer; import feign.Client; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** - * Configuration instantiating a {@link BlockingLoadBalancerClient}-based {@link Client} - * object that uses {@link Client.Default} under the hood. + * Configuration instantiating a {@link LoadBalancerClient}-based {@link Client} object + * that uses {@link Client.Default} under the hood. * * @author Olga Maciaszek-Sharma * @since 2.2.0 @@ -35,7 +35,7 @@ class DefaultFeignLoadBalancerConfiguration { @Bean @ConditionalOnMissingBean - public Client feignClient(BlockingLoadBalancerClient loadBalancerClient) { + public Client feignClient(LoadBalancerClient loadBalancerClient) { return new FeignBlockingLoadBalancerClient(new Client.Default(null, null), loadBalancerClient); } diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java index 85ab8281..3e253e2a 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java @@ -27,13 +27,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.http.HttpStatus; import org.springframework.util.Assert; /** - * A {@link Client} implementation that uses {@link BlockingLoadBalancerClient} to select - * a {@link ServiceInstance} to use while resolving the request host. + * A {@link Client} implementation that uses {@link LoadBalancerClient} to select a + * {@link ServiceInstance} to use while resolving the request host. * * @author Olga Maciaszek-Sharma * @since 2.2.0 @@ -45,10 +45,10 @@ public class FeignBlockingLoadBalancerClient implements Client { private final Client delegate; - private final BlockingLoadBalancerClient loadBalancerClient; + private final LoadBalancerClient loadBalancerClient; public FeignBlockingLoadBalancerClient(Client delegate, - BlockingLoadBalancerClient loadBalancerClient) { + LoadBalancerClient loadBalancerClient) { this.delegate = delegate; this.loadBalancerClient = loadBalancerClient; } diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java index 26eb1a92..940041e8 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignLoadBalancerAutoConfiguration.java @@ -23,23 +23,21 @@ import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.openfeign.FeignAutoConfiguration; import org.springframework.cloud.openfeign.support.FeignHttpClientProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; /** - * An autoconfiguration that instantiates {@link BlockingLoadBalancerClient}-based - * implementations of {@link Client}. In order to use this load-balancing mechanism, the - * Ribbon-based implementation has to be disabled by setting - * spring.cloud.loadbalancer.ribbon.enabled to true. + * An autoconfiguration that instantiates {@link LoadBalancerClient}-based implementations + * of {@link Client}. * * @author Olga Maciaszek-Sharma * @since 2.2.0 */ @ConditionalOnClass(Feign.class) -@ConditionalOnBean(BlockingLoadBalancerClient.class) +@ConditionalOnBean(LoadBalancerClient.class) @AutoConfigureBefore(FeignAutoConfiguration.class) @EnableConfigurationProperties(FeignHttpClientProperties.class) @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/HttpClientFeignLoadBalancerConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/HttpClientFeignLoadBalancerConfiguration.java index b87a05e3..7d3b7b2f 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/HttpClientFeignLoadBalancerConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/HttpClientFeignLoadBalancerConfiguration.java @@ -24,29 +24,29 @@ 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.ConditionalOnProperty; -import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.openfeign.clientconfig.HttpClientFeignConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; /** - * Configuration instantiating a {@link BlockingLoadBalancerClient}-based {@link Client} - * object that uses {@link ApacheHttpClient} under the hood. + * Configuration instantiating a {@link LoadBalancerClient}-based {@link Client} object + * that uses {@link ApacheHttpClient} under the hood. * * @author Olga Maciaszek-Sharma * @since 2.2.0 */ @Configuration(proxyBeanMethods = false) @ConditionalOnClass(ApacheHttpClient.class) -@ConditionalOnBean(BlockingLoadBalancerClient.class) +@ConditionalOnBean(LoadBalancerClient.class) @ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true) @Import(HttpClientFeignConfiguration.class) class HttpClientFeignLoadBalancerConfiguration { @Bean @ConditionalOnMissingBean - public Client feignClient(BlockingLoadBalancerClient loadBalancerClient, + public Client feignClient(LoadBalancerClient loadBalancerClient, HttpClient httpClient) { ApacheHttpClient delegate = new ApacheHttpClient(httpClient); return new FeignBlockingLoadBalancerClient(delegate, loadBalancerClient); diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/OkHttpFeignLoadBalancerConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/OkHttpFeignLoadBalancerConfiguration.java index bbf12495..d7ff6140 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/OkHttpFeignLoadBalancerConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/OkHttpFeignLoadBalancerConfiguration.java @@ -23,15 +23,15 @@ 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.ConditionalOnProperty; -import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.openfeign.clientconfig.OkHttpFeignConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; /** - * Configuration instantiating a {@link BlockingLoadBalancerClient}-based {@link Client} - * object that uses {@link OkHttpClient} under the hood. + * Configuration instantiating a {@link LoadBalancerClient}-based {@link Client} object + * that uses {@link OkHttpClient} under the hood. * * @author Olga Maciaszek-Sharma * @since 2.2.0 @@ -39,14 +39,14 @@ import org.springframework.context.annotation.Import; @Configuration(proxyBeanMethods = false) @ConditionalOnClass(OkHttpClient.class) @ConditionalOnProperty("feign.okhttp.enabled") -@ConditionalOnBean(BlockingLoadBalancerClient.class) +@ConditionalOnBean(LoadBalancerClient.class) @Import(OkHttpFeignConfiguration.class) class OkHttpFeignLoadBalancerConfiguration { @Bean @ConditionalOnMissingBean public Client feignClient(okhttp3.OkHttpClient okHttpClient, - BlockingLoadBalancerClient loadBalancerClient) { + LoadBalancerClient loadBalancerClient) { OkHttpClient delegate = new OkHttpClient(okHttpClient); return new FeignBlockingLoadBalancerClient(delegate, loadBalancerClient); } diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml index 0204a3ed..e88c69ce 100644 --- a/src/checkstyle/checkstyle-suppressions.xml +++ b/src/checkstyle/checkstyle-suppressions.xml @@ -5,8 +5,6 @@ - -