Takes advantage of new builder pattern. Also reverted elimination of properties for feign and ribbon.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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 {}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<ApplicationEvent> zuulDiscoveryRefreshRoutesListener() {
|
||||
return new ZuulDiscoveryRefreshListener();
|
||||
|
||||
@@ -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();
|
||||
if (createNewClient) {
|
||||
try {
|
||||
SimpleHostRoutingFilter.this.httpClient.close();
|
||||
} catch (IOException ex) {
|
||||
log.error("error closing client", ex);
|
||||
}
|
||||
SimpleHostRoutingFilter.this.httpClient = newClient();
|
||||
}
|
||||
catch (IOException ex) {
|
||||
log.error("error closing client", ex);
|
||||
}
|
||||
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,
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 })
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user