From 112987206133a5c82da0356c4920894a0bc36f46 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 30 Nov 2015 09:29:09 +0000 Subject: [PATCH] Default status page and health URLs if possible and where needed If the management.port is explicitly set to something other than the server.port, we can use it to set the status page and health URL default values. (They can still be overridden by config properties.) If management.port=0 there's not much we can do because we don't know the port number yet when the instance config is created. Fixes gh-425 --- .../eureka/EurekaClientAutoConfiguration.java | 17 +++++++++++++ .../EurekaClientAutoConfigurationTests.java | 24 +++++++++++++++++++ .../netflix/sidecar/SidecarConfiguration.java | 9 ++++--- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java index 0e72f4fe..072d2eda 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java @@ -46,6 +46,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.util.StringUtils; import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.appinfo.EurekaInstanceConfig; @@ -73,6 +74,12 @@ public class EurekaClientAutoConfiguration { @Value("${server.port:${SERVER_PORT:${PORT:8080}}}") int nonSecurePort; + @Value("${management.port:${MANAGEMENT_PORT:${PORT:8080}}}") + int managementPort; + + @Value("${eureka.instance.hostname:${EUREKA_INSTANCE_HOSTNAME:}}") + String hostname; + @Autowired ConfigurableEnvironment env; @@ -93,6 +100,16 @@ public class EurekaClientAutoConfiguration { EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(); instance.setNonSecurePort(this.nonSecurePort); instance.setInstanceId(getDefaultInstanceId(this.env)); + if (this.managementPort != this.nonSecurePort && this.managementPort != 0) { + if (StringUtils.hasText(this.hostname)) { + instance.setHostname(this.hostname); + } + String scheme = instance.getSecurePortEnabled() ? "https" : "http"; + instance.setStatusPageUrl(scheme + "://" + instance.getHostname() + ":" + + this.managementPort + instance.getStatusPageUrlPath()); + instance.setHealthCheckUrl(scheme + "://" + instance.getHostname() + ":" + + this.managementPort + instance.getHealthCheckUrlPath()); + } return instance; } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java index 6493e829..58b5ef14 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java @@ -21,12 +21,14 @@ import org.junit.Test; import org.springframework.aop.scope.ScopedProxyFactoryBean; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.EnvironmentTestUtils; import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.springframework.boot.test.EnvironmentTestUtils.addEnvironment; /** @@ -68,6 +70,28 @@ public class EurekaClientAutoConfigurationTests { this.context.getBeanDefinition("eurekaClient").getFactoryMethodName()); } + @Test + public void managementPort() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong status page: " + instance.getStatusPageUrl(), + instance.getStatusPageUrl().contains("9999")); + } + + @Test + public void hostname() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999", "eureka.instance.hostname=foo"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong status page: " + instance.getStatusPageUrl(), + instance.getStatusPageUrl().contains("foo")); + } + @Test public void refreshScopedBeans() { setupContext(RefreshAutoConfiguration.class); diff --git a/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarConfiguration.java b/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarConfiguration.java index ce02ef78..8c71135d 100644 --- a/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarConfiguration.java +++ b/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarConfiguration.java @@ -56,16 +56,19 @@ public class SidecarConfiguration { @Value("${server.port:${SERVER_PORT:${PORT:8080}}}") private int serverPort = 8080; + @Value("${management.port:${MANAGEMENT_PORT:${PORT:8080}}}") + private int managementPort = 8080; + @Bean public EurekaInstanceConfigBean eurekaInstanceConfigBean() { EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(); - int port = sidecarProperties.getPort(); + int port = this.sidecarProperties.getPort(); config.setNonSecurePort(port); String scheme = config.getSecurePortEnabled() ? "https" : "http"; config.setStatusPageUrl(scheme + "://" + config.getHostname() + ":" - + this.serverPort + config.getStatusPageUrlPath()); + + this.managementPort + config.getStatusPageUrlPath()); config.setHealthCheckUrl(scheme + "://" + config.getHostname() + ":" - + this.serverPort + config.getHealthCheckUrlPath()); + + this.managementPort + config.getHealthCheckUrlPath()); config.setHomePageUrl(scheme + "://" + config.getHostname() + ":" + port + config.getHomePageUrlPath()); return config;