Browse Source

Takes advantage of new builder pattern. Also reverted elimination of properties for feign and ribbon.

pull/6/head
Ryan Baxter 8 years ago
parent
commit
69739420fa
  1. 18
      spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java
  2. 60
      spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientAutoConfiguration.java
  3. 26
      spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java
  4. 4
      spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/RibbonCommandFactoryConfiguration.java
  5. 12
      spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java
  6. 75
      spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java
  7. 12
      spring-cloud-netflix-core/src/test/java/OkHttpClientConfigurationTests.java
  8. 10
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ApacheHttpClientConfigurationTests.java
  9. 2
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java
  10. 4
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java
  11. 3
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorPropertiesOverridesIntegrationTests.java
  12. 3
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/apache/RibbonLoadBalancingHttpClientTests.java
  13. 2
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryDisableOkHttpClientTests.java
  14. 2
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryEnabledOkHttpClientTests.java
  15. 4
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java
  16. 45
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java
  17. 4
      spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/okhttp/OkHttpRibbonRetryIntegrationTests.java

18
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/FeignAutoConfiguration.java

@ -101,6 +101,7 @@ public class FeignAutoConfiguration {
@Configuration @Configuration
@ConditionalOnClass(ApacheHttpClient.class) @ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer") @ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
@ConditionalOnMissingBean(CloseableHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true) @ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientFeignConfiguration { protected static class HttpClientFeignConfiguration {
private final Timer connectionManagerTimer = new Timer( private final Timer connectionManagerTimer = new Timer(
@ -131,7 +132,7 @@ public class FeignAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean(CloseableHttpClient.class)
public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory,
HttpClientConnectionManager httpClientConnectionManager, HttpClientConnectionManager httpClientConnectionManager,
FeignHttpClientProperties httpClientProperties) { FeignHttpClientProperties httpClientProperties) {
@ -139,8 +140,9 @@ public class FeignAutoConfiguration {
.setConnectTimeout(httpClientProperties.getConnectionTimeout()) .setConnectTimeout(httpClientProperties.getConnectionTimeout())
.setRedirectsEnabled(httpClientProperties.isFollowRedirects()) .setRedirectsEnabled(httpClientProperties.isFollowRedirects())
.build(); .build();
this.httpClient = httpClientFactory.createClient(defaultRequestConfig, this.httpClient = httpClientFactory.createBuilder().
httpClientConnectionManager); setConnectionManager(httpClientConnectionManager).
setDefaultRequestConfig(defaultRequestConfig).build();
return this.httpClient; return this.httpClient;
} }
@ -162,6 +164,7 @@ public class FeignAutoConfiguration {
@Configuration @Configuration
@ConditionalOnClass(OkHttpClient.class) @ConditionalOnClass(OkHttpClient.class)
@ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer") @ConditionalOnMissingClass("com.netflix.loadbalancer.ILoadBalancer")
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
@ConditionalOnProperty(value = "feign.okhttp.enabled") @ConditionalOnProperty(value = "feign.okhttp.enabled")
protected static class OkHttpFeignConfiguration { protected static class OkHttpFeignConfiguration {
@ -178,15 +181,14 @@ public class FeignAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory, public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory,
ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) { ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) {
Boolean followRedirects = httpClientProperties.isFollowRedirects(); Boolean followRedirects = httpClientProperties.isFollowRedirects();
Integer connectTimeout = httpClientProperties.getConnectionTimeout(); Integer connectTimeout = httpClientProperties.getConnectionTimeout();
//TODO Remove read timeout constant after changing to builder pattern this.okHttpClient = httpClientFactory.createBuilder(false).
this.okHttpClient = httpClientFactory.create(false, connectTimeout, TimeUnit.MILLISECONDS, connectTimeout(connectTimeout, TimeUnit.MILLISECONDS).
followRedirects, 2000, TimeUnit.MILLISECONDS, connectionPool, null, followRedirects(followRedirects).
null); connectionPool(connectionPool).build();
return this.okHttpClient; return this.okHttpClient;
} }

60
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/FeignRibbonClientAutoConfiguration.java

@ -100,8 +100,8 @@ public class FeignRibbonClientAutoConfiguration {
@Configuration @Configuration
@ConditionalOnClass(ApacheHttpClient.class) @ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true) @ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientFeignLoadBalancedConfiguration { @ConditionalOnMissingBean(CloseableHttpClient.class)
protected static class HttpClientFeignConfiguration {
private final Timer connectionManagerTimer = new Timer( private final Timer connectionManagerTimer = new Timer(
"FeignApacheHttpClientConfiguration.connectionManagerTimer", true); "FeignApacheHttpClientConfiguration.connectionManagerTimer", true);
@ -130,27 +130,19 @@ public class FeignRibbonClientAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean(CloseableHttpClient.class)
public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory,
HttpClientConnectionManager httpClientConnectionManager, HttpClientConnectionManager httpClientConnectionManager,
FeignHttpClientProperties httpClientProperties) { FeignHttpClientProperties httpClientProperties) {
RequestConfig defaultRequestConfig = RequestConfig.custom() RequestConfig defaultRequestConfig = RequestConfig.custom()
.setConnectTimeout(httpClientProperties.getConnectionTimeout()) .setConnectTimeout(httpClientProperties.getConnectionTimeout())
.setRedirectsEnabled(httpClientProperties.isFollowRedirects()) .setRedirectsEnabled(httpClientProperties.isFollowRedirects())
.build(); .build();
this.httpClient = httpClientFactory.createClient(defaultRequestConfig, this.httpClient = httpClientFactory.createBuilder().
httpClientConnectionManager); setDefaultRequestConfig(defaultRequestConfig).
setConnectionManager(httpClientConnectionManager).build();
return this.httpClient; 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 @PreDestroy
public void destroy() throws Exception { public void destroy() throws Exception {
connectionManagerTimer.cancel(); 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 @Configuration
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
@ConditionalOnClass(OkHttpClient.class) @ConditionalOnClass(OkHttpClient.class)
@ConditionalOnProperty(value = "feign.okhttp.enabled") @ConditionalOnProperty(value = "feign.okhttp.enabled")
protected static class OkHttpFeignLoadBalancedConfiguration { protected static class OkHttpFeignConfiguration {
private okhttp3.OkHttpClient okHttpClient; private okhttp3.OkHttpClient okHttpClient;
@Bean @Bean
@ -178,15 +185,14 @@ public class FeignRibbonClientAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory, public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory,
ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) { ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) {
Boolean followRedirects = httpClientProperties.isFollowRedirects(); Boolean followRedirects = httpClientProperties.isFollowRedirects();
Integer connectTimeout = httpClientProperties.getConnectionTimeout(); Integer connectTimeout = httpClientProperties.getConnectionTimeout();
this.okHttpClient = httpClientFactory.create(false, connectTimeout, TimeUnit.MILLISECONDS, this.okHttpClient = httpClientFactory.createBuilder(false).
//TODO Remove read timeout constant after changing to builder pattern connectTimeout(connectTimeout, TimeUnit.MILLISECONDS).
followRedirects, 2000, TimeUnit.MILLISECONDS, connectionPool, null, followRedirects(followRedirects).
null); connectionPool(connectionPool).build();
return this.okHttpClient; return this.okHttpClient;
} }
@ -197,12 +203,18 @@ public class FeignRibbonClientAutoConfiguration {
okHttpClient.connectionPool().evictAll(); okHttpClient.connectionPool().evictAll();
} }
} }
}
@Configuration
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnProperty(value = "feign.okhttp.enabled")
protected static class OkHttpFeignLoadBalancedConfiguration {
@Bean @Bean
@ConditionalOnMissingBean(Client.class) @ConditionalOnMissingBean(Client.class)
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) { SpringClientFactory clientFactory, okhttp3.OkHttpClient okHttpClient) {
OkHttpClient delegate = new OkHttpClient(this.okHttpClient); OkHttpClient delegate = new OkHttpClient(okHttpClient);
return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory); return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
} }
} }

26
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.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; 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.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
@ -141,7 +143,7 @@ public class RibbonClientConfiguration {
} }
@Configuration @Configuration
@ConditionalOnProperty(name = "spring.cloud.httpclient.apache.enable", matchIfMissing = true) @ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true)
protected static class ApacheHttpClientConfiguration { protected static class ApacheHttpClientConfiguration {
private final Timer connectionManagerTimer = new Timer( private final Timer connectionManagerTimer = new Timer(
"RibbonApacheHttpClientConfiguration.connectionManagerTimer", true); "RibbonApacheHttpClientConfiguration.connectionManagerTimer", true);
@ -154,8 +156,7 @@ public class RibbonClientConfiguration {
@ConditionalOnMissingBean(HttpClientConnectionManager.class) @ConditionalOnMissingBean(HttpClientConnectionManager.class)
public HttpClientConnectionManager httpClientConnectionManager( public HttpClientConnectionManager httpClientConnectionManager(
IClientConfig config, IClientConfig config,
ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ApacheHttpClientConnectionManagerFactory connectionManagerFactory) {
ApacheHttpClientFactory httpClientFactory) {
Integer maxTotalConnections = config.getPropertyAsInteger( Integer maxTotalConnections = config.getPropertyAsInteger(
CommonClientConfigKey.MaxTotalConnections, CommonClientConfigKey.MaxTotalConnections,
DefaultClientConfigImpl.DEFAULT_MAX_TOTAL_CONNECTIONS); DefaultClientConfigImpl.DEFAULT_MAX_TOTAL_CONNECTIONS);
@ -202,8 +203,9 @@ public class RibbonClientConfiguration {
RequestConfig defaultRequestConfig = RequestConfig.custom() RequestConfig defaultRequestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout) .setConnectTimeout(connectTimeout)
.setRedirectsEnabled(followRedirects).build(); .setRedirectsEnabled(followRedirects).build();
this.httpClient = httpClientFactory.createClient(defaultRequestConfig, this.httpClient = httpClientFactory.createBuilder().
connectionManager); setDefaultRequestConfig(defaultRequestConfig).
setConnectionManager(connectionManager).build();
return httpClient; return httpClient;
} }
@ -217,7 +219,7 @@ public class RibbonClientConfiguration {
} }
@Configuration @Configuration
@ConditionalOnProperty("spring.cloud.httpclient.ok.enabled") @ConditionalOnProperty(value = {"ribbon.okhttp.enabled"})
@ConditionalOnClass(name = "okhttp3.OkHttpClient") @ConditionalOnClass(name = "okhttp3.OkHttpClient")
protected static class OkHttpClientConfiguration { protected static class OkHttpClientConfiguration {
private OkHttpClient httpClient; private OkHttpClient httpClient;
@ -256,9 +258,11 @@ public class RibbonClientConfiguration {
DefaultClientConfigImpl.DEFAULT_CONNECT_TIMEOUT); DefaultClientConfigImpl.DEFAULT_CONNECT_TIMEOUT);
Integer readTimeout = config.getPropertyAsInteger(CommonClientConfigKey.ReadTimeout, Integer readTimeout = config.getPropertyAsInteger(CommonClientConfigKey.ReadTimeout,
DefaultClientConfigImpl.DEFAULT_READ_TIMEOUT); DefaultClientConfigImpl.DEFAULT_READ_TIMEOUT);
this.httpClient = httpClientFactory.create(false, connectTimeout, TimeUnit.MILLISECONDS, this.httpClient = httpClientFactory.createBuilder(false).
followRedirects, readTimeout, TimeUnit.MILLISECONDS, connectionPool, null, connectTimeout(connectTimeout, TimeUnit.MILLISECONDS).
null); readTimeout(readTimeout, TimeUnit.MILLISECONDS).
followRedirects(followRedirects).
connectionPool(connectionPool).build();
return this.httpClient; return this.httpClient;
} }
@ -272,7 +276,7 @@ public class RibbonClientConfiguration {
} }
@Configuration @Configuration
@ConditionalOnProperty(name = "spring.cloud.httpclient.apache.enable", matchIfMissing = true) @ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true)
protected static class HttpClientRibbonConfiguration { protected static class HttpClientRibbonConfiguration {
@Value("${ribbon.client.name}") @Value("${ribbon.client.name}")
private String name = "client"; private String name = "client";
@ -311,7 +315,7 @@ public class RibbonClientConfiguration {
} }
@Configuration @Configuration
@ConditionalOnProperty("spring.cloud.httpclient.ok.enabled") @ConditionalOnProperty(value = {"ribbon.okhttp.enabled"})
@ConditionalOnClass(name = "okhttp3.OkHttpClient") @ConditionalOnClass(name = "okhttp3.OkHttpClient")
protected static class OkHttpRibbonConfiguration { protected static class OkHttpRibbonConfiguration {
@Value("${ribbon.client.name}") @Value("${ribbon.client.name}")

4
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); super(ConfigurationPhase.PARSE_CONFIGURATION);
} }
@ConditionalOnProperty(name = "spring.cloud.httpclient.apache.enable", matchIfMissing = true) @ConditionalOnProperty(name = "ribbon.httpclient.enabled", matchIfMissing = true)
static class RibbonProperty {} static class RibbonProperty {}
} }
@ -120,7 +120,7 @@ public class RibbonCommandFactoryConfiguration {
super(ConfigurationPhase.PARSE_CONFIGURATION); super(ConfigurationPhase.PARSE_CONFIGURATION);
} }
@ConditionalOnProperty("spring.cloud.httpclient.ok.enabled") @ConditionalOnProperty("ribbon.okhttp.enabled")
static class RibbonProperty {} static class RibbonProperty {}
} }

