From 69739420fa5676ae494f3d063ebf43bdce376eb9 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Sun, 9 Jul 2017 13:39:04 -0400 Subject: [PATCH] Takes advantage of new builder pattern. Also reverted elimination of properties for feign and ribbon. --- .../netflix/feign/FeignAutoConfiguration.java | 18 +++-- .../FeignRibbonClientAutoConfiguration.java | 60 +++++++++------ .../ribbon/RibbonClientConfiguration.java | 26 ++++--- .../RibbonCommandFactoryConfiguration.java | 4 +- .../zuul/ZuulProxyAutoConfiguration.java | 12 ++- .../route/SimpleHostRoutingFilter.java | 75 ++++++++++++------- .../java/OkHttpClientConfigurationTests.java | 12 +-- .../ApacheHttpClientConfigurationTests.java | 10 +-- .../feign/FeignHttpClientUrlTests.java | 2 +- .../RibbonClientConfigurationTests.java | 4 +- ...orPropertiesOverridesIntegrationTests.java | 3 +- .../RibbonLoadBalancingHttpClientTests.java | 3 +- .../SpringRetryDisableOkHttpClientTests.java | 2 +- .../SpringRetryEnabledOkHttpClientTests.java | 2 +- .../zuul/ZuulProxyConfigurationTests.java | 4 +- .../filters/CustomHostRoutingFilterTests.java | 45 +++++++---- .../OkHttpRibbonRetryIntegrationTests.java | 4 +- 17 files changed, 175 insertions(+), 111 deletions(-) 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 5294a603..fe2bf281 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 @@ -101,6 +101,7 @@ public class FeignAutoConfiguration { @Configuration @ConditionalOnClass(ApacheHttpClient.class) @ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer") + @ConditionalOnMissingBean(CloseableHttpClient.class) @ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true) protected static class HttpClientFeignConfiguration { private final Timer connectionManagerTimer = new Timer( @@ -131,7 +132,7 @@ public class FeignAutoConfiguration { } @Bean - @ConditionalOnMissingBean(CloseableHttpClient.class) + public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, HttpClientConnectionManager httpClientConnectionManager, FeignHttpClientProperties httpClientProperties) { @@ -139,8 +140,9 @@ public class FeignAutoConfiguration { .setConnectTimeout(httpClientProperties.getConnectionTimeout()) .setRedirectsEnabled(httpClientProperties.isFollowRedirects()) .build(); - this.httpClient = httpClientFactory.createClient(defaultRequestConfig, - httpClientConnectionManager); + this.httpClient = httpClientFactory.createBuilder(). + setConnectionManager(httpClientConnectionManager). + setDefaultRequestConfig(defaultRequestConfig).build(); return this.httpClient; } @@ -162,6 +164,7 @@ public class FeignAutoConfiguration { @Configuration @ConditionalOnClass(OkHttpClient.class) @ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer") + @ConditionalOnMissingBean(okhttp3.OkHttpClient.class) @ConditionalOnProperty(value = "feign.okhttp.enabled") protected static class OkHttpFeignConfiguration { @@ -178,15 +181,14 @@ public class FeignAutoConfiguration { } @Bean - @ConditionalOnMissingBean(okhttp3.OkHttpClient.class) public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory, ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) { Boolean followRedirects = httpClientProperties.isFollowRedirects(); Integer connectTimeout = httpClientProperties.getConnectionTimeout(); - //TODO Remove read timeout constant after changing to builder pattern - this.okHttpClient = httpClientFactory.create(false, connectTimeout, TimeUnit.MILLISECONDS, - followRedirects, 2000, TimeUnit.MILLISECONDS, connectionPool, null, - null); + this.okHttpClient = httpClientFactory.createBuilder(false). + connectTimeout(connectTimeout, TimeUnit.MILLISECONDS). + followRedirects(followRedirects). + connectionPool(connectionPool).build(); return this.okHttpClient; } 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 c946a0c5..66256e65 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 @@ -100,8 +100,8 @@ public class FeignRibbonClientAutoConfiguration { @Configuration @ConditionalOnClass(ApacheHttpClient.class) @ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true) - protected static class HttpClientFeignLoadBalancedConfiguration { - + @ConditionalOnMissingBean(CloseableHttpClient.class) + protected static class HttpClientFeignConfiguration { private final Timer connectionManagerTimer = new Timer( "FeignApacheHttpClientConfiguration.connectionManagerTimer", true); @@ -130,27 +130,19 @@ public class FeignRibbonClientAutoConfiguration { } @Bean - @ConditionalOnMissingBean(CloseableHttpClient.class) public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, - HttpClientConnectionManager httpClientConnectionManager, - FeignHttpClientProperties httpClientProperties) { + HttpClientConnectionManager httpClientConnectionManager, + FeignHttpClientProperties httpClientProperties) { RequestConfig defaultRequestConfig = RequestConfig.custom() .setConnectTimeout(httpClientProperties.getConnectionTimeout()) .setRedirectsEnabled(httpClientProperties.isFollowRedirects()) .build(); - this.httpClient = httpClientFactory.createClient(defaultRequestConfig, - httpClientConnectionManager); + this.httpClient = httpClientFactory.createBuilder(). + setDefaultRequestConfig(defaultRequestConfig). + setConnectionManager(httpClientConnectionManager).build(); return this.httpClient; } - @Bean - @ConditionalOnMissingBean(Client.class) - public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, - SpringClientFactory clientFactory, HttpClient httpClient) { - ApacheHttpClient delegate = new ApacheHttpClient(httpClient); - return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory); - } - @PreDestroy public void destroy() throws Exception { connectionManagerTimer.cancel(); @@ -160,11 +152,26 @@ public class FeignRibbonClientAutoConfiguration { } } + + @Configuration + @ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true) + @ConditionalOnClass(ApacheHttpClient.class) + protected static class HttpClientFeignLoadBalancedConfiguration { + + @Bean + @ConditionalOnMissingBean(Client.class) + public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, + SpringClientFactory clientFactory, HttpClient httpClient) { + ApacheHttpClient delegate = new ApacheHttpClient(httpClient); + return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory); + } + + } @Configuration + @ConditionalOnMissingBean(okhttp3.OkHttpClient.class) @ConditionalOnClass(OkHttpClient.class) @ConditionalOnProperty(value = "feign.okhttp.enabled") - protected static class OkHttpFeignLoadBalancedConfiguration { - + protected static class OkHttpFeignConfiguration { private okhttp3.OkHttpClient okHttpClient; @Bean @@ -178,15 +185,14 @@ public class FeignRibbonClientAutoConfiguration { } @Bean - @ConditionalOnMissingBean(okhttp3.OkHttpClient.class) public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory, ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) { Boolean followRedirects = httpClientProperties.isFollowRedirects(); Integer connectTimeout = httpClientProperties.getConnectionTimeout(); - this.okHttpClient = httpClientFactory.create(false, connectTimeout, TimeUnit.MILLISECONDS, - //TODO Remove read timeout constant after changing to builder pattern - followRedirects, 2000, TimeUnit.MILLISECONDS, connectionPool, null, - null); + this.okHttpClient = httpClientFactory.createBuilder(false). + connectTimeout(connectTimeout, TimeUnit.MILLISECONDS). + followRedirects(followRedirects). + connectionPool(connectionPool).build(); return this.okHttpClient; } @@ -197,12 +203,18 @@ public class FeignRibbonClientAutoConfiguration { okHttpClient.connectionPool().evictAll(); } } + } + + @Configuration + @ConditionalOnClass(OkHttpClient.class) + @ConditionalOnProperty(value = "feign.okhttp.enabled") + protected static class OkHttpFeignLoadBalancedConfiguration { @Bean @ConditionalOnMissingBean(Client.class) public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, - SpringClientFactory clientFactory) { - OkHttpClient delegate = new OkHttpClient(this.okHttpClient); + SpringClientFactory clientFactory, okhttp3.OkHttpClient okHttpClient) { + OkHttpClient delegate = new OkHttpClient(okHttpClient); return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory); } } 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 86188dae..9383b6fb 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 @@ -35,6 +35,8 @@ import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.CloseableHttpClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +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; @@ -141,7 +143,7 @@ public class RibbonClientConfiguration { } @Configuration - @ConditionalOnProperty(name = "spring.cloud.httpclient.apache.enable", matchIfMissing = true) + @ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true) protected static class ApacheHttpClientConfiguration { private final Timer connectionManagerTimer = new Timer( "RibbonApacheHttpClientConfiguration.connectionManagerTimer", true); @@ -154,8 +156,7 @@ public class RibbonClientConfiguration { @ConditionalOnMissingBean(HttpClientConnectionManager.class) public HttpClientConnectionManager httpClientConnectionManager( IClientConfig config, - ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - ApacheHttpClientFactory httpClientFactory) { + ApacheHttpClientConnectionManagerFactory connectionManagerFactory) { Integer maxTotalConnections = config.getPropertyAsInteger( CommonClientConfigKey.MaxTotalConnections, DefaultClientConfigImpl.DEFAULT_MAX_TOTAL_CONNECTIONS); @@ -202,8 +203,9 @@ public class RibbonClientConfiguration { RequestConfig defaultRequestConfig = RequestConfig.custom() .setConnectTimeout(connectTimeout) .setRedirectsEnabled(followRedirects).build(); - this.httpClient = httpClientFactory.createClient(defaultRequestConfig, - connectionManager); + this.httpClient = httpClientFactory.createBuilder(). + setDefaultRequestConfig(defaultRequestConfig). + setConnectionManager(connectionManager).build(); return httpClient; } @@ -217,7 +219,7 @@ public class RibbonClientConfiguration { } @Configuration - @ConditionalOnProperty("spring.cloud.httpclient.ok.enabled") + @ConditionalOnProperty(value = {"ribbon.okhttp.enabled"}) @ConditionalOnClass(name = "okhttp3.OkHttpClient") protected static class OkHttpClientConfiguration { private OkHttpClient httpClient; @@ -256,9 +258,11 @@ public class RibbonClientConfiguration { DefaultClientConfigImpl.DEFAULT_CONNECT_TIMEOUT); Integer readTimeout = config.getPropertyAsInteger(CommonClientConfigKey.ReadTimeout, DefaultClientConfigImpl.DEFAULT_READ_TIMEOUT); - this.httpClient = httpClientFactory.create(false, connectTimeout, TimeUnit.MILLISECONDS, - followRedirects, readTimeout, TimeUnit.MILLISECONDS, connectionPool, null, - null); + this.httpClient = httpClientFactory.createBuilder(false). + connectTimeout(connectTimeout, TimeUnit.MILLISECONDS). + readTimeout(readTimeout, TimeUnit.MILLISECONDS). + followRedirects(followRedirects). + connectionPool(connectionPool).build(); return this.httpClient; } @@ -272,7 +276,7 @@ public class RibbonClientConfiguration { } @Configuration - @ConditionalOnProperty(name = "spring.cloud.httpclient.apache.enable", matchIfMissing = true) + @ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true) protected static class HttpClientRibbonConfiguration { @Value("${ribbon.client.name}") private String name = "client"; @@ -311,7 +315,7 @@ public class RibbonClientConfiguration { } @Configuration - @ConditionalOnProperty("spring.cloud.httpclient.ok.enabled") + @ConditionalOnProperty(value = {"ribbon.okhttp.enabled"}) @ConditionalOnClass(name = "okhttp3.OkHttpClient") protected static class OkHttpRibbonConfiguration { @Value("${ribbon.client.name}") diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RibbonCommandFactoryConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RibbonCommandFactoryConfiguration.java index 21b1a246..da5fb6ee 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RibbonCommandFactoryConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RibbonCommandFactoryConfiguration.java @@ -105,7 +105,7 @@ public class RibbonCommandFactoryConfiguration { super(ConfigurationPhase.PARSE_CONFIGURATION); } - @ConditionalOnProperty(name = "spring.cloud.httpclient.apache.enable", matchIfMissing = true) + @ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true) static class RibbonProperty {} } @@ -120,7 +120,7 @@ public class RibbonCommandFactoryConfiguration { super(ConfigurationPhase.PARSE_CONFIGURATION); } - @ConditionalOnProperty("spring.cloud.httpclient.ok.enabled") + @ConditionalOnProperty("ribbon.okhttp.enabled") static class RibbonProperty {} } 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 42e1853b..95f1350d 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 @@ -19,6 +19,7 @@ package org.springframework.cloud.netflix.zuul; import java.util.Collections; import java.util.List; +import org.apache.http.impl.client.CloseableHttpClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.trace.TraceRepository; @@ -108,7 +109,7 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { } @Bean - @ConditionalOnMissingBean(SimpleHostRoutingFilter.class) + @ConditionalOnMissingBean({SimpleHostRoutingFilter.class, CloseableHttpClient.class}) public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties zuulProperties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, @@ -117,6 +118,15 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { connectionManagerFactory, httpClientFactory); } + @Bean + @ConditionalOnMissingBean({SimpleHostRoutingFilter.class}) + public SimpleHostRoutingFilter simpleHostRoutingFilter2(ProxyRequestHelper helper, + ZuulProperties zuulProperties, + CloseableHttpClient httpClient) { + return new SimpleHostRoutingFilter(helper, zuulProperties, + httpClient); + } + @Bean public ApplicationListener zuulDiscoveryRefreshRoutesListener() { return new ZuulDiscoveryRefreshListener(); 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 baee16dd..58a368d7 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 @@ -90,26 +90,28 @@ public class SimpleHostRoutingFilter extends ZuulFilter { private ApacheHttpClientFactory httpClientFactory; private HttpClientConnectionManager connectionManager; private CloseableHttpClient httpClient; + private boolean customHttpClient = false; @EventListener public void onPropertyChange(EnvironmentChangeEvent event) { - boolean createNewClient = false; + if(!customHttpClient) { + boolean createNewClient = false; - for (String key : event.getKeys()) { - if (key.startsWith("zuul.host.")) { - createNewClient = true; - break; + for (String key : event.getKeys()) { + if (key.startsWith("zuul.host.")) { + createNewClient = true; + break; + } } - } - if (createNewClient) { - try { - SimpleHostRoutingFilter.this.httpClient.close(); - } - catch (IOException ex) { - log.error("error closing client", ex); + if (createNewClient) { + try { + SimpleHostRoutingFilter.this.httpClient.close(); + } catch (IOException ex) { + log.error("error closing client", ex); + } + SimpleHostRoutingFilter.this.httpClient = newClient(); } - SimpleHostRoutingFilter.this.httpClient = newClient(); } } @@ -125,24 +127,37 @@ public class SimpleHostRoutingFilter extends ZuulFilter { this.httpClientFactory = httpClientFactory; } + public SimpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties properties, + CloseableHttpClient httpClient) { + this.helper = helper; + this.hostProperties = properties.getHost(); + this.sslHostnameValidationEnabled = properties.isSslHostnameValidationEnabled(); + this.forceOriginalQueryStringEncoding = properties + .isForceOriginalQueryStringEncoding(); + this.httpClient = httpClient; + this.customHttpClient = true; + } + @PostConstruct private void initialize() { - 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 - public void run() { - if (SimpleHostRoutingFilter.this.connectionManager == null) { - return; + if(!customHttpClient) { + 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 + public void run() { + if (SimpleHostRoutingFilter.this.connectionManager == null) { + return; + } + SimpleHostRoutingFilter.this.connectionManager.closeExpiredConnections(); } - SimpleHostRoutingFilter.this.connectionManager.closeExpiredConnections(); - } - }, 30000, 5000); + }, 30000, 5000); + } } @PreDestroy @@ -203,7 +218,9 @@ public class SimpleHostRoutingFilter extends ZuulFilter { .setSocketTimeout(this.hostProperties.getSocketTimeoutMillis()) .setConnectTimeout(this.hostProperties.getConnectTimeoutMillis()) .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); - return httpClientFactory.createClient(requestConfig, this.connectionManager); + return httpClientFactory.createBuilder(). + setDefaultRequestConfig(requestConfig). + setConnectionManager(this.connectionManager).build(); } private CloseableHttpResponse forward(CloseableHttpClient httpclient, String verb, diff --git a/spring-cloud-netflix-core/src/test/java/OkHttpClientConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/OkHttpClientConfigurationTests.java index 3e5e2bdf..24f9f919 100644 --- a/spring-cloud-netflix-core/src/test/java/OkHttpClientConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/OkHttpClientConfigurationTests.java @@ -61,7 +61,7 @@ import static org.mockito.Mockito.mockingDetails; */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = OkHttpClientConfigurationTestApp.class, value = {"feign.okhttp.enabled: true", - "spring.cloud.httpclient.ok.enabled: true", "ribbon.eureka.enabled = false"}) + "spring.cloud.httpclient.ok.enabled: true", "ribbon.eureka.enabled = false", "ribbon.okhttp.enabled: true"}) @DirtiesContext public class OkHttpClientConfigurationTests { @@ -118,7 +118,6 @@ public class OkHttpClientConfigurationTests { @Configuration @EnableAutoConfiguration @RestController -//@EnableFeignClients(clients = {}) @EnableZuulProxy class OkHttpClientConfigurationTestApp { @@ -135,10 +134,6 @@ class OkHttpClientConfigurationTestApp { } static class MyOkHttpClientFactory extends DefaultOkHttpClientFactory { - @Override - public OkHttpClient create(boolean disableSslValidation, long connectTimeout, TimeUnit connectTimeoutUnit, boolean followRedirects, long readTimeout, TimeUnit readTimeoutUnit, ConnectionPool connectionPool, SSLSocketFactory sslSocketFactory, X509TrustManager x509TrustManager) { - return mock(OkHttpClient.class); - } } @Configuration @@ -153,6 +148,11 @@ class OkHttpClientConfigurationTestApp { return new MyOkHttpClientFactory(); } + @Bean + public OkHttpClient client() { + return mock(OkHttpClient.class); + } + } @FeignClient(name="foo", serviceId = "foo") diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ApacheHttpClientConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ApacheHttpClientConfigurationTests.java index aca8c6cf..8f65f4c3 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ApacheHttpClientConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ApacheHttpClientConfigurationTests.java @@ -34,6 +34,7 @@ import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.message.BasicHeader; import org.junit.Test; @@ -105,9 +106,6 @@ public class ApacheHttpClientConfigurationTests { @Test public void testHttpClientSimpleHostRoutingFilter() { - PoolingHttpClientConnectionManager connectionManager = getField(simpleHostRoutingFilter, "connectionManager"); - MockingDetails connectionManagerDetails = mockingDetails(connectionManager); - assertTrue(connectionManagerDetails.isMock()); CloseableHttpClient httpClient = getField(simpleHostRoutingFilter, "httpClient"); MockingDetails httpClientDetails = mockingDetails(httpClient); assertTrue(httpClientDetails.isMock()); @@ -164,7 +162,7 @@ class ApacheHttpClientConfigurationTestApp { static class MyApacheHttpClientFactory extends DefaultApacheHttpClientFactory { @Override - public CloseableHttpClient createClient(RequestConfig requestConfig, HttpClientConnectionManager connectionManager) { + public HttpClientBuilder createBuilder() { CloseableHttpClient client = mock(CloseableHttpClient.class); CloseableHttpResponse response = mock(CloseableHttpResponse.class); StatusLine statusLine = mock(StatusLine.class); @@ -177,7 +175,9 @@ class ApacheHttpClientConfigurationTestApp { } catch (IOException e) { e.printStackTrace(); } - return client; + HttpClientBuilder builder = mock(HttpClientBuilder.class); + doReturn(client).when(builder).build(); + return builder; } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java index eabfd678..08d70848 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java @@ -58,7 +58,7 @@ import lombok.NoArgsConstructor; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = FeignHttpClientUrlTests.TestConfig.class, webEnvironment = WebEnvironment.DEFINED_PORT, value = { "spring.application.name=feignclienturltest", "feign.hystrix.enabled=false", - "feign.okhttp.enabled=false" }) + "spring.cloud.httpclient.ok.enabled=false" }) @DirtiesContext public class FeignHttpClientUrlTests { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java index 21c333a9..5e3523df 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java @@ -152,7 +152,7 @@ public class RibbonClientConfigurationTests { @Test public void testDefaultsToApacheHttpClient() { testClient(RibbonLoadBalancingHttpClient.class, null, RestClient.class, OkHttpLoadBalancingClient.class); - testClient(RibbonLoadBalancingHttpClient.class, new String[]{"spring.cloud.httpclient.apache.enable"}, RestClient.class, OkHttpLoadBalancingClient.class); + testClient(RibbonLoadBalancingHttpClient.class, new String[]{"ribbon.httpclient.enabled"}, RestClient.class, OkHttpLoadBalancingClient.class); } @Test @@ -163,7 +163,7 @@ public class RibbonClientConfigurationTests { @Test public void testEnableOkHttpClient() { - testClient(OkHttpLoadBalancingClient.class, new String[]{"spring.cloud.httpclient.ok.enabled"}, RibbonLoadBalancingHttpClient.class, + testClient(OkHttpLoadBalancingClient.class, new String[]{"ribbon.okhttp.enabled"}, RibbonLoadBalancingHttpClient.class, RestClient.class); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java index c505e791..94009427 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java @@ -26,6 +26,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.commons.httpclient.HttpClientConfiguration; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.ribbon.test.TestLoadBalancer; @@ -102,7 +103,7 @@ public class RibbonClientPreprocessorPropertiesOverridesIntegrationTests { @Configuration @RibbonClients - @Import({ UtilAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, + @Import({ UtilAutoConfiguration.class, HttpClientConfiguration.class, PropertyPlaceholderAutoConfiguration.class, ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) protected static class TestConfiguration { } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java index a263a2f4..18401459 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java @@ -31,6 +31,7 @@ import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory; +import org.springframework.cloud.commons.httpclient.HttpClientConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancedRetryPolicy; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancedRetryPolicyFactory; @@ -437,7 +438,7 @@ public class RibbonLoadBalancingHttpClientTests { IClientConfig configOverride, SpringClientFactory factory) throws Exception { - factory.setApplicationContext(new AnnotationConfigApplicationContext( + factory.setApplicationContext(new AnnotationConfigApplicationContext(HttpClientConfiguration.class, RibbonAutoConfiguration.class, defaultConfigurationClass)); String serviceName = "foo"; String host = serviceName; diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryDisableOkHttpClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryDisableOkHttpClientTests.java index bb69994b..5aeac8e3 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryDisableOkHttpClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryDisableOkHttpClientTests.java @@ -46,7 +46,7 @@ public class SpringRetryDisableOkHttpClientTests { @Before public void setUp() { context = new SpringApplicationBuilder().web(false) - .properties("spring.cloud.httpclient.ok.enabled=true") + .properties("ribbon.okhttp.enabled=true") .sources(RibbonAutoConfiguration.class, LoadBalancerAutoConfiguration.class, HttpClientConfiguration.class, diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryEnabledOkHttpClientTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryEnabledOkHttpClientTests.java index a9006634..2cf328d3 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryEnabledOkHttpClientTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryEnabledOkHttpClientTests.java @@ -39,7 +39,7 @@ import static org.hamcrest.Matchers.instanceOf; * @author Ryan Baxter */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(value = { "spring.cloud.httpclient.ok.enabled: true" }) +@SpringBootTest(value = { "ribbon.okhttp.enabled: true", "ribbon.httpclient.enabled: false" }) @ContextConfiguration(classes = { RibbonAutoConfiguration.class, HttpClientConfiguration.class, RibbonClientConfiguration.class, LoadBalancerAutoConfiguration.class }) diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java index 81e92b83..67b087b4 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java @@ -43,7 +43,7 @@ public class ZuulProxyConfigurationTests { @Test public void testDefaultsToApacheHttpClient() { testClient(HttpClientRibbonCommandFactory.class, null); - testClient(HttpClientRibbonCommandFactory.class, "spring.cloud.httpclient.apache.enable=true"); + testClient(HttpClientRibbonCommandFactory.class, "ribbon.httpclient.enabled=true"); } @Test @@ -53,7 +53,7 @@ public class ZuulProxyConfigurationTests { @Test public void testEnableOkHttpClient() { - testClient(OkHttpRibbonCommandFactory.class, "spring.cloud.httpclient.ok.enabled=true"); + testClient(OkHttpRibbonCommandFactory.class, "ribbon.okhttp.enabled=true"); } void testClient(Class clientType, String property) { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java index 98ead810..2dad556c 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java @@ -26,7 +26,9 @@ import org.apache.http.client.config.RequestConfig; import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -35,6 +37,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; @@ -42,6 +45,7 @@ import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.commons.httpclient.ApacheHttpClientConnectionManagerFactory; import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory; import org.springframework.cloud.commons.httpclient.DefaultApacheHttpClientFactory; +import org.springframework.cloud.netflix.feign.ribbon.FeignRibbonClientAutoConfiguration; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.cloud.netflix.zuul.RoutesMvcEndpoint; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; @@ -212,6 +216,7 @@ class SampleCustomZuulProxyApplication { @Configuration @EnableZuulProxy + @AutoConfigureBefore({FeignRibbonClientAutoConfiguration.class}) protected static class CustomZuulProxyConfig { @Bean @@ -219,18 +224,25 @@ class SampleCustomZuulProxyApplication { return new CustomApacheHttpClientFactory(); } + @Bean + public CloseableHttpClient closeableClient() { + return HttpClients.custom() + .setDefaultCookieStore(new BasicCookieStore()) + .setDefaultRequestConfig(RequestConfig.custom() + .setCookieSpec(CookieSpecs.DEFAULT).build()) + .build(); + } + @Bean public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, - ZuulProperties zuulProperties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - ApacheHttpClientFactory httpClientFactory) { - return new CustomHostRoutingFilter(helper, zuulProperties, connectionManagerFactory, httpClientFactory); + ZuulProperties zuulProperties, CloseableHttpClient httpClient) { + return new CustomHostRoutingFilter(helper, zuulProperties, httpClient); } private class CustomHostRoutingFilter extends SimpleHostRoutingFilter { public CustomHostRoutingFilter(ProxyRequestHelper helper, - ZuulProperties zuulProperties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, - ApacheHttpClientFactory httpClientFactory) { - super(helper, zuulProperties, connectionManagerFactory, httpClientFactory); + ZuulProperties zuulProperties, CloseableHttpClient httpClient) { + super(helper, zuulProperties, httpClient); } @Override @@ -242,14 +254,19 @@ class SampleCustomZuulProxyApplication { private class CustomApacheHttpClientFactory extends DefaultApacheHttpClientFactory { - @Override - public CloseableHttpClient createClient(RequestConfig requestConfig, HttpClientConnectionManager connectionManager) { - return HttpClients.custom().setConnectionManager(connectionManager) - .setDefaultCookieStore(new BasicCookieStore()) - .setDefaultRequestConfig(RequestConfig.custom() - .setCookieSpec(CookieSpecs.DEFAULT).build()) - .build(); - } +//@Override +//public HttpClientBuilder createBuilder() { +// return HttpClients.custom() +// .setDefaultCookieStore(new BasicCookieStore()) +// .setDefaultRequestConfig(RequestConfig.custom() +// .setCookieSpec(CookieSpecs.DEFAULT).build()); +//}public CloseableHttpClient createClient(RequestConfig requestConfig, HttpClientConnectionManager connectionManager) { +// return HttpClients.custom().setConnectionManager(connectionManager) +// .setDefaultCookieStore(new BasicCookieStore()) +// .setDefaultRequestConfig(RequestConfig.custom() +// .setCookieSpec(CookieSpecs.DEFAULT).build()) +// .build(); +// } } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonRetryIntegrationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonRetryIntegrationTests.java index 570f1323..f23dc053 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonRetryIntegrationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonRetryIntegrationTests.java @@ -30,6 +30,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = RibbonRetryIntegrationTestBase.RetryableTestConfig.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, value = { "zuul.retryable: false", /* Disable retry by default, have each route enable it */ + "ribbon.okhttp.enabled", "hystrix.command.default.execution.timeout.enabled: false", /* Disable hystrix so its timeout doesnt get in the way */ "ribbon.ReadTimeout: 1000", /* Make sure ribbon will timeout before the thread is done sleeping */ "zuul.routes.retryable: /retryable/**", @@ -48,8 +49,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; "disableretry.ribbon.MaxAutoRetriesNextServer: 1", "zuul.routes.globalretrydisabled: /globalretrydisabled/**", "globalretrydisabled.ribbon.MaxAutoRetries: 1", - "globalretrydisabled.ribbon.MaxAutoRetriesNextServer: 1", - "spring.cloud.httpclient.ok.enabled: true" + "globalretrydisabled.ribbon.MaxAutoRetriesNextServer: 1" }) @DirtiesContext public class OkHttpRibbonRetryIntegrationTests extends RibbonRetryIntegrationTestBase {