From ccf8f86c8dfb9acd2b8c0166bd13a72b0ce4b233 Mon Sep 17 00:00:00 2001 From: Rico Pahlisch Date: Wed, 31 May 2017 12:04:09 +0200 Subject: [PATCH 01/10] use only default https ports for https check spring boot uses all high ports and there are some trouble if ports end with 443 (e.g. 24443, ...) --- .../cloud/netflix/ribbon/DefaultServerIntrospector.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java index a228544f..8c9053d6 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java @@ -16,7 +16,9 @@ package org.springframework.cloud.netflix.ribbon; +import java.util.Arrays; import java.util.Collections; +import java.util.List; import java.util.Map; import com.netflix.loadbalancer.Server; @@ -25,10 +27,11 @@ import com.netflix.loadbalancer.Server; * @author Spencer Gibb */ public class DefaultServerIntrospector implements ServerIntrospector { + private static final List SECURE_PORTS = Arrays.asList(443, 8443); + @Override public boolean isSecure(Server server) { - // Can we do better? - return (""+server.getPort()).endsWith("443"); + return SECURE_PORTS.contains(server.getPort()); } @Override From 7dbfe15d1a1484f5cc849f98aab1ca0c4185fd34 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 31 May 2017 14:22:15 -0400 Subject: [PATCH 02/10] Deprecates RetryableStatusCodeException in favor of the same class in s-c-commons --- pom.xml | 2 +- .../cloud/netflix/feign/ribbon/RetryableFeignLoadBalancer.java | 2 +- .../ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java | 2 +- .../ribbon/okhttp/RetryableOkHttpLoadBalancingClient.java | 2 +- .../netflix/ribbon/support/RetryableStatusCodeException.java | 3 +++ 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index eb24510a..7e2ccf62 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ ${basedir} 4.0.27.Final 2.7.3 - 1.2.1.BUILD-SNAPSHOT + 1.2.3.BUILD-SNAPSHOT 1.3.1.BUILD-SNAPSHOT Chelsea.BUILD-SNAPSHOT diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/RetryableFeignLoadBalancer.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/RetryableFeignLoadBalancer.java index ec1f665e..024dd978 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/RetryableFeignLoadBalancer.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/ribbon/RetryableFeignLoadBalancer.java @@ -26,10 +26,10 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryContext; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicy; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory; +import org.springframework.cloud.client.loadbalancer.RetryableStatusCodeException; import org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient; import org.springframework.cloud.netflix.ribbon.ServerIntrospector; -import org.springframework.cloud.netflix.ribbon.support.RetryableStatusCodeException; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; import org.springframework.retry.policy.NeverRetryPolicy; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java index fe3629a1..ebf35907 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/apache/RetryableRibbonLoadBalancingHttpClient.java @@ -25,11 +25,11 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryContext; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicy; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory; +import org.springframework.cloud.client.loadbalancer.RetryableStatusCodeException; import org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser; import org.springframework.cloud.netflix.feign.ribbon.FeignRetryPolicy; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient; import org.springframework.cloud.netflix.ribbon.ServerIntrospector; -import org.springframework.cloud.netflix.ribbon.support.RetryableStatusCodeException; import org.springframework.http.HttpRequest; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/okhttp/RetryableOkHttpLoadBalancingClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/okhttp/RetryableOkHttpLoadBalancingClient.java index eb7326c2..a61f2a74 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/okhttp/RetryableOkHttpLoadBalancingClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/okhttp/RetryableOkHttpLoadBalancingClient.java @@ -25,11 +25,11 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryContext; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicy; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicyFactory; +import org.springframework.cloud.client.loadbalancer.RetryableStatusCodeException; import org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser; import org.springframework.cloud.netflix.feign.ribbon.FeignRetryPolicy; import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient; import org.springframework.cloud.netflix.ribbon.ServerIntrospector; -import org.springframework.cloud.netflix.ribbon.support.RetryableStatusCodeException; import org.springframework.http.HttpRequest; import org.springframework.retry.RetryCallback; import org.springframework.retry.RetryContext; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/support/RetryableStatusCodeException.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/support/RetryableStatusCodeException.java index 03268158..afc857b5 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/support/RetryableStatusCodeException.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/support/RetryableStatusCodeException.java @@ -23,7 +23,10 @@ import java.io.IOException; /** * Exception to be thrown when the status code is deemed to be retryable. * @author Ryan Baxter + * @deprecated Use {@link org.springframework.cloud.client.loadbalancer.RetryableStatusCodeException} instead */ +//TODO Remove in Edgeware +@Deprecated public class RetryableStatusCodeException extends IOException { private static final String MESSAGE = "Service %s returned a status code of %d"; From cb3613db713d55ce957fdba5a479e4d5c9dc229e Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 31 May 2017 14:35:38 -0400 Subject: [PATCH 03/10] Fixing typo --- docs/src/main/asciidoc/spring-cloud-netflix.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/main/asciidoc/spring-cloud-netflix.adoc b/docs/src/main/asciidoc/spring-cloud-netflix.adoc index ab48c463..3b0dd846 100644 --- a/docs/src/main/asciidoc/spring-cloud-netflix.adoc +++ b/docs/src/main/asciidoc/spring-cloud-netflix.adoc @@ -1455,7 +1455,7 @@ the service-specific prefix from individual routes, e.g. stripPrefix: false ---- -NOTE: `zuul.stripPrefix` only applies to the prefix set in `zuul.prefix`. It does have any effect on prefixes +NOTE: `zuul.stripPrefix` only applies to the prefix set in `zuul.prefix`. It does not have any effect on prefixes defined within a given route's `path`. In this example, requests to "/myusers/101" will be forwarded to "/myusers/101" on the "users" service. From bdfbe3a87ef7d2b693d5ecb7dcf870d3ed53caed Mon Sep 17 00:00:00 2001 From: pahli Date: Wed, 31 May 2017 22:09:35 +0200 Subject: [PATCH 04/10] make secure ports for DefaultServerIntrospector configurable --- .../ribbon/DefaultServerIntrospector.java | 12 ++-- .../DefaultServerIntrospectorDefaultTest.java | 61 +++++++++++++++++++ .../ribbon/DefaultServerIntrospectorTest.java | 61 +++++++++++++++++++ 3 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java index 8c9053d6..11e515e7 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java @@ -16,22 +16,24 @@ package org.springframework.cloud.netflix.ribbon; -import java.util.Arrays; +import com.netflix.loadbalancer.Server; +import org.springframework.beans.factory.annotation.Value; + import java.util.Collections; import java.util.List; import java.util.Map; -import com.netflix.loadbalancer.Server; - /** * @author Spencer Gibb */ public class DefaultServerIntrospector implements ServerIntrospector { - private static final List SECURE_PORTS = Arrays.asList(443, 8443); + + @Value("#{T(java.util.Arrays).asList('${ribbon.securePorts:443,8443}')}") + private List securePorts; @Override public boolean isSecure(Server server) { - return SECURE_PORTS.contains(server.getPort()); + return securePorts.contains(server.getPort()); } @Override diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java new file mode 100644 index 00000000..0636d066 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2017 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 + * + * http://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.ribbon; + +import com.netflix.loadbalancer.Server; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Rico Pahlisch + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = DefaultServerIntrospectorDefaultTest.TestConfiguration.class) +public class DefaultServerIntrospectorDefaultTest { + + @Autowired + private ServerIntrospector serverIntrospector; + + @Test + public void testDefaultSslPorts(){ + Server serverMock = mock(Server.class); + when(serverMock.getPort()).thenReturn(443); + Assert.assertTrue(serverIntrospector.isSecure(serverMock)); + when(serverMock.getPort()).thenReturn(8443); + Assert.assertTrue(serverIntrospector.isSecure(serverMock)); + + when(serverMock.getPort()).thenReturn(16443); + Assert.assertFalse(serverIntrospector.isSecure(serverMock)); + } + + @Configuration + protected static class TestConfiguration { + @Bean + public DefaultServerIntrospector defaultServerIntrospector(){ + return new DefaultServerIntrospector(); + } + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java new file mode 100644 index 00000000..3bc9f404 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java @@ -0,0 +1,61 @@ +/* + * Copyright 2013-2017 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 + * + * http://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.ribbon; + +import com.netflix.loadbalancer.Server; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * @author Rico Pahlisch + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = DefaultServerIntrospectorTest.TestConfiguration.class) +@TestPropertySource(properties = { "ribbon.securePorts=12345" }) +public class DefaultServerIntrospectorTest { + + @Autowired + private ServerIntrospector serverIntrospector; + + @Test + public void testSecurePortConfiguration(){ + Server serverMock = mock(Server.class); + when(serverMock.getPort()).thenReturn(12345); + Assert.assertTrue(serverIntrospector.isSecure(serverMock)); + + when(serverMock.getPort()).thenReturn(443); + Assert.assertFalse(serverIntrospector.isSecure(serverMock)); + } + + @Configuration + protected static class TestConfiguration { + @Bean + public DefaultServerIntrospector defaultServerIntrospector(){ + return new DefaultServerIntrospector(); + } + } +} From 6d22a407cc5cc70e539d1b119caf427c6e1f054d Mon Sep 17 00:00:00 2001 From: pahli Date: Wed, 31 May 2017 22:25:51 +0200 Subject: [PATCH 05/10] use @ConfigurationProperties --- .../ribbon/DefaultServerIntrospector.java | 8 +++-- .../ribbon/ServerIntrospectorProperties.java | 32 +++++++++++++++++++ .../DefaultServerIntrospectorDefaultTest.java | 2 ++ .../ribbon/DefaultServerIntrospectorTest.java | 8 +++-- 4 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/ServerIntrospectorProperties.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java index 11e515e7..39ef4724 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java @@ -17,7 +17,9 @@ package org.springframework.cloud.netflix.ribbon; import com.netflix.loadbalancer.Server; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; import java.util.Collections; import java.util.List; @@ -28,12 +30,12 @@ import java.util.Map; */ public class DefaultServerIntrospector implements ServerIntrospector { - @Value("#{T(java.util.Arrays).asList('${ribbon.securePorts:443,8443}')}") - private List securePorts; + @Autowired + ServerIntrospectorProperties serverIntrospectorProperties; @Override public boolean isSecure(Server server) { - return securePorts.contains(server.getPort()); + return serverIntrospectorProperties.getSecurePorts().contains(server.getPort()); } @Override diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/ServerIntrospectorProperties.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/ServerIntrospectorProperties.java new file mode 100644 index 00000000..e5492f78 --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/ServerIntrospectorProperties.java @@ -0,0 +1,32 @@ +/* + * Copyright 2013-2017 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 + * + * http://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.ribbon; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.Arrays; +import java.util.List; + +/** + * @author Rico Pahlisch + */ +@Data +@ConfigurationProperties("ribbon") +public class ServerIntrospectorProperties { + private List securePorts = Arrays.asList(443,8443); +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java index 0636d066..d36945d8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorDefaultTest.java @@ -21,6 +21,7 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -52,6 +53,7 @@ public class DefaultServerIntrospectorDefaultTest { } @Configuration + @EnableConfigurationProperties(ServerIntrospectorProperties.class) protected static class TestConfiguration { @Bean public DefaultServerIntrospector defaultServerIntrospector(){ diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java index 3bc9f404..4e44a1e3 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospectorTest.java @@ -21,6 +21,8 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -35,7 +37,7 @@ import static org.mockito.Mockito.when; */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = DefaultServerIntrospectorTest.TestConfiguration.class) -@TestPropertySource(properties = { "ribbon.securePorts=12345" }) +@TestPropertySource(properties = { "ribbon.securePorts=12345,556" }) public class DefaultServerIntrospectorTest { @Autowired @@ -46,12 +48,14 @@ public class DefaultServerIntrospectorTest { Server serverMock = mock(Server.class); when(serverMock.getPort()).thenReturn(12345); Assert.assertTrue(serverIntrospector.isSecure(serverMock)); - + when(serverMock.getPort()).thenReturn(556); + Assert.assertTrue(serverIntrospector.isSecure(serverMock)); when(serverMock.getPort()).thenReturn(443); Assert.assertFalse(serverIntrospector.isSecure(serverMock)); } @Configuration + @EnableConfigurationProperties(ServerIntrospectorProperties.class) protected static class TestConfiguration { @Bean public DefaultServerIntrospector defaultServerIntrospector(){ From 71c906b00b0ebe3054f450945671fb7d39f15ea8 Mon Sep 17 00:00:00 2001 From: pahli Date: Wed, 31 May 2017 22:33:10 +0200 Subject: [PATCH 06/10] add private accessor --- .../cloud/netflix/ribbon/DefaultServerIntrospector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java index 39ef4724..7f37a3b3 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java @@ -31,7 +31,7 @@ import java.util.Map; public class DefaultServerIntrospector implements ServerIntrospector { @Autowired - ServerIntrospectorProperties serverIntrospectorProperties; + private ServerIntrospectorProperties serverIntrospectorProperties; @Override public boolean isSecure(Server server) { From a1d089038da249774c569843e1e245b9b7be1469 Mon Sep 17 00:00:00 2001 From: pahli Date: Wed, 31 May 2017 23:55:17 +0200 Subject: [PATCH 07/10] make property injection optional --- .../cloud/netflix/ribbon/DefaultServerIntrospector.java | 8 ++++++-- .../cloud/netflix/ribbon/RibbonAutoConfiguration.java | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java index 7f37a3b3..b4180e34 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/DefaultServerIntrospector.java @@ -30,8 +30,12 @@ import java.util.Map; */ public class DefaultServerIntrospector implements ServerIntrospector { - @Autowired - private ServerIntrospectorProperties serverIntrospectorProperties; + private ServerIntrospectorProperties serverIntrospectorProperties = new ServerIntrospectorProperties(); + + @Autowired(required = false) + public void setServerIntrospectorProperties(ServerIntrospectorProperties serverIntrospectorProperties){ + this.serverIntrospectorProperties = serverIntrospectorProperties; + } @Override public boolean isSecure(Server server) { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfiguration.java index 26b99997..8d03633c 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfiguration.java @@ -61,7 +61,7 @@ import com.netflix.ribbon.Ribbon; @RibbonClients @AutoConfigureAfter(name = "org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration") @AutoConfigureBefore({LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class}) -@EnableConfigurationProperties(RibbonEagerLoadProperties.class) +@EnableConfigurationProperties({RibbonEagerLoadProperties.class, ServerIntrospectorProperties.class}) public class RibbonAutoConfiguration { @Autowired(required = false) From 3773047a0685a75acba19bfb8d7ea4983c136233 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Thu, 1 Jun 2017 12:50:57 -0600 Subject: [PATCH 08/10] Bump to version 1.4.0.BUILD-SNAPSHOT --- docs/pom.xml | 2 +- pom.xml | 2 +- spring-cloud-netflix-core/pom.xml | 2 +- spring-cloud-netflix-dependencies/pom.xml | 2 +- spring-cloud-netflix-eureka-client/pom.xml | 2 +- spring-cloud-netflix-eureka-server/pom.xml | 2 +- spring-cloud-netflix-hystrix-amqp/pom.xml | 2 +- spring-cloud-netflix-hystrix-dashboard/pom.xml | 2 +- spring-cloud-netflix-hystrix-stream/pom.xml | 2 +- spring-cloud-netflix-sidecar/pom.xml | 2 +- spring-cloud-netflix-spectator/pom.xml | 2 +- spring-cloud-netflix-turbine-stream/pom.xml | 2 +- spring-cloud-netflix-turbine/pom.xml | 2 +- spring-cloud-starter-archaius/pom.xml | 2 +- spring-cloud-starter-atlas/pom.xml | 2 +- spring-cloud-starter-eureka-server/pom.xml | 2 +- spring-cloud-starter-eureka/pom.xml | 2 +- spring-cloud-starter-feign/pom.xml | 2 +- spring-cloud-starter-hystrix-dashboard/pom.xml | 2 +- spring-cloud-starter-hystrix/pom.xml | 2 +- spring-cloud-starter-ribbon/pom.xml | 2 +- spring-cloud-starter-spectator/pom.xml | 2 +- spring-cloud-starter-turbine-amqp/pom.xml | 2 +- spring-cloud-starter-turbine-stream/pom.xml | 2 +- spring-cloud-starter-turbine/pom.xml | 2 +- spring-cloud-starter-zuul/pom.xml | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index de673b88..0a4132d2 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT spring-cloud-netflix-docs pom diff --git a/pom.xml b/pom.xml index 7e2ccf62..56316631 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT pom Spring Cloud Netflix Spring Cloud Netflix diff --git a/spring-cloud-netflix-core/pom.xml b/spring-cloud-netflix-core/pom.xml index f4b834cf..cededf6f 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 - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-core diff --git a/spring-cloud-netflix-dependencies/pom.xml b/spring-cloud-netflix-dependencies/pom.xml index 41ff6134..944cb2cb 100644 --- a/spring-cloud-netflix-dependencies/pom.xml +++ b/spring-cloud-netflix-dependencies/pom.xml @@ -9,7 +9,7 @@ spring-cloud-netflix-dependencies - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT pom spring-cloud-netflix-dependencies Spring Cloud Netflix Dependencies diff --git a/spring-cloud-netflix-eureka-client/pom.xml b/spring-cloud-netflix-eureka-client/pom.xml index 7b35f695..ffc08ead 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 - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-eureka-client diff --git a/spring-cloud-netflix-eureka-server/pom.xml b/spring-cloud-netflix-eureka-server/pom.xml index afa2e3c2..9407ffcb 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 - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-eureka-server diff --git a/spring-cloud-netflix-hystrix-amqp/pom.xml b/spring-cloud-netflix-hystrix-amqp/pom.xml index 3ff30b5b..c85428e7 100644 --- a/spring-cloud-netflix-hystrix-amqp/pom.xml +++ b/spring-cloud-netflix-hystrix-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-hystrix-amqp diff --git a/spring-cloud-netflix-hystrix-dashboard/pom.xml b/spring-cloud-netflix-hystrix-dashboard/pom.xml index 424d8919..63c307db 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 - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. diff --git a/spring-cloud-netflix-hystrix-stream/pom.xml b/spring-cloud-netflix-hystrix-stream/pom.xml index ca5f3769..558c2e52 100644 --- a/spring-cloud-netflix-hystrix-stream/pom.xml +++ b/spring-cloud-netflix-hystrix-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-hystrix-stream diff --git a/spring-cloud-netflix-sidecar/pom.xml b/spring-cloud-netflix-sidecar/pom.xml index 94f9c4b2..f6dc64dd 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 - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-sidecar diff --git a/spring-cloud-netflix-spectator/pom.xml b/spring-cloud-netflix-spectator/pom.xml index b10b8eec..da2791d9 100644 --- a/spring-cloud-netflix-spectator/pom.xml +++ b/spring-cloud-netflix-spectator/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-spectator diff --git a/spring-cloud-netflix-turbine-stream/pom.xml b/spring-cloud-netflix-turbine-stream/pom.xml index b3e80045..e7c7b0da 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 - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-turbine-stream diff --git a/spring-cloud-netflix-turbine/pom.xml b/spring-cloud-netflix-turbine/pom.xml index 9c0ea64e..8f9e8240 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 - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-netflix-turbine diff --git a/spring-cloud-starter-archaius/pom.xml b/spring-cloud-starter-archaius/pom.xml index d7067dd9..293df891 100644 --- a/spring-cloud-starter-archaius/pom.xml +++ b/spring-cloud-starter-archaius/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-archaius diff --git a/spring-cloud-starter-atlas/pom.xml b/spring-cloud-starter-atlas/pom.xml index 4328ab78..bb7d8af0 100644 --- a/spring-cloud-starter-atlas/pom.xml +++ b/spring-cloud-starter-atlas/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-atlas diff --git a/spring-cloud-starter-eureka-server/pom.xml b/spring-cloud-starter-eureka-server/pom.xml index e6e975f9..66760de0 100644 --- a/spring-cloud-starter-eureka-server/pom.xml +++ b/spring-cloud-starter-eureka-server/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-eureka-server diff --git a/spring-cloud-starter-eureka/pom.xml b/spring-cloud-starter-eureka/pom.xml index 022f2e03..307968e1 100644 --- a/spring-cloud-starter-eureka/pom.xml +++ b/spring-cloud-starter-eureka/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-eureka diff --git a/spring-cloud-starter-feign/pom.xml b/spring-cloud-starter-feign/pom.xml index f2341c78..b8d67df0 100644 --- a/spring-cloud-starter-feign/pom.xml +++ b/spring-cloud-starter-feign/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-feign diff --git a/spring-cloud-starter-hystrix-dashboard/pom.xml b/spring-cloud-starter-hystrix-dashboard/pom.xml index f11a7c16..fcf72103 100644 --- a/spring-cloud-starter-hystrix-dashboard/pom.xml +++ b/spring-cloud-starter-hystrix-dashboard/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-hystrix-dashboard diff --git a/spring-cloud-starter-hystrix/pom.xml b/spring-cloud-starter-hystrix/pom.xml index 2b54dd36..80e7530f 100644 --- a/spring-cloud-starter-hystrix/pom.xml +++ b/spring-cloud-starter-hystrix/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-hystrix diff --git a/spring-cloud-starter-ribbon/pom.xml b/spring-cloud-starter-ribbon/pom.xml index dd41acef..e8e057d2 100644 --- a/spring-cloud-starter-ribbon/pom.xml +++ b/spring-cloud-starter-ribbon/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-ribbon diff --git a/spring-cloud-starter-spectator/pom.xml b/spring-cloud-starter-spectator/pom.xml index 69698243..7a762f2d 100644 --- a/spring-cloud-starter-spectator/pom.xml +++ b/spring-cloud-starter-spectator/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-spectator diff --git a/spring-cloud-starter-turbine-amqp/pom.xml b/spring-cloud-starter-turbine-amqp/pom.xml index cbfaa6ea..c7416444 100644 --- a/spring-cloud-starter-turbine-amqp/pom.xml +++ b/spring-cloud-starter-turbine-amqp/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-turbine-amqp diff --git a/spring-cloud-starter-turbine-stream/pom.xml b/spring-cloud-starter-turbine-stream/pom.xml index 13580acb..45a6a143 100644 --- a/spring-cloud-starter-turbine-stream/pom.xml +++ b/spring-cloud-starter-turbine-stream/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-turbine-stream diff --git a/spring-cloud-starter-turbine/pom.xml b/spring-cloud-starter-turbine/pom.xml index c36a1258..1cb3c1e7 100644 --- a/spring-cloud-starter-turbine/pom.xml +++ b/spring-cloud-starter-turbine/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-turbine diff --git a/spring-cloud-starter-zuul/pom.xml b/spring-cloud-starter-zuul/pom.xml index 76d046c3..b0c2b056 100644 --- a/spring-cloud-starter-zuul/pom.xml +++ b/spring-cloud-starter-zuul/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-netflix - 1.3.2.BUILD-SNAPSHOT + 1.4.0.BUILD-SNAPSHOT .. spring-cloud-starter-zuul From 31a3ff61e8297ee5d8b0cb8750cc43a52aaecff3 Mon Sep 17 00:00:00 2001 From: Biju Kunjummen Date: Thu, 1 Jun 2017 12:12:42 -0700 Subject: [PATCH 09/10] GH-1916: Spring Boot Auto-configuration based Zuul Server and Proxy (#1951) --- .../cloud/netflix/zuul/EnableZuulProxy.java | 5 +- .../cloud/netflix/zuul/EnableZuulServer.java | 5 +- ...n.java => ZuulProxyAutoConfiguration.java} | 10 ++- .../zuul/ZuulProxyMarkerConfiguration.java | 39 ++++++++++++ ....java => ZuulServerAutoConfiguration.java} | 5 +- .../zuul/ZuulServerMarkerConfiguration.java | 39 ++++++++++++ .../main/resources/META-INF/spring.factories | 4 +- .../zuul/ZuulProxyAutoConfigurationTests.java | 62 +++++++++++++++++++ .../zuul/ZuulProxyConfigurationTests.java | 6 +- .../ZuulServerAutoConfigurationTests.java | 62 +++++++++++++++++++ .../filters/CustomHostRoutingFilterTests.java | 20 +++++- .../ZuulEmptyMetricsApplicationTests.java | 7 ++- 12 files changed, 246 insertions(+), 18 deletions(-) rename spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/{ZuulProxyConfiguration.java => ZuulProxyAutoConfiguration.java} (93%) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyMarkerConfiguration.java rename spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/{ZuulConfiguration.java => ZuulServerAutoConfiguration.java} (97%) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulServerMarkerConfiguration.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfigurationTests.java create mode 100644 spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulServerAutoConfigurationTests.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulProxy.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulProxy.java index 73c1c835..f4766d97 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulProxy.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2015 the original author or authors. + * Copyright 2013-2017 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. @@ -34,11 +34,12 @@ import org.springframework.context.annotation.Import; * * @author Spencer Gibb * @author Dave Syer + * @author Biju Kunjummen */ @EnableCircuitBreaker @EnableDiscoveryClient @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -@Import(ZuulProxyConfiguration.class) +@Import(ZuulProxyMarkerConfiguration.class) public @interface EnableZuulProxy { } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulServer.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulServer.java index 6dc80970..6491e2bc 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulServer.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/EnableZuulServer.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2015 the original author or authors. + * Copyright 2013-2017 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. @@ -33,11 +33,12 @@ import org.springframework.context.annotation.Import; * @see EnableZuulProxy to see how to get reverse proxy out of the box * * @author Spencer Gibb + * @author Biju Kunjummen */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented -@Import(ZuulConfiguration.class) +@Import(ZuulServerMarkerConfiguration.class) public @interface EnableZuulServer { } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java similarity index 93% rename from spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfiguration.java rename to spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java index 3c41eb55..1f11d571 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2015 the original author or authors. + * Copyright 2013-2017 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. @@ -22,6 +22,7 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.trace.TraceRepository; +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; @@ -53,12 +54,14 @@ import org.springframework.context.annotation.Import; /** * @author Spencer Gibb * @author Dave Syer + * @author Biju Kunjummen */ @Configuration @Import({ RibbonCommandFactoryConfiguration.RestClientRibbonConfiguration.class, RibbonCommandFactoryConfiguration.OkHttpRibbonConfiguration.class, RibbonCommandFactoryConfiguration.HttpClientRibbonConfiguration.class }) -public class ZuulProxyConfiguration extends ZuulConfiguration { +@ConditionalOnBean(ZuulProxyMarkerConfiguration.Marker.class) +public class ZuulProxyAutoConfiguration extends ZuulServerAutoConfiguration { @SuppressWarnings("rawtypes") @Autowired(required = false) @@ -72,7 +75,7 @@ public class ZuulProxyConfiguration extends ZuulConfiguration { @Override public HasFeatures zuulFeature() { - return HasFeatures.namedFeature("Zuul (Discovery)", ZuulProxyConfiguration.class); + return HasFeatures.namedFeature("Zuul (Discovery)", ZuulProxyAutoConfiguration.class); } @Bean @@ -98,6 +101,7 @@ public class ZuulProxyConfiguration extends ZuulConfiguration { } @Bean + @ConditionalOnMissingBean(SimpleHostRoutingFilter.class) public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties zuulProperties) { return new SimpleHostRoutingFilter(helper, zuulProperties); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyMarkerConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyMarkerConfiguration.java new file mode 100644 index 00000000..0e88776c --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulProxyMarkerConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2017 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 + * + * http://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.zuul; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Responsible for adding in a marker bean to trigger activation of + * {@link ZuulServerAutoConfiguration} + * + * @author Biju Kunjummen + */ + +@Configuration +public class ZuulProxyMarkerConfiguration { + @Bean + public Marker zuulProxyMarkerBean() { + return new Marker(); + } + + class Marker { + } +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulServerAutoConfiguration.java similarity index 97% rename from spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java rename to spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulServerAutoConfiguration.java index 06b977da..4de557c3 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulServerAutoConfiguration.java @@ -74,9 +74,10 @@ import com.netflix.zuul.monitoring.TracerFactory; @Configuration @EnableConfigurationProperties({ ZuulProperties.class }) @ConditionalOnClass(ZuulServlet.class) +@ConditionalOnBean(ZuulServerMarkerConfiguration.Marker.class) // Make sure to get the ServerProperties from the same place as a normal web app would @Import(ServerPropertiesAutoConfiguration.class) -public class ZuulConfiguration { +public class ZuulServerAutoConfiguration { @Autowired protected ZuulProperties zuulProperties; @@ -89,7 +90,7 @@ public class ZuulConfiguration { @Bean public HasFeatures zuulFeature() { - return HasFeatures.namedFeature("Zuul (Simple)", ZuulConfiguration.class); + return HasFeatures.namedFeature("Zuul (Simple)", ZuulServerAutoConfiguration.class); } @Bean diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulServerMarkerConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulServerMarkerConfiguration.java new file mode 100644 index 00000000..93947877 --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulServerMarkerConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2017 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 + * + * http://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.zuul; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Responsible for adding in a marker bean to trigger activation of + * {@link ZuulServerAutoConfiguration} + * + * @author Biju Kunjummen + */ + +@Configuration +public class ZuulServerMarkerConfiguration { + @Bean + public Marker zuulServerMarkerBean() { + return new Marker(); + } + + class Marker { + } +} diff --git a/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories b/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories index 09988567..15f51830 100644 --- a/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories @@ -8,7 +8,9 @@ org.springframework.cloud.netflix.hystrix.HystrixAutoConfiguration,\ org.springframework.cloud.netflix.hystrix.security.HystrixSecurityAutoConfiguration,\ org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration,\ org.springframework.cloud.netflix.rx.RxJavaAutoConfiguration,\ -org.springframework.cloud.netflix.metrics.servo.ServoMetricsAutoConfiguration +org.springframework.cloud.netflix.metrics.servo.ServoMetricsAutoConfiguration,\ +org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration,\ +org.springframework.cloud.netflix.zuul.ZuulProxyAutoConfiguration org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker=\ org.springframework.cloud.netflix.hystrix.HystrixCircuitBreakerConfiguration diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfigurationTests.java new file mode 100644 index 00000000..5d4d1b7e --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyAutoConfigurationTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2017 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 + * + * http://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.zuul; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.netflix.zuul.filters.CompositeRouteLocator; +import org.springframework.cloud.netflix.zuul.filters.RouteLocator; +import org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * To test the auto-configuration of Zuul Proxy + * + * @author Biju Kunjummen + * + */ + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ZuulProxyAutoConfigurationTests { + + @Autowired + private RouteLocator routeLocator; + + @Autowired(required = false) + private RibbonRoutingFilter ribbonRoutingFilter; + + @Test + public void testAutoConfiguredBeans() { + assertThat(routeLocator).isInstanceOf(CompositeRouteLocator.class); + assertThat(this.ribbonRoutingFilter).isNotNull(); + } + + + @Configuration + @EnableAutoConfiguration + @EnableZuulProxy + static class TestConfig { + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java index 3779da11..48ca7300 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulProxyConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2016 the original author or authors. + * Copyright 2013-2017 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. @@ -36,6 +36,7 @@ import org.springframework.context.annotation.Bean; /** * @author Spencer Gibb + * @author Biju Kunjummen */ public class ZuulProxyConfigurationTests { @@ -60,7 +61,8 @@ public class ZuulProxyConfigurationTests { void testClient(Class clientType, String property) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - context.register(TestConfig.class, ZuulProxyConfiguration.class); + context.register(TestConfig.class, ZuulProxyMarkerConfiguration.class, + ZuulProxyAutoConfiguration.class); if (property != null) { EnvironmentTestUtils.addEnvironment(context, property); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulServerAutoConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulServerAutoConfigurationTests.java new file mode 100644 index 00000000..95c8f8c1 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulServerAutoConfigurationTests.java @@ -0,0 +1,62 @@ +/* + * Copyright 2017 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 + * + * http://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.zuul; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.netflix.zuul.filters.CompositeRouteLocator; +import org.springframework.cloud.netflix.zuul.filters.RouteLocator; +import org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * To test the auto-configuration of Zuul Proxy + * + * @author Biju Kunjummen + * + */ + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ZuulServerAutoConfigurationTests { + + @Autowired + private RouteLocator routeLocator; + + @Autowired(required = false) + private RibbonRoutingFilter ribbonRoutingFilter; + + @Test + public void testAutoConfiguredBeans() { + assertThat(routeLocator).isInstanceOf(CompositeRouteLocator.class); + assertThat(ribbonRoutingFilter).isNull(); + } + + + @Configuration + @EnableAutoConfiguration + @EnableZuulServer + static class TestConfig { + } +} diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java index 66982903..5ede40d0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/CustomHostRoutingFilterTests.java @@ -1,3 +1,19 @@ +/* + * Copyright 2016-2017 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 + * + * http://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.zuul.filters; import static junit.framework.TestCase.assertFalse; @@ -24,7 +40,6 @@ import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.cloud.netflix.zuul.RoutesMvcEndpoint; -import org.springframework.cloud.netflix.zuul.ZuulProxyConfiguration; import org.springframework.cloud.netflix.zuul.filters.discovery.DiscoveryClientRouteLocator; import org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter; import org.springframework.context.annotation.Bean; @@ -186,10 +201,9 @@ class SampleCustomZuulProxyApplication { @Configuration @EnableZuulProxy - protected static class CustomZuulProxyConfig extends ZuulProxyConfiguration { + protected static class CustomZuulProxyConfig { @Bean - @Override public SimpleHostRoutingFilter simpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties zuulProperties) { return new CustomHostRoutingFilter(helper, zuulProperties); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/metrics/ZuulEmptyMetricsApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/metrics/ZuulEmptyMetricsApplicationTests.java index e9f30573..e91d6c37 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/metrics/ZuulEmptyMetricsApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/metrics/ZuulEmptyMetricsApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013-2015 the original author or authors. + * Copyright 2013-2017 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. @@ -18,7 +18,8 @@ package org.springframework.cloud.netflix.zuul.metrics; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.cloud.ClassPathExclusions; -import org.springframework.cloud.netflix.zuul.ZuulConfiguration; +import org.springframework.cloud.netflix.zuul.ZuulServerAutoConfiguration; +import org.springframework.cloud.netflix.zuul.ZuulServerMarkerConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -42,7 +43,7 @@ public class ZuulEmptyMetricsApplicationTests { public void setUp() throws Exception { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.register(ZuulEmptyMetricsApplicationTestsConfiguration.class, - ZuulConfiguration.class); + ZuulServerMarkerConfiguration.class, ZuulServerAutoConfiguration.class); context.refresh(); this.context = context; From e08a6e8a486ada974da9754a4264650e17eefea6 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 5 Jun 2017 16:40:12 -0600 Subject: [PATCH 10/10] Move zuul host routing timeouts to boot properties. Previously, these were managed directly via archaius, but due to some combination of changes in boot 1.5.x (likely a tomcat change as zuul filters were initialzed in a servlet context listener) and Dalston, The filter was created before archaius could be initialized. The properties are backwards compatible and are in the `ZuulProperties.Host` object. fixes gh-1950 --- .../netflix/zuul/ZuulFilterInitializer.java | 19 +++++----- .../netflix/zuul/filters/ZuulProperties.java | 8 +++++ .../route/SimpleHostRoutingFilter.java | 36 +++++++++---------- .../zuul/ZuulFilterInitializerTests.java | 15 +++----- .../route/SimpleHostRoutingFilterTests.java | 26 ++++++++++++-- 5 files changed, 61 insertions(+), 43 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializer.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializer.java index 19ae0de0..2d347331 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializer.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializer.java @@ -19,8 +19,8 @@ package org.springframework.cloud.netflix.zuul; import java.lang.reflect.Field; import java.util.Map; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import org.springframework.util.ReflectionUtils; @@ -39,7 +39,7 @@ import lombok.extern.apachecommons.CommonsLog; * */ @CommonsLog -public class ZuulFilterInitializer implements ServletContextListener { +public class ZuulFilterInitializer { private final Map filters; private final CounterFactory counterFactory; @@ -59,10 +59,9 @@ public class ZuulFilterInitializer implements ServletContextListener { this.filterRegistry = filterRegistry; } - @Override - public void contextInitialized(ServletContextEvent sce) { - - log.info("Starting filter initializer context listener"); + @PostConstruct + public void contextInitialized() { + log.info("Starting filter initializer"); TracerFactory.initialize(tracerFactory); CounterFactory.initialize(counterFactory); @@ -72,9 +71,9 @@ public class ZuulFilterInitializer implements ServletContextListener { } } - @Override - public void contextDestroyed(ServletContextEvent sce) { - log.info("Stopping filter initializer context listener"); + @PreDestroy + public void contextDestroyed() { + log.info("Stopping filter initializer"); for (Map.Entry entry : this.filters.entrySet()) { filterRegistry.remove(entry.getKey()); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java index 3b808528..8c2d40ad 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java @@ -328,6 +328,14 @@ public class ZuulProperties { * The maximum number of connections that can be used by a single route. */ private int maxPerRouteConnections = 20; + /** + * The socket timeout in millis. Defaults to 10000. + */ + private int socketTimeoutMillis = 10000; + /** + * The connection timeout in millis. Defaults to 2000. + */ + private int connectTimeoutMillis = 2000; /** * The lifetime for the connection pool. */ diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java index 07d8b947..f6b9909c 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilter.java @@ -67,18 +67,17 @@ import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.apache.http.message.BasicHttpRequest; import org.apache.http.protocol.HttpContext; +import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.Host; import org.springframework.cloud.netflix.zuul.util.ZuulRuntimeException; +import org.springframework.context.event.EventListener; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; -import com.netflix.config.DynamicIntProperty; -import com.netflix.config.DynamicPropertyFactory; import com.netflix.zuul.ZuulFilter; -import com.netflix.zuul.constants.ZuulConstants; import com.netflix.zuul.context.RequestContext; import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.HTTPS_SCHEME; @@ -98,14 +97,6 @@ public class SimpleHostRoutingFilter extends ZuulFilter { private static final Log log = LogFactory.getLog(SimpleHostRoutingFilter.class); - private static final DynamicIntProperty SOCKET_TIMEOUT = DynamicPropertyFactory - .getInstance() - .getIntProperty(ZuulConstants.ZUUL_HOST_SOCKET_TIMEOUT_MILLIS, 10000); - - private static final DynamicIntProperty CONNECTION_TIMEOUT = DynamicPropertyFactory - .getInstance() - .getIntProperty(ZuulConstants.ZUUL_HOST_CONNECT_TIMEOUT_MILLIS, 2000); - private final Timer connectionManagerTimer = new Timer( "SimpleHostRoutingFilter.connectionManagerTimer", true); @@ -117,9 +108,18 @@ public class SimpleHostRoutingFilter extends ZuulFilter { private PoolingHttpClientConnectionManager connectionManager; private CloseableHttpClient httpClient; - private final Runnable clientloader = new Runnable() { - @Override - public void run() { + @EventListener + public void onPropertyChange(EnvironmentChangeEvent event) { + boolean createNewClient = false; + + for (String key : event.getKeys()) { + if (key.startsWith("zuul.host.")) { + createNewClient = true; + break; + } + } + + if (createNewClient) { try { SimpleHostRoutingFilter.this.httpClient.close(); } @@ -128,7 +128,7 @@ public class SimpleHostRoutingFilter extends ZuulFilter { } SimpleHostRoutingFilter.this.httpClient = newClient(); } - }; + } public SimpleHostRoutingFilter(ProxyRequestHelper helper, ZuulProperties properties) { this.helper = helper; @@ -141,8 +141,6 @@ public class SimpleHostRoutingFilter extends ZuulFilter { @PostConstruct private void initialize() { this.httpClient = newClient(); - SOCKET_TIMEOUT.addCallback(this.clientloader); - CONNECTION_TIMEOUT.addCallback(this.clientloader); this.connectionManagerTimer.schedule(new TimerTask() { @Override public void run() { @@ -251,8 +249,8 @@ public class SimpleHostRoutingFilter extends ZuulFilter { protected CloseableHttpClient newClient() { final RequestConfig requestConfig = RequestConfig.custom() - .setSocketTimeout(SOCKET_TIMEOUT.get()) - .setConnectTimeout(CONNECTION_TIMEOUT.get()) + .setSocketTimeout(this.hostProperties.getSocketTimeoutMillis()) + .setConnectTimeout(this.hostProperties.getConnectTimeoutMillis()) .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); HttpClientBuilder httpClientBuilder = HttpClients.custom(); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializerTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializerTests.java index 0abb2458..64e1ab71 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializerTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/ZuulFilterInitializerTests.java @@ -16,12 +16,12 @@ package org.springframework.cloud.netflix.zuul; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; -import javax.servlet.ServletContextEvent; - +import org.junit.Test; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.ReflectionUtils; @@ -31,10 +31,6 @@ import com.netflix.zuul.filters.FilterRegistry; import com.netflix.zuul.monitoring.CounterFactory; import com.netflix.zuul.monitoring.TracerFactory; -import org.junit.Test; - -import java.lang.reflect.Constructor; - import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -42,9 +38,6 @@ import static org.mockito.Mockito.mock; public class ZuulFilterInitializerTests { - private static final ServletContextEvent DUMMY_SERVLET_CONTEXT_EVENT = mock( - ServletContextEvent.class); - private Map filters = getFilters(); private CounterFactory counterFactory = mock(CounterFactory.class); private TracerFactory tracerFactory = mock(TracerFactory.class); @@ -56,7 +49,7 @@ public class ZuulFilterInitializerTests { @Test public void shouldSetupOnContextInitializedEvent() throws Exception { - initializer.contextInitialized(DUMMY_SERVLET_CONTEXT_EVENT); + initializer.contextInitialized(); assertEquals(tracerFactory, TracerFactory.instance()); assertEquals(counterFactory, CounterFactory.instance()); @@ -66,7 +59,7 @@ public class ZuulFilterInitializerTests { @Test public void shouldCleanupOnContextDestroyed() throws Exception { - initializer.contextDestroyed(DUMMY_SERVLET_CONTEXT_EVENT); + initializer.contextDestroyed(); assertEquals(null, ReflectionTestUtils.getField(TracerFactory.class, "INSTANCE")); assertEquals(null, diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java index 6d813b87..f7cd9c53 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/route/SimpleHostRoutingFilterTests.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.lang.reflect.Field; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.Collections; import java.util.concurrent.TimeUnit; import java.util.zip.GZIPOutputStream; @@ -46,6 +47,7 @@ import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoCon import org.springframework.boot.context.embedded.LocalServerPort; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -54,6 +56,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.ReflectionUtils; import org.springframework.web.bind.annotation.PathVariable; @@ -76,8 +79,7 @@ import static org.springframework.util.StreamUtils.copyToString; @RunWith(SpringRunner.class) @SpringBootTest(classes = SampleApplication.class, webEnvironment = RANDOM_PORT, - properties = {"server.contextPath: /app", "zuul.host.socket-timeout-millis=11000", - "zuul.host.connect-timeout-millis=2100"}) + properties = {"server.contextPath: /app"}) @DirtiesContext public class SimpleHostRoutingFilterTests { @@ -95,6 +97,8 @@ public class SimpleHostRoutingFilterTests { @Test public void timeoutPropertiesAreApplied() { + addEnvironment(this.context, "zuul.host.socket-timeout-millis=11000", + "zuul.host.connect-timeout-millis=2100"); setupContext(); CloseableHttpClient httpClient = getFilter().newClient(); Assertions.assertThat(httpClient).isInstanceOf(Configurable.class); @@ -188,6 +192,17 @@ public class SimpleHostRoutingFilterTests { assertTrue("Get 1".equals(responseString)); } + @Test + public void zuulHostKeysUpdateHttpClient() { + setupContext(); + SimpleHostRoutingFilter filter = getFilter(); + CloseableHttpClient httpClient = (CloseableHttpClient) ReflectionTestUtils.getField(filter, "httpClient"); + EnvironmentChangeEvent event = new EnvironmentChangeEvent(Collections.singleton("zuul.host.mykey")); + filter.onPropertyChange(event); + CloseableHttpClient newhttpClient = (CloseableHttpClient) ReflectionTestUtils.getField(filter, "httpClient"); + Assertions.assertThat(httpClient).isNotEqualTo(newhttpClient); + } + private void setupContext() { this.context.register(PropertyPlaceholderAutoConfiguration.class, TestConfiguration.class); @@ -199,8 +214,13 @@ public class SimpleHostRoutingFilterTests { } @Configuration - @EnableConfigurationProperties(ZuulProperties.class) + @EnableConfigurationProperties protected static class TestConfiguration { + @Bean + ZuulProperties zuulProperties() { + return new ZuulProperties(); + } + @Bean SimpleHostRoutingFilter simpleHostRoutingFilter(ZuulProperties zuulProperties) { return new SimpleHostRoutingFilter(new ProxyRequestHelper(), zuulProperties);