diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java index 4393ea3c..44f1ec7b 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java @@ -45,8 +45,6 @@ import feign.httpclient.ApacheHttpClient; import feign.okhttp.OkHttpClient; import javax.annotation.PreDestroy; -import com.netflix.client.config.CommonClientConfigKey; -import com.netflix.client.config.DefaultClientConfigImpl; /** * @author Spencer Gibb @@ -54,7 +52,7 @@ import com.netflix.client.config.DefaultClientConfigImpl; */ @Configuration @ConditionalOnClass(Feign.class) -@EnableConfigurationProperties({FeignHttpClientProperties.class}) +@EnableConfigurationProperties({ FeignHttpClientProperties.class }) public class FeignAutoConfiguration { @Autowired(required = false) @@ -110,12 +108,14 @@ public class FeignAutoConfiguration { private CloseableHttpClient httpClient; @Bean - public HttpClientConnectionManager connectionManager(ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - FeignHttpClientProperties httpClientProperties) { - final HttpClientConnectionManager connectionManager = connectionManagerFactory.newConnectionManager(false, httpClientProperties.getMaxConnections(), - httpClientProperties.getMaxConnectionsPerRoute(), httpClientProperties.getTimeToLive(), - httpClientProperties.getTimeToLiveUnit(), - registryBuilder); + public HttpClientConnectionManager connectionManager( + ApacheHttpClientConnectionManagerFactory connectionManagerFactory, + FeignHttpClientProperties httpClientProperties) { + final HttpClientConnectionManager connectionManager = connectionManagerFactory + .newConnectionManager(false, httpClientProperties.getMaxConnections(), + httpClientProperties.getMaxConnectionsPerRoute(), + httpClientProperties.getTimeToLive(), + httpClientProperties.getTimeToLiveUnit(), registryBuilder); this.connectionManagerTimer.schedule(new TimerTask() { @Override public void run() { @@ -126,13 +126,15 @@ public class FeignAutoConfiguration { } @Bean - public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, HttpClientConnectionManager httpClientConnectionManager, - FeignHttpClientProperties httpClientProperties) { - RequestConfig defaultRequestConfig = RequestConfig.custom(). - setConnectTimeout(httpClientProperties.getConnectionTimeout()). - setRedirectsEnabled(httpClientProperties.isFollowRedirects()). - build(); - this.httpClient = httpClientFactory.createClient(defaultRequestConfig, httpClientConnectionManager); + public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, + HttpClientConnectionManager httpClientConnectionManager, + FeignHttpClientProperties httpClientProperties) { + RequestConfig defaultRequestConfig = RequestConfig.custom() + .setConnectTimeout(httpClientProperties.getConnectionTimeout()) + .setRedirectsEnabled(httpClientProperties.isFollowRedirects()) + .build(); + this.httpClient = httpClientFactory.createClient(defaultRequestConfig, + httpClientConnectionManager); return this.httpClient; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientAutoConfiguration.java index 137e6440..da4baaf4 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientAutoConfiguration.java @@ -59,7 +59,7 @@ import javax.annotation.PreDestroy; @ConditionalOnClass({ ILoadBalancer.class, Feign.class }) @Configuration @AutoConfigureBefore(FeignAutoConfiguration.class) -@EnableConfigurationProperties({FeignHttpClientProperties.class}) +@EnableConfigurationProperties({ FeignHttpClientProperties.class }) public class FeignRibbonClientAutoConfiguration { @Bean @@ -74,7 +74,8 @@ public class FeignRibbonClientAutoConfiguration { @Primary @ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate") public CachingSpringLoadBalancerFactory retryabeCachingLBClientFactory( - SpringClientFactory factory, LoadBalancedRetryPolicyFactory retryPolicyFactory) { + SpringClientFactory factory, + LoadBalancedRetryPolicyFactory retryPolicyFactory) { return new CachingSpringLoadBalancerFactory(factory, retryPolicyFactory, true); } @@ -82,8 +83,8 @@ public class FeignRibbonClientAutoConfiguration { @ConditionalOnMissingBean public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, SpringClientFactory clientFactory) { - return new LoadBalancerFeignClient(new Client.Default(null, null), - cachingFactory, clientFactory); + return new LoadBalancerFeignClient(new Client.Default(null, null), cachingFactory, + clientFactory); } @Bean @@ -106,12 +107,14 @@ public class FeignRibbonClientAutoConfiguration { private RegistryBuilder registryBuilder; @Bean - public HttpClientConnectionManager connectionManager(ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - FeignHttpClientProperties httpClientProperties) { - final HttpClientConnectionManager connectionManager = connectionManagerFactory.newConnectionManager(false, httpClientProperties.getMaxConnections(), - httpClientProperties.getMaxConnectionsPerRoute(), httpClientProperties.getTimeToLive(), - httpClientProperties.getTimeToLiveUnit(), - registryBuilder); + public HttpClientConnectionManager connectionManager( + ApacheHttpClientConnectionManagerFactory connectionManagerFactory, + FeignHttpClientProperties httpClientProperties) { + final HttpClientConnectionManager connectionManager = connectionManagerFactory + .newConnectionManager(false, httpClientProperties.getMaxConnections(), + httpClientProperties.getMaxConnectionsPerRoute(), + httpClientProperties.getTimeToLive(), + httpClientProperties.getTimeToLiveUnit(), registryBuilder); this.connectionManagerTimer.schedule(new TimerTask() { @Override public void run() { @@ -122,13 +125,15 @@ public class FeignRibbonClientAutoConfiguration { } @Bean - public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, HttpClientConnectionManager httpClientConnectionManager, - FeignHttpClientProperties httpClientProperties) { - RequestConfig defaultRequestConfig = RequestConfig.custom(). - setConnectTimeout(httpClientProperties.getConnectionTimeout()). - setRedirectsEnabled(httpClientProperties.isFollowRedirects()). - build(); - this.httpClient = httpClientFactory.createClient(defaultRequestConfig, httpClientConnectionManager); + public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, + HttpClientConnectionManager httpClientConnectionManager, + FeignHttpClientProperties httpClientProperties) { + RequestConfig defaultRequestConfig = RequestConfig.custom() + .setConnectTimeout(httpClientProperties.getConnectionTimeout()) + .setRedirectsEnabled(httpClientProperties.isFollowRedirects()) + .build(); + this.httpClient = httpClientFactory.createClient(defaultRequestConfig, + httpClientConnectionManager); return this.httpClient; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java index cb1bcf38..8e8b4ba1 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java @@ -146,26 +146,33 @@ public class RibbonClientConfiguration { private RegistryBuilder registryBuilder; @Bean - public HttpClientConnectionManager httpClientConnectionManager(IClientConfig config, - ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - ApacheHttpClientFactory httpClientFactory) { - Integer maxTotalConnections = config.getPropertyAsInteger(CommonClientConfigKey.MaxTotalConnections, + public HttpClientConnectionManager httpClientConnectionManager( + IClientConfig config, + ApacheHttpClientConnectionManagerFactory connectionManagerFactory, + ApacheHttpClientFactory httpClientFactory) { + Integer maxTotalConnections = config.getPropertyAsInteger( + CommonClientConfigKey.MaxTotalConnections, DefaultClientConfigImpl.DEFAULT_MAX_TOTAL_CONNECTIONS); - Integer maxConnectionsPerHost = config.getPropertyAsInteger(CommonClientConfigKey.MaxConnectionsPerHost, + Integer maxConnectionsPerHost = config.getPropertyAsInteger( + CommonClientConfigKey.MaxConnectionsPerHost, DefaultClientConfigImpl.DEFAULT_MAX_CONNECTIONS_PER_HOST); - Integer timerRepeat = config.getPropertyAsInteger(CommonClientConfigKey.ConnectionCleanerRepeatInterval, + Integer timerRepeat = config.getPropertyAsInteger( + CommonClientConfigKey.ConnectionCleanerRepeatInterval, DefaultClientConfigImpl.DEFAULT_CONNECTION_IDLE_TIMERTASK_REPEAT_IN_MSECS); - Object timeToLiveObj = config.getProperty(CommonClientConfigKey.PoolKeepAliveTime); + Object timeToLiveObj = config + .getProperty(CommonClientConfigKey.PoolKeepAliveTime); Long timeToLive = DefaultClientConfigImpl.DEFAULT_POOL_KEEP_ALIVE_TIME; - Object ttlUnitObj = config.getProperty(CommonClientConfigKey.PoolKeepAliveTimeUnits); + Object ttlUnitObj = config + .getProperty(CommonClientConfigKey.PoolKeepAliveTimeUnits); TimeUnit ttlUnit = DefaultClientConfigImpl.DEFAULT_POOL_KEEP_ALIVE_TIME_UNITS; - if(timeToLiveObj instanceof Long) { - timeToLive = (Long)timeToLiveObj; + if (timeToLiveObj instanceof Long) { + timeToLive = (Long) timeToLiveObj; } - if(ttlUnitObj instanceof TimeUnit) { - ttlUnit = (TimeUnit)ttlUnitObj; + if (ttlUnitObj instanceof TimeUnit) { + ttlUnit = (TimeUnit) ttlUnitObj; } - final HttpClientConnectionManager connectionManager = connectionManagerFactory.newConnectionManager(false, maxTotalConnections, + final HttpClientConnectionManager connectionManager = connectionManagerFactory + .newConnectionManager(false, maxTotalConnections, maxConnectionsPerHost, timeToLive, ttlUnit, registryBuilder); this.connectionManagerTimer.schedule(new TimerTask() { @Override @@ -178,18 +185,18 @@ public class RibbonClientConfiguration { @Bean public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, - HttpClientConnectionManager connectionManager, IClientConfig config) { + HttpClientConnectionManager connectionManager, IClientConfig config) { Boolean followRedirects = config.getPropertyAsBoolean( CommonClientConfigKey.FollowRedirects, DefaultClientConfigImpl.DEFAULT_FOLLOW_REDIRECTS); Integer connectTimeout = config.getPropertyAsInteger( CommonClientConfigKey.ConnectTimeout, DefaultClientConfigImpl.DEFAULT_CONNECT_TIMEOUT); - RequestConfig defaultRequestConfig = RequestConfig.custom(). - setConnectTimeout(connectTimeout). - setRedirectsEnabled(followRedirects). - build(); - this.httpClient = httpClientFactory.createClient(defaultRequestConfig, connectionManager); + RequestConfig defaultRequestConfig = RequestConfig.custom() + .setConnectTimeout(connectTimeout) + .setRedirectsEnabled(followRedirects).build(); + this.httpClient = httpClientFactory.createClient(defaultRequestConfig, + connectionManager); return httpClient; } @@ -211,9 +218,10 @@ public class RibbonClientConfiguration { @ConditionalOnMissingClass(value = "org.springframework.retry.support.RetryTemplate") public RibbonLoadBalancingHttpClient ribbonLoadBalancingHttpClient( IClientConfig config, ServerIntrospector serverIntrospector, - ILoadBalancer loadBalancer, RetryHandler retryHandler, CloseableHttpClient httpClient) { - RibbonLoadBalancingHttpClient client = new RibbonLoadBalancingHttpClient(httpClient, - config, serverIntrospector); + ILoadBalancer loadBalancer, RetryHandler retryHandler, + CloseableHttpClient httpClient) { + RibbonLoadBalancingHttpClient client = new RibbonLoadBalancingHttpClient( + httpClient, config, serverIntrospector); client.setLoadBalancer(loadBalancer); client.setRetryHandler(retryHandler); Monitors.registerObject("Client_" + this.name, client); @@ -228,8 +236,9 @@ public class RibbonClientConfiguration { ILoadBalancer loadBalancer, RetryHandler retryHandler, LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory, CloseableHttpClient httpClient) { - RetryableRibbonLoadBalancingHttpClient client = new RetryableRibbonLoadBalancingHttpClient(httpClient, - config, serverIntrospector, loadBalancedRetryPolicyFactory); + RetryableRibbonLoadBalancingHttpClient client = new RetryableRibbonLoadBalancingHttpClient( + httpClient, config, serverIntrospector, + loadBalancedRetryPolicyFactory); client.setLoadBalancer(loadBalancer); client.setRetryHandler(retryHandler); Monitors.registerObject("Client_" + this.name, client); @@ -244,18 +253,15 @@ public class RibbonClientConfiguration { @Value("${ribbon.client.name}") private String name = "client"; - - @Bean @ConditionalOnMissingBean(AbstractLoadBalancerAwareClient.class) @ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate") - public RetryableOkHttpLoadBalancingClient okHttpLoadBalancingClient(IClientConfig config, - ServerIntrospector serverIntrospector, - ILoadBalancer loadBalancer, - RetryHandler retryHandler, - LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory) { - RetryableOkHttpLoadBalancingClient client = new RetryableOkHttpLoadBalancingClient(config, - serverIntrospector, loadBalancedRetryPolicyFactory); + public RetryableOkHttpLoadBalancingClient okHttpLoadBalancingClient( + IClientConfig config, ServerIntrospector serverIntrospector, + ILoadBalancer loadBalancer, RetryHandler retryHandler, + LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory) { + RetryableOkHttpLoadBalancingClient client = new RetryableOkHttpLoadBalancingClient( + config, serverIntrospector, loadBalancedRetryPolicyFactory); client.setLoadBalancer(loadBalancer); client.setRetryHandler(retryHandler); Monitors.registerObject("Client_" + this.name, client); @@ -265,9 +271,9 @@ public class RibbonClientConfiguration { @Bean @ConditionalOnMissingBean(AbstractLoadBalancerAwareClient.class) @ConditionalOnMissingClass(value = "org.springframework.retry.support.RetryTemplate") - public OkHttpLoadBalancingClient retryableOkHttpLoadBalancingClient(IClientConfig config, - ServerIntrospector serverIntrospector, ILoadBalancer loadBalancer, - RetryHandler retryHandler) { + public OkHttpLoadBalancingClient retryableOkHttpLoadBalancingClient( + IClientConfig config, ServerIntrospector serverIntrospector, + ILoadBalancer loadBalancer, RetryHandler retryHandler) { OkHttpLoadBalancingClient client = new OkHttpLoadBalancingClient(config, serverIntrospector); client.setLoadBalancer(loadBalancer); @@ -284,21 +290,23 @@ public class RibbonClientConfiguration { private String name = "client"; /** - * Create a Netflix {@link RestClient} integrated with Ribbon if none already exists - * in the application context. It is not required for Ribbon to work properly and is - * therefore created lazily if ever another component requires it. + * Create a Netflix {@link RestClient} integrated with Ribbon if none already + * exists in the application context. It is not required for Ribbon to work + * properly and is therefore created lazily if ever another component requires it. * - * @param config the configuration to use by the underlying Ribbon instance - * @param loadBalancer the load balancer to use by the underlying Ribbon instance - * @param serverIntrospector server introspector to use by the underlying Ribbon instance - * @param retryHandler retry handler to use by the underlying Ribbon instance + * @param config the configuration to use by the underlying Ribbon instance + * @param loadBalancer the load balancer to use by the underlying Ribbon instance + * @param serverIntrospector server introspector to use by the underlying Ribbon + * instance + * @param retryHandler retry handler to use by the underlying Ribbon instance * @return a {@link RestClient} instances backed by Ribbon */ @Bean @Lazy @ConditionalOnMissingBean(AbstractLoadBalancerAwareClient.class) - public RestClient ribbonRestClient(IClientConfig config, ILoadBalancer loadBalancer, - ServerIntrospector serverIntrospector, RetryHandler retryHandler) { + public RestClient ribbonRestClient(IClientConfig config, + ILoadBalancer loadBalancer, ServerIntrospector serverIntrospector, + RetryHandler retryHandler) { RestClient client = new OverrideRestClient(config, serverIntrospector); client.setLoadBalancer(loadBalancer); client.setRetryHandler(retryHandler); @@ -339,8 +347,8 @@ public class RibbonClientConfiguration { @Bean @ConditionalOnMissingBean - public RibbonLoadBalancerContext ribbonLoadBalancerContext( - ILoadBalancer loadBalancer, IClientConfig config, RetryHandler retryHandler) { + public RibbonLoadBalancerContext ribbonLoadBalancerContext(ILoadBalancer loadBalancer, + IClientConfig config, RetryHandler retryHandler) { return new RibbonLoadBalancerContext(loadBalancer, config, retryHandler); } @@ -349,7 +357,7 @@ public class RibbonClientConfiguration { public RetryHandler retryHandler(IClientConfig config) { return new DefaultLoadBalancerRetryHandler(config); } - + @Bean @ConditionalOnMissingBean public ServerIntrospector serverIntrospector() { @@ -376,18 +384,16 @@ public class RibbonClientConfiguration { @Override public URI reconstructURIWithServer(Server server, URI original) { - URI uri = updateToHttpsIfNeeded(original, this.config, this.serverIntrospector, server); + URI uri = updateToHttpsIfNeeded(original, this.config, + this.serverIntrospector, server); return super.reconstructURIWithServer(server, uri); } @Override protected Client apacheHttpClientSpecificInitialization() { - ApacheHttpClient4 apache = (ApacheHttpClient4) super - .apacheHttpClientSpecificInitialization(); - apache.getClientHandler() - .getHttpClient() - .getParams() - .setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES); + ApacheHttpClient4 apache = (ApacheHttpClient4) super.apacheHttpClientSpecificInitialization(); + apache.getClientHandler().getHttpClient().getParams().setParameter( + ClientPNames.COOKIE_POLICY, CookiePolicy.IGNORE_COOKIES); return apache; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java index c17855fc..769c75bc 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java @@ -48,75 +48,94 @@ import com.netflix.loadbalancer.Server; * An Apache HTTP client which leverages Spring Retry to retry failed requests. * @author Ryan Baxter */ -public class RetryableRibbonLoadBalancingHttpClient extends RibbonLoadBalancingHttpClient implements ServiceInstanceChooser { - private LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory = - new LoadBalancedRetryPolicyFactory.NeverRetryFactory(); +public class RetryableRibbonLoadBalancingHttpClient extends RibbonLoadBalancingHttpClient + implements ServiceInstanceChooser { + private LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory = new LoadBalancedRetryPolicyFactory.NeverRetryFactory(); - public RetryableRibbonLoadBalancingHttpClient(IClientConfig config, ServerIntrospector serverIntrospector, - LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory) { + public RetryableRibbonLoadBalancingHttpClient(IClientConfig config, + ServerIntrospector serverIntrospector, + LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory) { super(config, serverIntrospector); this.loadBalancedRetryPolicyFactory = loadBalancedRetryPolicyFactory; } - public RetryableRibbonLoadBalancingHttpClient(CloseableHttpClient delegate, IClientConfig config, ServerIntrospector serverIntrospector, - LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory) { + + public RetryableRibbonLoadBalancingHttpClient(CloseableHttpClient delegate, + IClientConfig config, ServerIntrospector serverIntrospector, + LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory) { super(delegate, config, serverIntrospector); this.loadBalancedRetryPolicyFactory = loadBalancedRetryPolicyFactory; } @Override - public RibbonApacheHttpResponse execute(final RibbonApacheHttpRequest request, final IClientConfig configOverride) throws Exception { + public RibbonApacheHttpResponse execute(final RibbonApacheHttpRequest request, + final IClientConfig configOverride) throws Exception { final RequestConfig.Builder builder = RequestConfig.custom(); IClientConfig config = configOverride != null ? configOverride : this.config; - builder.setConnectTimeout(config.get( - CommonClientConfigKey.ConnectTimeout, this.connectTimeout)); - builder.setSocketTimeout(config.get( - CommonClientConfigKey.ReadTimeout, this.readTimeout)); - builder.setRedirectsEnabled(config.get( - CommonClientConfigKey.FollowRedirects, this.followRedirects)); + builder.setConnectTimeout( + config.get(CommonClientConfigKey.ConnectTimeout, this.connectTimeout)); + builder.setSocketTimeout( + config.get(CommonClientConfigKey.ReadTimeout, this.readTimeout)); + builder.setRedirectsEnabled( + config.get(CommonClientConfigKey.FollowRedirects, this.followRedirects)); final RequestConfig requestConfig = builder.build(); - final LoadBalancedRetryPolicy retryPolicy = loadBalancedRetryPolicyFactory.create(this.getClientName(), this); + final LoadBalancedRetryPolicy retryPolicy = loadBalancedRetryPolicyFactory + .create(this.getClientName(), this); RetryCallback retryCallback = new RetryCallback() { @Override - public RibbonApacheHttpResponse doWithRetry(RetryContext context) throws Exception { - //on retries the policy will choose the server and set it in the context - //extract the server and update the request being made + public RibbonApacheHttpResponse doWithRetry(RetryContext context) + throws Exception { + // on retries the policy will choose the server and set it in the context + // extract the server and update the request being made RibbonApacheHttpRequest newRequest = request; - if(context instanceof LoadBalancedRetryContext) { - ServiceInstance service = ((LoadBalancedRetryContext)context).getServiceInstance(); - if(service != null) { - //Reconstruct the request URI using the host and port set in the retry context - newRequest = newRequest.withNewUri(new URI(service.getUri().getScheme(), - newRequest.getURI().getUserInfo(), service.getHost(), service.getPort(), - newRequest.getURI().getPath(), newRequest.getURI().getQuery(), + if (context instanceof LoadBalancedRetryContext) { + ServiceInstance service = ((LoadBalancedRetryContext) context) + .getServiceInstance(); + if (service != null) { + // Reconstruct the request URI using the host and port set in the + // retry context + newRequest = newRequest.withNewUri(new URI( + service.getUri().getScheme(), + newRequest.getURI().getUserInfo(), service.getHost(), + service.getPort(), newRequest.getURI().getPath(), + newRequest.getURI().getQuery(), newRequest.getURI().getFragment())); } } if (isSecure(configOverride)) { - final URI secureUri = UriComponentsBuilder.fromUri(newRequest.getUri()) - .scheme("https").build().toUri(); + final URI secureUri = UriComponentsBuilder + .fromUri(newRequest.getUri()).scheme("https").build().toUri(); newRequest = newRequest.withNewUri(secureUri); } HttpUriRequest httpUriRequest = newRequest.toRequest(requestConfig); - final HttpResponse httpResponse = RetryableRibbonLoadBalancingHttpClient.this.delegate.execute(httpUriRequest); - if(retryPolicy.retryableStatusCode(httpResponse.getStatusLine().getStatusCode())) { - if(CloseableHttpResponse.class.isInstance(httpResponse)) { - ((CloseableHttpResponse)httpResponse).close(); + final HttpResponse httpResponse = RetryableRibbonLoadBalancingHttpClient.this.delegate + .execute(httpUriRequest); + if (retryPolicy.retryableStatusCode( + httpResponse.getStatusLine().getStatusCode())) { + if (CloseableHttpResponse.class.isInstance(httpResponse)) { + ((CloseableHttpResponse) httpResponse).close(); } - throw new RetryableStatusCodeException(RetryableRibbonLoadBalancingHttpClient.this.clientName, + throw new RetryableStatusCodeException( + RetryableRibbonLoadBalancingHttpClient.this.clientName, httpResponse.getStatusLine().getStatusCode()); } - return new RibbonApacheHttpResponse(httpResponse, httpUriRequest.getURI()); + return new RibbonApacheHttpResponse(httpResponse, + httpUriRequest.getURI()); } }; return this.executeWithRetry(request, retryPolicy, retryCallback); } - private RibbonApacheHttpResponse executeWithRetry(RibbonApacheHttpRequest request, LoadBalancedRetryPolicy retryPolicy, RetryCallback callback) throws Exception { + private RibbonApacheHttpResponse executeWithRetry(RibbonApacheHttpRequest request, + LoadBalancedRetryPolicy retryPolicy, + RetryCallback callback) + throws Exception { RetryTemplate retryTemplate = new RetryTemplate(); - boolean retryable = request.getContext() == null ? true : - BooleanUtils.toBooleanDefaultIfNull(request.getContext().getRetryable(), true); - retryTemplate.setRetryPolicy(retryPolicy == null || !retryable ? new NeverRetryPolicy() + boolean retryable = request.getContext() == null ? true + : BooleanUtils.toBooleanDefaultIfNull(request.getContext().getRetryable(), + true); + retryTemplate.setRetryPolicy(retryPolicy == null || !retryable + ? new NeverRetryPolicy() : new RetryPolicy(request, retryPolicy, this, this.getClientName())); return retryTemplate.execute(callback); } @@ -124,17 +143,18 @@ public class RetryableRibbonLoadBalancingHttpClient extends RibbonLoadBalancingH @Override public ServiceInstance choose(String serviceId) { Server server = this.getLoadBalancer().chooseServer(serviceId); - return new RibbonLoadBalancerClient.RibbonServer(serviceId, - server); + return new RibbonLoadBalancerClient.RibbonServer(serviceId, server); } @Override - public RequestSpecificRetryHandler getRequestSpecificRetryHandler(RibbonApacheHttpRequest request, IClientConfig requestConfig) { + public RequestSpecificRetryHandler getRequestSpecificRetryHandler( + RibbonApacheHttpRequest request, IClientConfig requestConfig) { return new RequestSpecificRetryHandler(false, false, RetryHandler.DEFAULT, null); } static class RetryPolicy extends FeignRetryPolicy { - public RetryPolicy(HttpRequest request, LoadBalancedRetryPolicy policy, ServiceInstanceChooser serviceInstanceChooser, String serviceName) { + public RetryPolicy(HttpRequest request, LoadBalancedRetryPolicy policy, + ServiceInstanceChooser serviceInstanceChooser, String serviceName) { super(request, policy, serviceInstanceChooser, serviceName); } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java index 008d09ec..17eaa9af 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClient.java @@ -38,26 +38,29 @@ import static org.springframework.cloud.netflix.ribbon.RibbonUtils.updateToHttps * @author Christian Lohmann * @author Ryan Baxter */ -//TODO: rename (ie new class that extends this in Dalston) to ApacheHttpLoadBalancingClient +// TODO: rename (ie new class that extends this in Dalston) to ApacheHttpLoadBalancingClient public class RibbonLoadBalancingHttpClient extends AbstractLoadBalancingClient { - public RibbonLoadBalancingHttpClient(IClientConfig config, ServerIntrospector serverIntrospector) { + public RibbonLoadBalancingHttpClient(IClientConfig config, + ServerIntrospector serverIntrospector) { super(config, serverIntrospector); } - public RibbonLoadBalancingHttpClient(CloseableHttpClient delegate, IClientConfig config, ServerIntrospector serverIntrospector) { + public RibbonLoadBalancingHttpClient(CloseableHttpClient delegate, + IClientConfig config, ServerIntrospector serverIntrospector) { super(delegate, config, serverIntrospector); } protected CloseableHttpClient createDelegate(IClientConfig config) { return HttpClientBuilder.create() // already defaults to 0 in builder, so resetting to 0 won't hurt - .setMaxConnTotal(config.getPropertyAsInteger(CommonClientConfigKey.MaxTotalConnections, 0)) + .setMaxConnTotal(config.getPropertyAsInteger( + CommonClientConfigKey.MaxTotalConnections, 0)) // already defaults to 0 in builder, so resetting to 0 won't hurt - .setMaxConnPerRoute(config.getPropertyAsInteger(CommonClientConfigKey.MaxConnectionsPerHost, 0)) - .disableCookieManagement() - .useSystemProperties() // for proxy + .setMaxConnPerRoute(config.getPropertyAsInteger( + CommonClientConfigKey.MaxConnectionsPerHost, 0)) + .disableCookieManagement().useSystemProperties() // for proxy .build(); } @@ -66,12 +69,12 @@ public class RibbonLoadBalancingHttpClient extends final IClientConfig configOverride) throws Exception { final RequestConfig.Builder builder = RequestConfig.custom(); IClientConfig config = configOverride != null ? configOverride : this.config; - builder.setConnectTimeout(config.get( - CommonClientConfigKey.ConnectTimeout, this.connectTimeout)); - builder.setSocketTimeout(config.get( - CommonClientConfigKey.ReadTimeout, this.readTimeout)); - builder.setRedirectsEnabled(config.get( - CommonClientConfigKey.FollowRedirects, this.followRedirects)); + builder.setConnectTimeout( + config.get(CommonClientConfigKey.ConnectTimeout, this.connectTimeout)); + builder.setSocketTimeout( + config.get(CommonClientConfigKey.ReadTimeout, this.readTimeout)); + builder.setRedirectsEnabled( + config.get(CommonClientConfigKey.FollowRedirects, this.followRedirects)); final RequestConfig requestConfig = builder.build(); if (isSecure(configOverride)) { @@ -86,13 +89,15 @@ public class RibbonLoadBalancingHttpClient extends @Override public URI reconstructURIWithServer(Server server, URI original) { - URI uri = updateToHttpsIfNeeded(original, this.config, this.serverIntrospector, server); + URI uri = updateToHttpsIfNeeded(original, this.config, this.serverIntrospector, + server); return super.reconstructURIWithServer(server, uri); } @Override - public RequestSpecificRetryHandler getRequestSpecificRetryHandler(RibbonApacheHttpRequest request, IClientConfig requestConfig) { - return new RequestSpecificRetryHandler(false, false, - RetryHandler.DEFAULT, requestConfig); + public RequestSpecificRetryHandler getRequestSpecificRetryHandler( + RibbonApacheHttpRequest request, IClientConfig requestConfig) { + return new RequestSpecificRetryHandler(false, false, RetryHandler.DEFAULT, + requestConfig); } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java index 82f47439..42e1853b 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java @@ -63,7 +63,7 @@ import org.springframework.context.annotation.Import; @Import({ RibbonCommandFactoryConfiguration.RestClientRibbonConfiguration.class, RibbonCommandFactoryConfiguration.OkHttpRibbonConfiguration.class, RibbonCommandFactoryConfiguration.HttpClientRibbonConfiguration.class, - HttpClientConfiguration.class}) + HttpClientConfiguration.class }) @ConditionalOnBean(ZuulProxyMarkerConfiguration.Marker.class) public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @@ -79,37 +79,42 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @Override public HasFeatures zuulFeature() { - return HasFeatures.namedFeature("Zuul (Discovery)", ZuulProxyAutoConfiguration.class); + return HasFeatures.namedFeature("Zuul (Discovery)", + ZuulProxyAutoConfiguration.class); } @Bean @ConditionalOnMissingBean(DiscoveryClientRouteLocator.class) public DiscoveryClientRouteLocator discoveryRouteLocator() { - return new DiscoveryClientRouteLocator(this.server.getServletPrefix(), this.discovery, this.zuulProperties, - this.serviceRouteMapper); + return new DiscoveryClientRouteLocator(this.server.getServletPrefix(), + this.discovery, this.zuulProperties, this.serviceRouteMapper); } // pre filters @Bean - public PreDecorationFilter preDecorationFilter(RouteLocator routeLocator, ProxyRequestHelper proxyRequestHelper) { - return new PreDecorationFilter(routeLocator, this.server.getServletPrefix(), this.zuulProperties, - proxyRequestHelper); + public PreDecorationFilter preDecorationFilter(RouteLocator routeLocator, + ProxyRequestHelper proxyRequestHelper) { + return new PreDecorationFilter(routeLocator, this.server.getServletPrefix(), + this.zuulProperties, proxyRequestHelper); } // route filters @Bean public RibbonRoutingFilter ribbonRoutingFilter(ProxyRequestHelper helper, RibbonCommandFactory ribbonCommandFactory) { - RibbonRoutingFilter filter = new RibbonRoutingFilter(helper, ribbonCommandFactory, this.requestCustomizers); + RibbonRoutingFilter filter = new RibbonRoutingFilter(helper, ribbonCommandFactory, + this.requestCustomizers); return filter; } @Bean @ConditionalOnMissingBean(SimpleHostRoutingFilter.class) - public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties zuulProperties, - ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - ApacheHttpClientFactory httpClientFactory) { - return new SimpleHostRoutingFilter(helper, zuulProperties, connectionManagerFactory, httpClientFactory); + public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, + ZuulProperties zuulProperties, + ApacheHttpClientConnectionManagerFactory connectionManagerFactory, + ApacheHttpClientFactory httpClientFactory) { + return new SimpleHostRoutingFilter(helper, zuulProperties, + connectionManagerFactory, httpClientFactory); } @Bean @@ -150,7 +155,8 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { } @Bean - public RoutesMvcEndpoint zuulMvcEndpoint(RouteLocator routeLocator, RoutesEndpoint endpoint) { + public RoutesMvcEndpoint zuulMvcEndpoint(RouteLocator routeLocator, + RoutesEndpoint endpoint) { return new RoutesMvcEndpoint(endpoint, routeLocator); } @@ -166,7 +172,8 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { } } - private static class ZuulDiscoveryRefreshListener implements ApplicationListener { + private static class ZuulDiscoveryRefreshListener + implements ApplicationListener { private HeartbeatMonitor monitor = new HeartbeatMonitor(); diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java index f1173205..baee16dd 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java @@ -67,8 +67,8 @@ import static org.springframework.cloud.netflix.zuul.filters.support.FilterConst import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SIMPLE_HOST_ROUTING_FILTER_ORDER; /** - * Route {@link ZuulFilter} that sends requests to predetermined URLs via apache {@link HttpClient}. - * URLs are found in {@link RequestContext#getRouteHost()}. + * Route {@link ZuulFilter} that sends requests to predetermined URLs via apache + * {@link HttpClient}. URLs are found in {@link RequestContext#getRouteHost()}. * * @author Spencer Gibb * @author Dave Syer @@ -114,8 +114,8 @@ public class SimpleHostRoutingFilter extends ZuulFilter { } public SimpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties properties, - ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - ApacheHttpClientFactory httpClientFactory) { + ApacheHttpClientConnectionManagerFactory connectionManagerFactory, + ApacheHttpClientFactory httpClientFactory) { this.helper = helper; this.hostProperties = properties.getHost(); this.sslHostnameValidationEnabled = properties.isSslHostnameValidationEnabled(); @@ -127,9 +127,12 @@ public class SimpleHostRoutingFilter extends ZuulFilter { @PostConstruct private void initialize() { - this.connectionManager = connectionManagerFactory.newConnectionManager(this.sslHostnameValidationEnabled, - this.hostProperties.getMaxTotalConnections(), this.hostProperties.getMaxPerRouteConnections(), - this.hostProperties.getTimeToLive(), this.hostProperties.getTimeUnit(), null); + this.connectionManager = connectionManagerFactory.newConnectionManager( + this.sslHostnameValidationEnabled, + this.hostProperties.getMaxTotalConnections(), + this.hostProperties.getMaxPerRouteConnections(), + this.hostProperties.getTimeToLive(), this.hostProperties.getTimeUnit(), + null); this.httpClient = newClient(); this.connectionManagerTimer.schedule(new TimerTask() { @Override @@ -220,9 +223,11 @@ public class SimpleHostRoutingFilter extends ZuulFilter { contentType = ContentType.parse(request.getContentType()); } - InputStreamEntity entity = new InputStreamEntity(requestEntity, contentLength, contentType); + InputStreamEntity entity = new InputStreamEntity(requestEntity, contentLength, + contentType); - HttpRequest httpRequest = buildHttpRequest(verb, uri, entity, headers, params, request); + HttpRequest httpRequest = buildHttpRequest(verb, uri, entity, headers, params, + request); try { log.debug(httpHost.getHostName() + " " + httpHost.getPort() + " " + httpHost.getSchemeName()); @@ -248,30 +253,30 @@ public class SimpleHostRoutingFilter extends ZuulFilter { ? getEncodedQueryString(request) : this.helper.getQueryString(params)); switch (verb.toUpperCase()) { - case "POST": - HttpPost httpPost = new HttpPost(uriWithQueryString); - httpRequest = httpPost; - httpPost.setEntity(entity); - break; - case "PUT": - HttpPut httpPut = new HttpPut(uriWithQueryString); - httpRequest = httpPut; - httpPut.setEntity(entity); - break; - case "PATCH": - HttpPatch httpPatch = new HttpPatch(uriWithQueryString); - httpRequest = httpPatch; - httpPatch.setEntity(entity); - break; - case "DELETE": - BasicHttpEntityEnclosingRequest entityRequest = new BasicHttpEntityEnclosingRequest( - verb, uriWithQueryString); - httpRequest = entityRequest; - entityRequest.setEntity(entity); - break; - default: - httpRequest = new BasicHttpRequest(verb, uriWithQueryString); - log.debug(uriWithQueryString); + case "POST": + HttpPost httpPost = new HttpPost(uriWithQueryString); + httpRequest = httpPost; + httpPost.setEntity(entity); + break; + case "PUT": + HttpPut httpPut = new HttpPut(uriWithQueryString); + httpRequest = httpPut; + httpPut.setEntity(entity); + break; + case "PATCH": + HttpPatch httpPatch = new HttpPatch(uriWithQueryString); + httpRequest = httpPatch; + httpPatch.setEntity(entity); + break; + case "DELETE": + BasicHttpEntityEnclosingRequest entityRequest = new BasicHttpEntityEnclosingRequest( + verb, uriWithQueryString); + httpRequest = entityRequest; + entityRequest.setEntity(entity); + break; + default: + httpRequest = new BasicHttpRequest(verb, uriWithQueryString); + log.debug(uriWithQueryString); } httpRequest.setHeaders(convertHeaders(headers));