diff --git a/docs/pom.xml b/docs/pom.xml index 177586100..310e2738d 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-netflix-docs pom diff --git a/docs/src/main/asciidoc/spring-cloud-netflix.adoc b/docs/src/main/asciidoc/spring-cloud-netflix.adoc index 3e8578819..667e2f5dc 100755 --- a/docs/src/main/asciidoc/spring-cloud-netflix.adoc +++ b/docs/src/main/asciidoc/spring-cloud-netflix.adoc @@ -773,6 +773,10 @@ Then visit `/hystrix` and point the dashboard to an individual instance's `/hyst NOTE: When connecting to a `/hystrix.stream` endpoint that uses HTTPS, the certificate used by the server must be trusted by the JVM. If the certificate is not trusted, you must import the certificate into the JVM in order for the Hystrix Dashboard to make a successful connection to the stream endpoint. +NOTE: In order to use the `/proxy.stream` endpoint you must configure a list of hosts to allow connections to. To set the +list of allowed hosts use `hystrix.dashboard.proxyStreamAllowList`. You can use an Ant-style pattern in the host name to +match against a wider range of host names. + === Turbine Looking at an individual instance's Hystrix data is not very useful in terms of the overall health of the system. https://github.com/Netflix/Turbine[Turbine] is an application that aggregates all of the relevant `/hystrix.stream` endpoints into a combined `/turbine.stream` for use in the Hystrix Dashboard. diff --git a/pom.xml b/pom.xml index 9983be32b..02a496fac 100644 --- a/pom.xml +++ b/pom.xml @@ -3,14 +3,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT pom Spring Cloud Netflix Spring Cloud Netflix org.springframework.cloud spring-cloud-build - 2.3.1.BUILD-SNAPSHOT + 2.3.2.BUILD-SNAPSHOT @@ -21,9 +21,9 @@ netflix - 2.2.4.BUILD-SNAPSHOT - 2.2.4.BUILD-SNAPSHOT - Horsham.SR5 + 2.2.5.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT + Horsham.SR7 2.2.1.RELEASE diff --git a/spring-cloud-netflix-archaius/pom.xml b/spring-cloud-netflix-archaius/pom.xml index 39e2aef2c..e47c38262 100644 --- a/spring-cloud-netflix-archaius/pom.xml +++ b/spring-cloud-netflix-archaius/pom.xml @@ -6,7 +6,7 @@ spring-cloud-netflix org.springframework.cloud - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. diff --git a/spring-cloud-netflix-concurrency-limits/pom.xml b/spring-cloud-netflix-concurrency-limits/pom.xml index 4c44c3e41..4bf630155 100644 --- a/spring-cloud-netflix-concurrency-limits/pom.xml +++ b/spring-cloud-netflix-concurrency-limits/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-concurrency-limits diff --git a/spring-cloud-netflix-core/pom.xml b/spring-cloud-netflix-core/pom.xml index 56d868c69..3a9e6baf6 100644 --- a/spring-cloud-netflix-core/pom.xml +++ b/spring-cloud-netflix-core/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-core diff --git a/spring-cloud-netflix-dependencies/pom.xml b/spring-cloud-netflix-dependencies/pom.xml index 833a20f18..1b892418a 100644 --- a/spring-cloud-netflix-dependencies/pom.xml +++ b/spring-cloud-netflix-dependencies/pom.xml @@ -5,18 +5,18 @@ spring-cloud-dependencies-parent org.springframework.cloud - 2.3.1.BUILD-SNAPSHOT + 2.3.2.BUILD-SNAPSHOT spring-cloud-netflix-dependencies - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT pom spring-cloud-netflix-dependencies Spring Cloud Netflix Dependencies 0.7.6 0.1.12 - 1.9.21 + 1.9.25 0.3.0 1.5.18 2.3.0 diff --git a/spring-cloud-netflix-eureka-client-tls-tests/pom.xml b/spring-cloud-netflix-eureka-client-tls-tests/pom.xml index a1fe4c08e..649b6885d 100644 --- a/spring-cloud-netflix-eureka-client-tls-tests/pom.xml +++ b/spring-cloud-netflix-eureka-client-tls-tests/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-eureka-client-tls-tests diff --git a/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java b/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java index b224ecb0c..f4bb62115 100644 --- a/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java +++ b/spring-cloud-netflix-eureka-client-tls-tests/src/test/java/org/springframework/cloud/netflix/eureka/BaseCertTest.java @@ -23,7 +23,7 @@ import java.security.KeyStore; import org.junit.BeforeClass; -public class BaseCertTest { +public abstract class BaseCertTest { protected static final String KEY_STORE_PASSWORD = "test-key-store-password"; @@ -41,6 +41,9 @@ public class BaseCertTest { protected static File wrongClientCert; + protected BaseCertTest() { + } + @BeforeClass public static void createCertificates() throws Exception { KeyTool tool = new KeyTool(); diff --git a/spring-cloud-netflix-eureka-client/pom.xml b/spring-cloud-netflix-eureka-client/pom.xml index c572a300b..0a1dffb15 100644 --- a/spring-cloud-netflix-eureka-client/pom.xml +++ b/spring-cloud-netflix-eureka-client/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-eureka-client diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java index 88300bcc7..5b5b32aa9 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java @@ -23,6 +23,7 @@ import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -35,6 +36,7 @@ import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClient import org.springframework.cloud.netflix.eureka.http.WebClientDiscoveryClientOptionalArgs; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; /** * @author Daniel Lavoie @@ -46,7 +48,8 @@ public class DiscoveryClientOptionalArgsConfiguration { @Autowired private TlsProperties tls; - protected final Log logger = LogFactory.getLog(getClass()); + protected static final Log logger = LogFactory + .getLog(DiscoveryClientOptionalArgsConfiguration.class); @Bean @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter") @@ -62,24 +65,6 @@ public class DiscoveryClientOptionalArgsConfiguration { return result; } - @Bean - @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter") - @ConditionalOnClass( - name = "org.springframework.web.reactive.function.client.WebClient") - @ConditionalOnMissingBean( - value = { AbstractDiscoveryClientOptionalArgs.class, - RestTemplateDiscoveryClientOptionalArgs.class }, - search = SearchStrategy.CURRENT) - @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", - havingValue = "true") - public WebClientDiscoveryClientOptionalArgs webClientDiscoveryClientOptionalArgs() - throws GeneralSecurityException, IOException { - logger.info("Eureka HTTP Client uses WebClient."); - WebClientDiscoveryClientOptionalArgs result = new WebClientDiscoveryClientOptionalArgs(); - setupTLS(result); - return result; - } - @Bean @ConditionalOnClass(name = "com.sun.jersey.api.client.filter.ClientFilter") @ConditionalOnMissingBean(value = AbstractDiscoveryClientOptionalArgs.class, @@ -99,6 +84,40 @@ public class DiscoveryClientOptionalArgsConfiguration { } } + @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter") + @ConditionalOnClass( + name = "org.springframework.web.reactive.function.client.WebClient") + @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", + havingValue = "true") + protected static class WebClientConfiguration { + + @Autowired + private TlsProperties tls; + + @Bean + @ConditionalOnMissingBean( + value = { AbstractDiscoveryClientOptionalArgs.class, + RestTemplateDiscoveryClientOptionalArgs.class }, + search = SearchStrategy.CURRENT) + public WebClientDiscoveryClientOptionalArgs webClientDiscoveryClientOptionalArgs( + ObjectProvider builder) + throws GeneralSecurityException, IOException { + logger.info("Eureka HTTP Client uses WebClient."); + WebClientDiscoveryClientOptionalArgs result = new WebClientDiscoveryClientOptionalArgs( + builder::getIfAvailable); + setupTLS(result); + return result; + } + + private void setupTLS(AbstractDiscoveryClientOptionalArgs args) + throws GeneralSecurityException, IOException { + if (tls.isEnabled()) { + args.setSSLContext(tls.createSSLContext()); + } + } + + } + @Configuration @ConditionalOnMissingClass({ "com.sun.jersey.api.client.filter.ClientFilter", "org.springframework.web.reactive.function.client.WebClient" }) diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java index bced10eb3..f2e6f4018 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java @@ -29,10 +29,14 @@ import com.netflix.discovery.shared.transport.EurekaHttpResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.SearchStrategy; +import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration; +import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.config.client.ConfigServerInstanceProvider; @@ -48,6 +52,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.http.HttpStatus; import org.springframework.util.StringUtils; +import org.springframework.web.reactive.function.client.WebClient; /** * Bootstrap configuration for config client that wants to lookup the config server via @@ -72,18 +77,6 @@ public class EurekaConfigServerBootstrapConfiguration { return new EurekaClientConfigBean(); } - @Bean - @ConditionalOnMissingBean(EurekaHttpClient.class) - @ConditionalOnClass( - name = "org.springframework.web.reactive.function.client.WebClient") - @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", - havingValue = "true") - public WebClientEurekaHttpClient configDiscoveryWebClientEurekaHttpClient( - EurekaClientConfigBean config, Environment env) { - return (WebClientEurekaHttpClient) new WebClientTransportClientFactory() - .newClient(new DefaultEndpoint(getEurekaUrl(config, env))); - } - @Bean @ConditionalOnMissingBean(EurekaHttpClient.class) @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", @@ -94,7 +87,7 @@ public class EurekaConfigServerBootstrapConfiguration { .newClient(new DefaultEndpoint(getEurekaUrl(config, env))); } - private String getEurekaUrl(EurekaClientConfigBean config, Environment env) { + private static String getEurekaUrl(EurekaClientConfigBean config, Environment env) { List urls = EndpointUtils.getDiscoveryServiceUrls(config, EurekaClientConfigBean.DEFAULT_ZONE, new HostnameBasedUrlRandomizer( env.getProperty("eureka.instance.hostname"))); @@ -170,4 +163,25 @@ public class EurekaConfigServerBootstrapConfiguration { } + @Configuration(proxyBeanMethods = false) + @ConditionalOnClass( + name = "org.springframework.web.reactive.function.client.WebClient") + @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", + havingValue = "true") + @ImportAutoConfiguration({ CodecsAutoConfiguration.class, + WebClientAutoConfiguration.class }) + protected static class WebClientConfiguration { + + @Bean + @ConditionalOnMissingBean(EurekaHttpClient.class) + public WebClientEurekaHttpClient configDiscoveryWebClientEurekaHttpClient( + EurekaClientConfigBean config, ObjectProvider builder, + Environment env) { + return (WebClientEurekaHttpClient) new WebClientTransportClientFactory( + builder::getIfAvailable) + .newClient(new DefaultEndpoint(getEurekaUrl(config, env))); + } + + } + } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java index 19d30ba1e..90680daaf 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java @@ -16,8 +16,12 @@ package org.springframework.cloud.netflix.eureka.http; +import java.util.function.Supplier; + import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; +import org.springframework.web.reactive.function.client.WebClient; + /** * @author Daniel Lavoie * @author Haytham Mohamed @@ -25,8 +29,13 @@ import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; public class WebClientDiscoveryClientOptionalArgs extends AbstractDiscoveryClientOptionalArgs { + @Deprecated public WebClientDiscoveryClientOptionalArgs() { - setTransportClientFactories(new WebClientTransportClientFactories()); + this(WebClient::builder); + } + + public WebClientDiscoveryClientOptionalArgs(Supplier builder) { + setTransportClientFactories(new WebClientTransportClientFactories(builder)); } } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java index 397e949ac..dd7b6785d 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClient.java @@ -209,6 +209,10 @@ public class WebClientEurekaHttpClient implements EurekaHttpClient { // Nothing to do } + public WebClient getWebClient() { + return this.webClient; + } + private static Map headersOf(ClientResponse response) { ClientResponse.Headers httpHeaders = response.headers(); if (httpHeaders == null) { diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java index d35ce4ec7..22cc2d1d0 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactories.java @@ -18,6 +18,7 @@ package org.springframework.cloud.netflix.eureka.http; import java.util.Collection; import java.util.Optional; +import java.util.function.Supplier; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; @@ -28,12 +29,20 @@ import com.netflix.discovery.shared.transport.TransportClientFactory; import com.netflix.discovery.shared.transport.jersey.EurekaJerseyClient; import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; +import org.springframework.web.reactive.function.client.WebClient; + /** * @author Daniel Lavoie * @author Haytham Mohamed */ public class WebClientTransportClientFactories implements TransportClientFactories { + private final Supplier builder; + + public WebClientTransportClientFactories(Supplier builder) { + this.builder = builder; + } + @Override public TransportClientFactory newTransportClientFactory( Collection additionalFilters, EurekaJerseyClient providedJerseyClient) { @@ -44,7 +53,7 @@ public class WebClientTransportClientFactories implements TransportClientFactori public TransportClientFactory newTransportClientFactory( EurekaClientConfig clientConfig, Collection additionalFilters, InstanceInfo myInstanceInfo) { - return new WebClientTransportClientFactory(); + return new WebClientTransportClientFactory(builder); } @Override @@ -53,7 +62,7 @@ public class WebClientTransportClientFactories implements TransportClientFactori final Collection additionalFilters, final InstanceInfo myInstanceInfo, final Optional sslContext, final Optional hostnameVerifier) { - return new WebClientTransportClientFactory(); + return new WebClientTransportClientFactory(builder); } } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java index fa6de993a..95f49f346 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactory.java @@ -18,6 +18,7 @@ package org.springframework.cloud.netflix.eureka.http; import java.net.URI; import java.net.URISyntaxException; +import java.util.function.Supplier; import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -41,13 +42,13 @@ import reactor.core.publisher.Mono; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.codec.ClientCodecConfigurer; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ExchangeFilterFunction; import org.springframework.web.reactive.function.client.ExchangeFilterFunctions; -import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; /** @@ -60,17 +61,29 @@ import org.springframework.web.reactive.function.client.WebClient; */ public class WebClientTransportClientFactory implements TransportClientFactory { + private final Supplier builderSupplier; + + @Deprecated + public WebClientTransportClientFactory() { + this(WebClient::builder); + } + + public WebClientTransportClientFactory(Supplier builderSupplier) { + this.builderSupplier = builderSupplier; + } + @Override - public EurekaHttpClient newClient(EurekaEndpoint serviceUrl) { - WebClient.Builder builder = of(serviceUrl.getServiceUrl()); - this.setExchangeStrategies(builder); - this.skipHttp400Error(builder); + public EurekaHttpClient newClient(EurekaEndpoint endpoint) { + // we want a copy to modify. Don't change the original + WebClient.Builder builder = this.builderSupplier.get().clone(); + setUrl(builder, endpoint.getServiceUrl()); + setCodecs(builder); + builder.filter(http4XxErrorExchangeFilterFunction()); return new WebClientEurekaHttpClient(builder.build()); } - private WebClient.Builder of(String serviceUrl) { + private WebClient.Builder setUrl(WebClient.Builder builder, String serviceUrl) { String url = serviceUrl; - WebClient.Builder builder = WebClient.builder(); try { URI serviceURI = new URI(serviceUrl); if (serviceURI.getUserInfo() != null) { @@ -88,23 +101,17 @@ public class WebClientTransportClientFactory implements TransportClientFactory { return builder.baseUrl(url); } - private void setExchangeStrategies(WebClient.Builder builder) { + private void setCodecs(WebClient.Builder builder) { ObjectMapper objectMapper = objectMapper(); - ExchangeStrategies strategies = ExchangeStrategies.builder() - .codecs(clientDefaultCodecsConfigurer -> { - clientDefaultCodecsConfigurer.defaultCodecs() - .jackson2JsonEncoder(new Jackson2JsonEncoder(objectMapper, - MediaType.APPLICATION_JSON)); - clientDefaultCodecsConfigurer.defaultCodecs() - .jackson2JsonDecoder(new Jackson2JsonDecoder(objectMapper, - MediaType.APPLICATION_JSON)); + builder.codecs(configurer -> { + ClientCodecConfigurer.ClientDefaultCodecs defaults = configurer + .defaultCodecs(); + defaults.jackson2JsonEncoder( + new Jackson2JsonEncoder(objectMapper, MediaType.APPLICATION_JSON)); + defaults.jackson2JsonDecoder( + new Jackson2JsonDecoder(objectMapper, MediaType.APPLICATION_JSON)); - }).build(); - builder.exchangeStrategies(strategies); - } - - private void skipHttp400Error(WebClient.Builder builder) { - builder.filter(http4XxErrorExchangeFilterFunction()); + }); } // Skip over 4xx http errors @@ -114,9 +121,8 @@ public class WebClientTransportClientFactory implements TransportClientFactory { if (clientResponse.statusCode().value() == 400) { ClientResponse newResponse = ClientResponse.from(clientResponse) .statusCode(HttpStatus.OK).build(); - newResponse.body((clientHttpResponse, context) -> { - return clientHttpResponse.getBody(); - }); + newResponse.body( + (clientHttpResponse, context) -> clientHttpResponse.getBody()); return Mono.just(newResponse); } return Mono.just(clientResponse); diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests.java new file mode 100644 index 000000000..17179473c --- /dev/null +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests.java @@ -0,0 +1,84 @@ +/* + * Copyright 2013-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.netflix.eureka.config; + +import org.junit.jupiter.api.Test; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.cloud.netflix.eureka.http.WebClientEurekaHttpClient; +import org.springframework.http.HttpStatus; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.reactive.function.client.ClientResponse; +import org.springframework.web.reactive.function.client.WebClient; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +/** + * @author Spencer Gibb + */ +@SpringBootTest(properties = { "spring.cloud.config.discovery.enabled=true", + "eureka.client.webclient.enabled=true", + "spring.codec.max-in-memory-size=310000" }, webEnvironment = RANDOM_PORT) +public class EurekaConfigServerBootstrapConfigurationWebClientIntegrationTests { + + @LocalServerPort + private int port; + + @Autowired + private WebClientEurekaHttpClient eurekaHttpClient; + + @Test + public void webClientRespectsCodecProperties() { + WebClient webClient = eurekaHttpClient.getWebClient(); + ClientResponse response = webClient.get().uri("http://localhost:" + port) + .exchange().block(); + assertThat(response).isNotNull(); + assertThat(response.statusCode()).isEqualTo(HttpStatus.OK); + assertThat(response.bodyToMono(String.class).block()).startsWith("....") + .hasSize(300000); + } + + @SpringBootConfiguration + @EnableAutoConfiguration + @RestController + static class WebClientController extends WebSecurityConfigurerAdapter { + + @GetMapping + public String hello() { + StringBuilder s = new StringBuilder(); + for (int i = 0; i < 300000; i++) { + s.append("."); + } + return s.toString(); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests().anyRequest().permitAll().and().csrf().disable(); + } + + } + +} diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java index baaa2239a..5f356cca7 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientEurekaHttpClientTest.java @@ -29,6 +29,7 @@ import org.springframework.cloud.commons.util.InetUtils; import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.reactive.function.client.WebClient; /** * @author Daniel Lavoie @@ -49,7 +50,7 @@ public class WebClientEurekaHttpClientTest extends AbstractEurekaHttpClientTest @Before public void setup() { - eurekaHttpClient = new WebClientTransportClientFactory() + eurekaHttpClient = new WebClientTransportClientFactory(WebClient::builder) .newClient(new DefaultEndpoint(serviceUrl)); EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils); diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java index 234b0fed0..21437dbb0 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoriesTest.java @@ -18,6 +18,8 @@ package org.springframework.cloud.netflix.eureka.http; import org.junit.Test; +import org.springframework.web.reactive.function.client.WebClient; + /** * @author Daniel Lavoie */ @@ -25,7 +27,8 @@ public class WebClientTransportClientFactoriesTest { @Test(expected = UnsupportedOperationException.class) public void testJerseyIsUnsuported() { - new WebClientTransportClientFactories().newTransportClientFactory(null, null); + new WebClientTransportClientFactories(WebClient::builder) + .newTransportClientFactory(null, null); } } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java index 949d4085f..24363f8a7 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/WebClientTransportClientFactoryTest.java @@ -21,6 +21,8 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.springframework.web.reactive.function.client.WebClient; + /** * @author Daniel Lavoie */ @@ -30,7 +32,7 @@ public class WebClientTransportClientFactoryTest { @Before public void setup() { - transportClientFatory = new WebClientTransportClientFactory(); + transportClientFatory = new WebClientTransportClientFactory(WebClient::builder); } @Test diff --git a/spring-cloud-netflix-eureka-server/pom.xml b/spring-cloud-netflix-eureka-server/pom.xml index 0857a5ab7..693152602 100644 --- a/spring-cloud-netflix-eureka-server/pom.xml +++ b/spring-cloud-netflix-eureka-server/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-eureka-server diff --git a/spring-cloud-netflix-hystrix-contract/pom.xml b/spring-cloud-netflix-hystrix-contract/pom.xml index abf0cbba5..d54f78f78 100644 --- a/spring-cloud-netflix-hystrix-contract/pom.xml +++ b/spring-cloud-netflix-hystrix-contract/pom.xml @@ -5,11 +5,11 @@ org.springframework.cloud spring-cloud-build - 2.3.0.RELEASE + 2.3.1.RELEASE spring-cloud-netflix-hystrix-contract - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT jar spring-cloud-netflix-hystrix-contract Spring Cloud Netflix Hystrix Contract diff --git a/spring-cloud-netflix-hystrix-dashboard/pom.xml b/spring-cloud-netflix-hystrix-dashboard/pom.xml index 003f6de8c..18d9fa7bd 100644 --- a/spring-cloud-netflix-hystrix-dashboard/pom.xml +++ b/spring-cloud-netflix-hystrix-dashboard/pom.xml @@ -8,7 +8,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. diff --git a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java index 9e0fa7431..4775881d9 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java +++ b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfiguration.java @@ -19,7 +19,10 @@ package org.springframework.cloud.netflix.hystrix.dashboard; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; import java.util.Map; +import java.util.Optional; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; @@ -47,6 +50,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.ui.freemarker.SpringTemplateLoader; +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; /** @@ -88,8 +93,9 @@ public class HystrixDashboardConfiguration { } @Bean - public ServletRegistrationBean proxyStreamServlet() { - final ProxyStreamServlet proxyStreamServlet = new ProxyStreamServlet(); + public ServletRegistrationBean proxyStreamServlet( + HystrixDashboardProperties properties) { + final ProxyStreamServlet proxyStreamServlet = new ProxyStreamServlet(properties); proxyStreamServlet.setEnableIgnoreConnectionCloseHeader( this.dashboardProperties.isEnableIgnoreConnectionCloseHeader()); final ServletRegistrationBean registration = new ServletRegistrationBean( @@ -118,6 +124,8 @@ public class HystrixDashboardConfiguration { private boolean enableIgnoreConnectionCloseHeader = false; + private HystrixDashboardProperties properties; + public void setEnableIgnoreConnectionCloseHeader( boolean enableIgnoreConnectionCloseHeader) { this.enableIgnoreConnectionCloseHeader = enableIgnoreConnectionCloseHeader; @@ -125,6 +133,11 @@ public class HystrixDashboardConfiguration { public ProxyStreamServlet() { super(); + this.properties = new HystrixDashboardProperties(); + } + + public ProxyStreamServlet(HystrixDashboardProperties properties) { + this.properties = properties; } /** @@ -169,10 +182,18 @@ public class HystrixDashboardConfiguration { url.append(key).append("=").append(value); } } - String proxyUrl = url.toString(); - log.info("\n\nProxy opening connection to: " + proxyUrl + "\n\n"); + String proxyUrlString = url.toString(); + + if (!isAllowedToProxy(proxyUrlString)) { + log.warn("Origin parameter: " + origin + + " is not in the allowed list of proxy host names. If it " + + "should be allowed add it to hystrix.dashboard.proxyStreamAllowList."); + return; + } + + log.info("\n\nProxy opening connection to: " + proxyUrlString + "\n\n"); try { - httpget = new HttpGet(proxyUrl); + httpget = new HttpGet(proxyUrlString); HttpClient client = ProxyConnectionManager.httpClient; HttpResponse httpResponse = client.execute(httpget); int statusCode = httpResponse.getStatusLine().getStatusCode(); @@ -218,7 +239,7 @@ public class HystrixDashboardConfiguration { } } else { - log.warn("Failed opening connection to " + proxyUrl + " : " + log.warn("Failed opening connection to " + proxyUrlString + " : " + statusCode + " : " + httpResponse.getStatusLine()); } } @@ -250,6 +271,22 @@ public class HystrixDashboardConfiguration { } + private boolean isAllowedToProxy(String proxyUrlString) + throws MalformedURLException { + + URL proxyUrl = new URL(proxyUrlString); + String host = proxyUrl.getHost(); + PathMatcher pathMatcher = new AntPathMatcher("."); + Optional optionalPattern = properties.getProxyStreamAllowList() + .stream().filter(pattern -> pathMatcher.match(pattern, host)) + .findFirst(); + + if (optionalPattern.isPresent()) { + return true; + } + return false; + } + private void copyHeadersToServletResponse(Header[] headers, HttpServletResponse response) { for (Header header : headers) { diff --git a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java index 932f7aa8c..9145135f0 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java +++ b/spring-cloud-netflix-hystrix-dashboard/src/main/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardProperties.java @@ -16,7 +16,10 @@ package org.springframework.cloud.netflix.hystrix.dashboard; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -41,6 +44,20 @@ public class HystrixDashboardProperties { */ private Map initParameters = new HashMap<>(); + private List proxyStreamAllowList = new ArrayList<>(); + + public List getProxyStreamAllowList() { + return proxyStreamAllowList; + } + + public void setProxyStreamAllowList(List proxyStreamAllowList) { + this.proxyStreamAllowList = proxyStreamAllowList; + } + + public void setProxyStreamAllowList(String... regex) { + this.proxyStreamAllowList = Arrays.asList(regex); + } + public boolean isEnableIgnoreConnectionCloseHeader() { return enableIgnoreConnectionCloseHeader; } diff --git a/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh b/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh index 36b67a640..9f684fbb2 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh +++ b/spring-cloud-netflix-hystrix-dashboard/src/main/resources/templates/hystrix/monitor.ftlh @@ -107,8 +107,8 @@ } } console.log("Command Stream: " + commandStream) - - $(window).load(function() { // within load with a setTimeout to prevent the infinite spinner + + $(window).on("load", function () { // within load with a setTimeout to prevent the infinite spinner setTimeout(function() { if(commandStream == undefined) { console.log("commandStream is undefined") @@ -146,7 +146,7 @@ // thread pool var dependencyThreadPoolMonitor = new HystrixThreadPoolMonitor('dependencyThreadPools'); - $(window).load(function() { // within load with a setTimeout to prevent the infinite spinner + $(window).on("load", function () { // within load with a setTimeout to prevent the infinite spinner setTimeout(function() { if(poolStream == undefined) { console.log("poolStream is undefined") diff --git a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java index 8245745ef..928ae2b7b 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java +++ b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardConfigurationTests.java @@ -41,7 +41,8 @@ public class HystrixDashboardConfigurationTests { MockHttpServletResponse response = new MockHttpServletResponse(); Header[] headers = new Header[1]; headers[0] = new BasicHeader("Content-Type", "text/proxy.stream"); - HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(); + HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet( + new HystrixDashboardProperties()); ReflectionTestUtils.invokeMethod(proxyStreamServlet, "copyHeadersToServletResponse", headers, response); assertThat(response.getHeaderNames().size()).isEqualTo(1); @@ -54,7 +55,8 @@ public class HystrixDashboardConfigurationTests { Header[] headers = new Header[2]; headers[0] = new BasicHeader("Content-Type", "text/proxy.stream"); headers[1] = new BasicHeader("Connection", "close"); - HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(); + HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet( + new HystrixDashboardProperties()); ReflectionTestUtils.invokeMethod(proxyStreamServlet, "copyHeadersToServletResponse", headers, response); assertThat(response.getHeaderNames().size()).isEqualTo(2); @@ -68,7 +70,8 @@ public class HystrixDashboardConfigurationTests { Header[] headers = new Header[2]; headers[0] = new BasicHeader("Content-Type", "text/proxy.stream"); headers[1] = new BasicHeader("Connection", "close"); - HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(); + HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet( + new HystrixDashboardProperties()); proxyStreamServlet.setEnableIgnoreConnectionCloseHeader(true); ReflectionTestUtils.invokeMethod(proxyStreamServlet, "copyHeadersToServletResponse", headers, response); @@ -83,7 +86,8 @@ public class HystrixDashboardConfigurationTests { Header[] headers = new Header[2]; headers[0] = new BasicHeader("Content-Type", "text/proxy.stream"); headers[1] = new BasicHeader("Connection", "close"); - HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet(); + HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet( + new HystrixDashboardProperties()); proxyStreamServlet.setEnableIgnoreConnectionCloseHeader(false); ReflectionTestUtils.invokeMethod(proxyStreamServlet, "copyHeadersToServletResponse", headers, response); @@ -111,4 +115,39 @@ public class HystrixDashboardConfigurationTests { }); } + @Test + public void allowedHostsTest() { + HystrixDashboardProperties properties = new HystrixDashboardProperties(); + HystrixDashboardConfiguration.ProxyStreamServlet proxyStreamServlet = new HystrixDashboardConfiguration.ProxyStreamServlet( + properties); + boolean allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, + "isAllowedToProxy", "http://foo.com"); + assertThat(allowed).isFalse(); + + properties.setProxyStreamAllowList("foo.com", "bar.*", "*world.com"); + allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy", + "http://user:password@foo.com"); + assertThat(allowed).isTrue(); + + allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy", + "http://bar.com"); + assertThat(allowed).isTrue(); + + allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy", + "http://bar.org"); + assertThat(allowed).isTrue(); + + allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy", + "http://helloworld.com"); + assertThat(allowed).isTrue(); + + allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy", + "http://world.com"); + assertThat(allowed).isTrue(); + + allowed = ReflectionTestUtils.invokeMethod(proxyStreamServlet, "isAllowedToProxy", + "http://world.org"); + assertThat(allowed).isFalse(); + } + } diff --git a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java index 6b2ff058f..1b3456593 100644 --- a/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java +++ b/spring-cloud-netflix-hystrix-dashboard/src/test/java/org/springframework/cloud/netflix/hystrix/dashboard/HystrixDashboardHomePageTests.java @@ -67,6 +67,7 @@ public class HystrixDashboardHomePageTests { ResponseEntity entity = new TestRestTemplate().getForEntity( "http://localhost:" + this.port + "/hystrix/monitor", String.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(entity.getBody()).contains("on(\"load\""); } @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-netflix-hystrix-stream/pom.xml b/spring-cloud-netflix-hystrix-stream/pom.xml index 86975fe44..c1017309f 100644 --- a/spring-cloud-netflix-hystrix-stream/pom.xml +++ b/spring-cloud-netflix-hystrix-stream/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-hystrix-stream diff --git a/spring-cloud-netflix-hystrix/pom.xml b/spring-cloud-netflix-hystrix/pom.xml index 2f7a13de4..19cd5fbdb 100644 --- a/spring-cloud-netflix-hystrix/pom.xml +++ b/spring-cloud-netflix-hystrix/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-hystrix diff --git a/spring-cloud-netflix-ribbon/pom.xml b/spring-cloud-netflix-ribbon/pom.xml index c5a5de0aa..9cfe6bbd2 100644 --- a/spring-cloud-netflix-ribbon/pom.xml +++ b/spring-cloud-netflix-ribbon/pom.xml @@ -5,7 +5,7 @@ spring-cloud-netflix org.springframework.cloud - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. 4.0.0 diff --git a/spring-cloud-netflix-sidecar/pom.xml b/spring-cloud-netflix-sidecar/pom.xml index e9f5cd232..38356ae18 100644 --- a/spring-cloud-netflix-sidecar/pom.xml +++ b/spring-cloud-netflix-sidecar/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-sidecar diff --git a/spring-cloud-netflix-turbine-stream/pom.xml b/spring-cloud-netflix-turbine-stream/pom.xml index 0409250d0..3d0387a18 100644 --- a/spring-cloud-netflix-turbine-stream/pom.xml +++ b/spring-cloud-netflix-turbine-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-turbine-stream diff --git a/spring-cloud-netflix-turbine/pom.xml b/spring-cloud-netflix-turbine/pom.xml index 675f0e98e..0924ab7f4 100644 --- a/spring-cloud-netflix-turbine/pom.xml +++ b/spring-cloud-netflix-turbine/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-netflix-turbine diff --git a/spring-cloud-netflix-zuul/pom.xml b/spring-cloud-netflix-zuul/pom.xml index 545a40cc6..0689e2e6f 100644 --- a/spring-cloud-netflix-zuul/pom.xml +++ b/spring-cloud-netflix-zuul/pom.xml @@ -6,7 +6,7 @@ spring-cloud-netflix org.springframework.cloud - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. diff --git a/spring-cloud-starter-netflix/pom.xml b/spring-cloud-starter-netflix/pom.xml index a646b47d8..669362e6a 100644 --- a/spring-cloud-starter-netflix/pom.xml +++ b/spring-cloud-starter-netflix/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT .. spring-cloud-starter-netflix diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml index 8c59bfd92..40089bb19 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-archaius/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-archaius Spring Cloud Starter Netflix Archaius diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml index ae1c5da85..7812ce208 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-client/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-eureka-client Spring Cloud Starter Netflix Eureka Client diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml index 756b4f6ea..eee911c44 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-eureka-server/pom.xml @@ -3,7 +3,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-eureka-server Spring Cloud Starter Netflix Eureka Server diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml index e362fb8f3..8c6c481be 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix-dashboard/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-hystrix-dashboard Spring Cloud Starter Netflix Hystrix Dashboard diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml index 3823c7517..7cbdf5b56 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-hystrix/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-hystrix Spring Cloud Starter Netflix Hystrix diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml index d26d13cb0..454c6dea6 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-ribbon/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-ribbon Spring Cloud Starter Netflix Ribbon diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml index 3bebef9b8..7a932a9da 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine-stream/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-turbine-stream Spring Cloud Starter Netflix Turbine Stream diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml index 27ada3d40..4b8ed4e06 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-turbine/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-turbine Spring Cloud Starter Netflix Turbine diff --git a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml index 78cce918a..24eee2308 100644 --- a/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml +++ b/spring-cloud-starter-netflix/spring-cloud-starter-netflix-zuul/pom.xml @@ -4,7 +4,7 @@ org.springframework.cloud spring-cloud-starter-netflix - 2.2.4.BUILD-SNAPSHOT + 2.2.5.BUILD-SNAPSHOT spring-cloud-starter-netflix-zuul Spring Cloud Starter Netflix Zuul