12
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.Collections;
import java.util.List; import java.util.List;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.Endpoint;
import org.springframework.boot.actuate.trace.TraceRepository; import org.springframework.boot.actuate.trace.TraceRepository;
@ -108,7 +109,7 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration {
} }
@Bean @Bean
@ConditionalOnMissingBean(SimpleHostRoutingFilter.class) @ConditionalOnMissingBean({SimpleHostRoutingFilter.class, CloseableHttpClient.class})
public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper,
ZuulProperties zuulProperties, ZuulProperties zuulProperties,
ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ApacheHttpClientConnectionManagerFactory connectionManagerFactory,
@ -117,6 +118,15 @@ public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration {
connectionManagerFactory, httpClientFactory); connectionManagerFactory, httpClientFactory);
} }
@Bean
@ConditionalOnMissingBean({SimpleHostRoutingFilter.class})
public SimpleHostRoutingFilter simpleHostRoutingFilter2(ProxyRequestHelper helper,
ZuulProperties zuulProperties,
CloseableHttpClient httpClient) {
return new SimpleHostRoutingFilter(helper, zuulProperties,
httpClient);
}
@Bean @Bean
public ApplicationListener<ApplicationEvent> zuulDiscoveryRefreshRoutesListener() { public ApplicationListener<ApplicationEvent> zuulDiscoveryRefreshRoutesListener() {
return new ZuulDiscoveryRefreshListener(); return new ZuulDiscoveryRefreshListener();

75
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 ApacheHttpClientFactory httpClientFactory;
private HttpClientConnectionManager connectionManager; private HttpClientConnectionManager connectionManager;
private CloseableHttpClient httpClient; private CloseableHttpClient httpClient;
private boolean customHttpClient = false;
@EventListener @EventListener
public void onPropertyChange(EnvironmentChangeEvent event) { public void onPropertyChange(EnvironmentChangeEvent event) {
boolean createNewClient = false; if(!customHttpClient) {
boolean createNewClient = false;
for (String key : event.getKeys()) { for (String key : event.getKeys()) {
if (key.startsWith("zuul.host.")) { if (key.startsWith("zuul.host.")) {
createNewClient = true; createNewClient = true;
break; break;
}
} }
}
if (createNewClient) { if (createNewClient) {
try { try {
SimpleHostRoutingFilter.this.httpClient.close(); SimpleHostRoutingFilter.this.httpClient.close();
} } catch (IOException ex) {
catch (IOException ex) { log.error("error closing client", 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; 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 @PostConstruct
private void initialize() { private void initialize() {
this.connectionManager = connectionManagerFactory.newConnectionManager( if(!customHttpClient) {
this.sslHostnameValidationEnabled, this.connectionManager = connectionManagerFactory.newConnectionManager(
this.hostProperties.getMaxTotalConnections(), this.sslHostnameValidationEnabled,
this.hostProperties.getMaxPerRouteConnections(), this.hostProperties.getMaxTotalConnections(),
this.hostProperties.getTimeToLive(), this.hostProperties.getTimeUnit(), this.hostProperties.getMaxPerRouteConnections(),
null); this.hostProperties.getTimeToLive(), this.hostProperties.getTimeUnit(),
this.httpClient = newClient(); null);
this.connectionManagerTimer.schedule(new TimerTask() { this.httpClient = newClient();
@Override this.connectionManagerTimer.schedule(new TimerTask() {
public void run() { @Override
if (SimpleHostRoutingFilter.this.connectionManager == null) { public void run() {
return; if (SimpleHostRoutingFilter.this.connectionManager == null) {
return;
}
SimpleHostRoutingFilter.this.connectionManager.closeExpiredConnections();
} }
SimpleHostRoutingFilter.this.connectionManager.closeExpiredConnections(); }, 30000, 5000);
} }
}, 30000, 5000);
} }
@PreDestroy @PreDestroy
@ -203,7 +218,9 @@ public class SimpleHostRoutingFilter extends ZuulFilter {
.setSocketTimeout(this.hostProperties.getSocketTimeoutMillis()) .setSocketTimeout(this.hostProperties.getSocketTimeoutMillis())
.setConnectTimeout(this.hostProperties.getConnectTimeoutMillis()) .setConnectTimeout(this.hostProperties.getConnectTimeoutMillis())
.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); .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, private CloseableHttpResponse forward(CloseableHttpClient httpclient, String verb,

12
spring-cloud-netflix-core/src/test/java/OkHttpClientConfigurationTests.java

@ -61,7 +61,7 @@ import static org.mockito.Mockito.mockingDetails;
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = OkHttpClientConfigurationTestApp.class, value = {"feign.okhttp.enabled: true", @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 @DirtiesContext
public class OkHttpClientConfigurationTests { public class OkHttpClientConfigurationTests {
@ -118,7 +118,6 @@ public class OkHttpClientConfigurationTests {
@Configuration @Configuration
@EnableAutoConfiguration @EnableAutoConfiguration
@RestController @RestController
//@EnableFeignClients(clients = {})
@EnableZuulProxy @EnableZuulProxy
class OkHttpClientConfigurationTestApp { class OkHttpClientConfigurationTestApp {
@ -135,10 +134,6 @@ class OkHttpClientConfigurationTestApp {
} }
static class MyOkHttpClientFactory extends DefaultOkHttpClientFactory { 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 @Configuration
@ -153,6 +148,11 @@ class OkHttpClientConfigurationTestApp {
return new MyOkHttpClientFactory(); return new MyOkHttpClientFactory();
} }
@Bean
public OkHttpClient client() {
return mock(OkHttpClient.class);
}
} }
@FeignClient(name="foo", serviceId = "foo") @FeignClient(name="foo", serviceId = "foo")

10
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.config.RegistryBuilder;
import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.CloseableHttpClient; 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.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHeader;
import org.junit.Test; import org.junit.Test;
@ -105,9 +106,6 @@ public class ApacheHttpClientConfigurationTests {
@Test @Test
public void testHttpClientSimpleHostRoutingFilter() { public void testHttpClientSimpleHostRoutingFilter() {
PoolingHttpClientConnectionManager connectionManager = getField(simpleHostRoutingFilter, "connectionManager");
MockingDetails connectionManagerDetails = mockingDetails(connectionManager);
assertTrue(connectionManagerDetails.isMock());
CloseableHttpClient httpClient = getField(simpleHostRoutingFilter, "httpClient"); CloseableHttpClient httpClient = getField(simpleHostRoutingFilter, "httpClient");
MockingDetails httpClientDetails = mockingDetails(httpClient); MockingDetails httpClientDetails = mockingDetails(httpClient);
assertTrue(httpClientDetails.isMock()); assertTrue(httpClientDetails.isMock());
@ -164,7 +162,7 @@ class ApacheHttpClientConfigurationTestApp {
static class MyApacheHttpClientFactory extends DefaultApacheHttpClientFactory { static class MyApacheHttpClientFactory extends DefaultApacheHttpClientFactory {
@Override @Override
public CloseableHttpClient createClient(RequestConfig requestConfig, HttpClientConnectionManager connectionManager) { public HttpClientBuilder createBuilder() {
CloseableHttpClient client = mock(CloseableHttpClient.class); CloseableHttpClient client = mock(CloseableHttpClient.class);
CloseableHttpResponse response = mock(CloseableHttpResponse.class); CloseableHttpResponse response = mock(CloseableHttpResponse.class);
StatusLine statusLine = mock(StatusLine.class); StatusLine statusLine = mock(StatusLine.class);
@ -177,7 +175,9 @@ class ApacheHttpClientConfigurationTestApp {
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
return client; HttpClientBuilder builder = mock(HttpClientBuilder.class);
doReturn(client).when(builder).build();
return builder;
} }
} }

2
spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/FeignHttpClientUrlTests.java

@ -58,7 +58,7 @@ import lombok.NoArgsConstructor;
@RunWith(SpringJUnit4ClassRunner.class) @RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = FeignHttpClientUrlTests.TestConfig.class, webEnvironment = WebEnvironment.DEFINED_PORT, value = { @SpringBootTest(classes = FeignHttpClientUrlTests.TestConfig.class, webEnvironment = WebEnvironment.DEFINED_PORT, value = {
"spring.application.name=feignclienturltest", "feign.hystrix.enabled=false", "spring.application.name=feignclienturltest", "feign.hystrix.enabled=false",
"feign.okhttp.enabled=false" }) "spring.cloud.httpclient.ok.enabled=false" })
@DirtiesContext @DirtiesContext
public class FeignHttpClientUrlTests { public class FeignHttpClientUrlTests {

4
spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationTests.java

@ -152,7 +152,7 @@ public class RibbonClientConfigurationTests {
@Test @Test
public void testDefaultsToApacheHttpClient() { public void testDefaultsToApacheHttpClient() {
testClient(RibbonLoadBalancingHttpClient.class, null, RestClient.class, OkHttpLoadBalancingClient.class); 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 @Test
@ -163,7 +163,7 @@ public class RibbonClientConfigurationTests {
@Test @Test
public void testEnableOkHttpClient() { 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); RestClient.class);
} }

3
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.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest; 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.commons.util.UtilAutoConfiguration;
import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration; import org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration;
import org.springframework.cloud.netflix.ribbon.test.TestLoadBalancer; import org.springframework.cloud.netflix.ribbon.test.TestLoadBalancer;
@ -102,7 +103,7 @@ public class RibbonClientPreprocessorPropertiesOverridesIntegrationTests {
@Configuration @Configuration
@RibbonClients @RibbonClients
@Import({ UtilAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, @Import({ UtilAutoConfiguration.class, HttpClientConfiguration.class, PropertyPlaceholderAutoConfiguration.class,
ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class }) ArchaiusAutoConfiguration.class, RibbonAutoConfiguration.class })
protected static class TestConfiguration { protected static class TestConfiguration {
} }

3
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.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory; 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.RibbonAutoConfiguration;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancedRetryPolicy; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancedRetryPolicy;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancedRetryPolicyFactory; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancedRetryPolicyFactory;
@ -437,7 +438,7 @@ public class RibbonLoadBalancingHttpClientTests {
IClientConfig configOverride, SpringClientFactory factory) IClientConfig configOverride, SpringClientFactory factory)
throws Exception { throws Exception {
factory.setApplicationContext(new AnnotationConfigApplicationContext( factory.setApplicationContext(new AnnotationConfigApplicationContext(HttpClientConfiguration.class,
RibbonAutoConfiguration.class, defaultConfigurationClass)); RibbonAutoConfiguration.class, defaultConfigurationClass));
String serviceName = "foo"; String serviceName = "foo";
String host = serviceName; String host = serviceName;

2
spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/okhttp/SpringRetryDisableOkHttpClientTests.java

@ -46,7 +46,7 @@ public class SpringRetryDisableOkHttpClientTests {
@Before @Before
public void setUp() { public void setUp() {
context = new SpringApplicationBuilder().web(false) context = new SpringApplicationBuilder().web(false)
.properties("spring.cloud.httpclient.ok.enabled=true") .properties("ribbon.okhttp.enabled=true")
.sources(RibbonAutoConfiguration.class, .sources(RibbonAutoConfiguration.class,
LoadBalancerAutoConfiguration.class, LoadBalancerAutoConfiguration.class,
HttpClientConfiguration.class, HttpClientConfiguration.class,

2
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 * @author Ryan Baxter
*/ */
@RunWith(SpringJUnit4ClassRunner.class) @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, @ContextConfiguration(classes = { RibbonAutoConfiguration.class,
HttpClientConfiguration.class, RibbonClientConfiguration.class, HttpClientConfiguration.class, RibbonClientConfiguration.class,
LoadBalancerAutoConfiguration.class }) LoadBalancerAutoConfiguration.class })

4
spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java

@ -43,7 +43,7 @@ public class ZuulProxyConfigurationTests {
@Test @Test
public void testDefaultsToApacheHttpClient() { public void testDefaultsToApacheHttpClient() {
testClient(HttpClientRibbonCommandFactory.class, null); testClient(HttpClientRibbonCommandFactory.class, null);
testClient(HttpClientRibbonCommandFactory.class, "spring.cloud.httpclient.apache.enable=true"); testClient(HttpClientRibbonCommandFactory.class, "ribbon.httpclient.enabled=true");
} }
@Test @Test
@ -53,7 +53,7 @@ public class ZuulProxyConfigurationTests {
@Test @Test
public void testEnableOkHttpClient() { 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) { void testClient(Class<?> clientType, String property) {

45
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.conn.HttpClientConnectionManager;
import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient; 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.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; 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.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 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.ApacheHttpClientConnectionManagerFactory;
import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory; import org.springframework.cloud.commons.httpclient.ApacheHttpClientFactory;
import org.springframework.cloud.commons.httpclient.DefaultApacheHttpClientFactory; 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.EnableZuulProxy;
import org.springframework.cloud.netflix.zuul.RoutesMvcEndpoint; import org.springframework.cloud.netflix.zuul.RoutesMvcEndpoint;
import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator;
@ -212,6 +216,7 @@ class SampleCustomZuulProxyApplication {
@Configuration @Configuration
@EnableZuulProxy @EnableZuulProxy
@AutoConfigureBefore({FeignRibbonClientAutoConfiguration.class})
protected static class CustomZuulProxyConfig { protected static class CustomZuulProxyConfig {
@Bean @Bean
@ -219,18 +224,25 @@ class SampleCustomZuulProxyApplication {
return new CustomApacheHttpClientFactory(); return new CustomApacheHttpClientFactory();
} }
@Bean
public CloseableHttpClient closeableClient() {
return HttpClients.custom()
.setDefaultCookieStore(new BasicCookieStore())
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT).build())
.build();
}
@Bean @Bean
public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper,
ZuulProperties zuulProperties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ZuulProperties zuulProperties, CloseableHttpClient httpClient) {
ApacheHttpClientFactory httpClientFactory) { return new CustomHostRoutingFilter(helper, zuulProperties, httpClient);
return new CustomHostRoutingFilter(helper, zuulProperties, connectionManagerFactory, httpClientFactory);
} }
private class CustomHostRoutingFilter extends SimpleHostRoutingFilter { private class CustomHostRoutingFilter extends SimpleHostRoutingFilter {
public CustomHostRoutingFilter(ProxyRequestHelper helper, public CustomHostRoutingFilter(ProxyRequestHelper helper,
ZuulProperties zuulProperties, ApacheHttpClientConnectionManagerFactory connectionManagerFactory, ZuulProperties zuulProperties, CloseableHttpClient httpClient) {
ApacheHttpClientFactory httpClientFactory) { super(helper, zuulProperties, httpClient);
super(helper, zuulProperties, connectionManagerFactory, httpClientFactory);
} }
@Override @Override
@ -242,14 +254,19 @@ class SampleCustomZuulProxyApplication {
private class CustomApacheHttpClientFactory extends DefaultApacheHttpClientFactory { private class CustomApacheHttpClientFactory extends DefaultApacheHttpClientFactory {
@Override //@Override
public CloseableHttpClient createClient(RequestConfig requestConfig, HttpClientConnectionManager connectionManager) { //public HttpClientBuilder createBuilder() {
return HttpClients.custom().setConnectionManager(connectionManager) // return HttpClients.custom()
.setDefaultCookieStore(new BasicCookieStore()) // .setDefaultCookieStore(new BasicCookieStore())
.setDefaultRequestConfig(RequestConfig.custom() // .setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.DEFAULT).build()) // .setCookieSpec(CookieSpecs.DEFAULT).build());
.build(); //}public CloseableHttpClient createClient(RequestConfig requestConfig, HttpClientConnectionManager connectionManager) {
} // return HttpClients.custom().setConnectionManager(connectionManager)
// .setDefaultCookieStore(new BasicCookieStore())
// .setDefaultRequestConfig(RequestConfig.custom()
// .setCookieSpec(CookieSpecs.DEFAULT).build())
// .build();
// }
} }
} }

4
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) @RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = RibbonRetryIntegrationTestBase.RetryableTestConfig.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, value = { @SpringBootTest(classes = RibbonRetryIntegrationTestBase.RetryableTestConfig.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, value = {
"zuul.retryable: false", /* Disable retry by default, have each route enable it */ "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 */ "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 */ "ribbon.ReadTimeout: 1000", /* Make sure ribbon will timeout before the thread is done sleeping */
"zuul.routes.retryable: /retryable/**", "zuul.routes.retryable: /retryable/**",
@ -48,8 +49,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
"disableretry.ribbon.MaxAutoRetriesNextServer: 1", "disableretry.ribbon.MaxAutoRetriesNextServer: 1",
"zuul.routes.globalretrydisabled: /globalretrydisabled/**", "zuul.routes.globalretrydisabled: /globalretrydisabled/**",
"globalretrydisabled.ribbon.MaxAutoRetries: 1", "globalretrydisabled.ribbon.MaxAutoRetries: 1",
"globalretrydisabled.ribbon.MaxAutoRetriesNextServer: 1", "globalretrydisabled.ribbon.MaxAutoRetriesNextServer: 1"
"spring.cloud.httpclient.ok.enabled: true"
}) })
@DirtiesContext @DirtiesContext
public class OkHttpRibbonRetryIntegrationTests extends RibbonRetryIntegrationTestBase { public class OkHttpRibbonRetryIntegrationTests extends RibbonRetryIntegrationTestBase {

Loading…
Cancel
Save