From 2dfee97563b4a0658507add6984c152f5e2a7098 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Tue, 25 Oct 2016 12:56:08 -0400 Subject: [PATCH 1/2] Resolve spring.application.name value via a property resolver instead of @Value. Fixes #1398 --- .../eureka/EurekaClientAutoConfiguration.java | 8 +++++ .../eureka/EurekaInstanceConfigBean.java | 33 +++++++++---------- .../eureka/EurekaInstanceConfigBeanTests.java | 25 ++++++++++++-- .../netflix/sidecar/SidecarConfiguration.java | 13 ++++++-- 4 files changed, 57 insertions(+), 22 deletions(-) diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java index 9f6e5c26..0d678445 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java @@ -64,6 +64,7 @@ import static org.springframework.cloud.commons.util.IdUtils.getDefaultInstanceI * @author Spencer Gibb * @author Jon Schneider * @author Matt Jenkins + * @author Ryan Baxter */ @Configuration @EnableConfigurationProperties @@ -107,9 +108,16 @@ public class EurekaClientAutoConfiguration { @ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT) public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) { RelaxedPropertyResolver relaxedPropertyResolver = new RelaxedPropertyResolver(env, "eureka.instance."); + RelaxedPropertyResolver springPropertyResolver = new RelaxedPropertyResolver(env, "spring.application."); + String springAppName = springPropertyResolver.getProperty("name"); EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils); instance.setNonSecurePort(this.nonSecurePort); instance.setInstanceId(getDefaultInstanceId(this.env)); + if(springAppName != null) { + instance.setAppname(springAppName); + instance.setVirtualHostName(springAppName); + instance.setSecureVirtualHostName(springAppName); + } if (this.managementPort != this.nonSecurePort && this.managementPort != 0) { if (StringUtils.hasText(this.hostname)) { instance.setHostname(this.hostname); diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java index cf4cc185..dbbb0726 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java @@ -16,31 +16,31 @@ package org.springframework.cloud.netflix.eureka; -import java.util.HashMap; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.cloud.commons.util.InetUtils; -import org.springframework.cloud.commons.util.InetUtils.HostInfo; - -import com.netflix.appinfo.DataCenterInfo; -import com.netflix.appinfo.InstanceInfo.InstanceStatus; -import com.netflix.appinfo.MyDataCenterInfo; - import lombok.AccessLevel; import lombok.Data; import lombok.Getter; import lombok.Setter; +import java.util.HashMap; +import java.util.Map; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.cloud.commons.util.InetUtils.HostInfo; +import com.netflix.appinfo.DataCenterInfo; +import com.netflix.appinfo.InstanceInfo.InstanceStatus; +import com.netflix.appinfo.MyDataCenterInfo; + /** * @author Dave Syer * @author Spencer Gibb + * @author Ryan Baxter */ @Data @ConfigurationProperties("eureka.instance") public class EurekaInstanceConfigBean implements CloudEurekaInstanceConfig { + private static final String UNKNOWN = "unknown"; + @Getter(AccessLevel.PRIVATE) @Setter(AccessLevel.PRIVATE) private HostInfo hostInfo; @@ -52,8 +52,7 @@ public class EurekaInstanceConfigBean implements CloudEurekaInstanceConfig { /** * Get the name of the application to be registered with eureka. */ - @Value("${spring.application.name:unknown}") - private String appname = "unknown"; + private String appname = UNKNOWN; /** * Get the name of the application group to be registered with eureka. @@ -119,8 +118,7 @@ public class EurekaInstanceConfigBean implements CloudEurekaInstanceConfig { * virtual host name.Think of this as similar to the fully qualified domain name, that * the users of your services will need to find this instance. */ - @Value("${spring.application.name:unknown}") - private String virtualHostName; + private String virtualHostName = UNKNOWN; /** * Get the unique Id (within the scope of the appName) of this instance to be @@ -135,8 +133,7 @@ public class EurekaInstanceConfigBean implements CloudEurekaInstanceConfig { * secure virtual host name.Think of this as similar to the fully qualified domain * name, that the users of your services will need to find this instance. */ - @Value("${spring.application.name:unknown}") - private String secureVirtualHostName; + private String secureVirtualHostName = UNKNOWN; /** * Gets the AWS autoscaling group name associated with this instance. This information diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java index 0f3f99b6..bb745e2b 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java @@ -20,15 +20,17 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.cloud.commons.util.InetUtilsProperties; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.util.ReflectionTestUtils; - import com.netflix.appinfo.InstanceInfo.InstanceStatus; import static org.junit.Assert.assertEquals; @@ -38,6 +40,7 @@ import static org.springframework.boot.test.util.EnvironmentTestUtils.addEnviron /** * @author Dave Syer * @author Spencer Gibb + * @author Ryan Baxter */ public class EurekaInstanceConfigBeanTests { @@ -185,6 +188,14 @@ public class EurekaInstanceConfigBeanTests { } + @Test + public void testDefaultAppName() throws Exception { + setupContext(); + assertEquals("default app name is wrong", "unknown", getInstanceConfig().getAppname()); + assertEquals("default virtual hostname is wrong", "unknown", getInstanceConfig().getVirtualHostName()); + assertEquals("default secure virtual hostname is wrong", "unknown", getInstanceConfig().getSecureVirtualHostName()); + } + private void setupContext() { this.context.register(PropertyPlaceholderAutoConfiguration.class, TestConfiguration.class); @@ -198,9 +209,19 @@ public class EurekaInstanceConfigBeanTests { @Configuration @EnableConfigurationProperties protected static class TestConfiguration { + @Autowired + ConfigurableEnvironment env; @Bean public EurekaInstanceConfigBean eurekaInstanceConfigBean() { - return new EurekaInstanceConfigBean(new InetUtils(new InetUtilsProperties())); + EurekaInstanceConfigBean configBean = new EurekaInstanceConfigBean(new InetUtils(new InetUtilsProperties())); + RelaxedPropertyResolver springPropertyResolver = new RelaxedPropertyResolver(env, "spring.application."); + String springAppName = springPropertyResolver.getProperty("name"); + if(springAppName != null) { + configBean.setSecureVirtualHostName(springAppName); + configBean.setVirtualHostName(springAppName); + configBean.setAppname(springAppName); + } + return configBean; } } 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 52357293..17db83f5 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 @@ -16,10 +16,13 @@ package org.springframework.cloud.netflix.sidecar; +import static org.springframework.cloud.commons.util.IdUtils.getDefaultInstanceId; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.actuator.HasFeatures; import org.springframework.cloud.commons.util.InetUtils; @@ -32,10 +35,9 @@ import org.springframework.util.StringUtils; import com.netflix.appinfo.HealthCheckHandler; import com.netflix.discovery.EurekaClientConfig; -import static org.springframework.cloud.commons.util.IdUtils.getDefaultInstanceId; - /** * @author Spencer Gibb + * @author Ryan Baxter */ @Configuration @EnableConfigurationProperties @@ -73,9 +75,16 @@ public class SidecarConfiguration { @Bean public EurekaInstanceConfigBean eurekaInstanceConfigBean() { EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(inetUtils); + RelaxedPropertyResolver springPropertyResolver = new RelaxedPropertyResolver(env, "spring.application."); + String springAppName = springPropertyResolver.getProperty("name"); int port = this.sidecarProperties.getPort(); config.setNonSecurePort(port); config.setInstanceId(getDefaultInstanceId(this.env)); + if(StringUtils.hasText(springAppName)) { + config.setAppname(springAppName); + config.setVirtualHostName(springAppName); + config.setSecureVirtualHostName(springAppName); + } if (StringUtils.hasText(this.hostname)) { config.setHostname(this.hostname); } From 85b2fe37e235013df7d5fa052aacf37f9374ced3 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Tue, 25 Oct 2016 13:54:29 -0400 Subject: [PATCH 2/2] Added some additional tests --- .../eureka/EurekaClientAutoConfiguration.java | 2 +- .../EurekaClientAutoConfigurationTests.java | 17 +++++++++++++++++ .../eureka/EurekaInstanceConfigBeanTests.java | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java index 0d678445..46b0f1fd 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java @@ -113,7 +113,7 @@ public class EurekaClientAutoConfiguration { EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils); instance.setNonSecurePort(this.nonSecurePort); instance.setInstanceId(getDefaultInstanceId(this.env)); - if(springAppName != null) { + if(StringUtils.hasText(springAppName)) { instance.setAppname(springAppName); instance.setVirtualHostName(springAppName); instance.setSecureVirtualHostName(springAppName); diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java index c1a15915..5d97b598 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java @@ -189,6 +189,23 @@ public class EurekaClientAutoConfigurationTests { // Mockito.verify(http).addFilter(Matchers.any(HTTPBasicAuthFilter.class)); } + @Test + public void testDefaultAppName() throws Exception { + setupContext(); + assertEquals("unknown", getInstanceConfig().getAppname()); + assertEquals("unknown", getInstanceConfig().getVirtualHostName()); + assertEquals("unknown", getInstanceConfig().getSecureVirtualHostName()); + } + + @Test + public void testAppName() throws Exception { + EnvironmentTestUtils.addEnvironment(this.context, "spring.application.name=mytest"); + setupContext(); + assertEquals("mytest", getInstanceConfig().getAppname()); + assertEquals("mytest", getInstanceConfig().getVirtualHostName()); + assertEquals("mytest", getInstanceConfig().getSecureVirtualHostName()); + } + private void testNonSecurePort(String propName) { addEnvironment(this.context, propName + ":8888"); setupContext(); diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java index bb745e2b..284388dd 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java @@ -31,6 +31,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.test.util.ReflectionTestUtils; +import org.springframework.util.StringUtils; import com.netflix.appinfo.InstanceInfo.InstanceStatus; import static org.junit.Assert.assertEquals; @@ -216,7 +217,7 @@ public class EurekaInstanceConfigBeanTests { EurekaInstanceConfigBean configBean = new EurekaInstanceConfigBean(new InetUtils(new InetUtilsProperties())); RelaxedPropertyResolver springPropertyResolver = new RelaxedPropertyResolver(env, "spring.application."); String springAppName = springPropertyResolver.getProperty("name"); - if(springAppName != null) { + if(StringUtils.hasText(springAppName)) { configBean.setSecureVirtualHostName(springAppName); configBean.setVirtualHostName(springAppName); configBean.setAppname(springAppName);