From fccbe1aff4eb96eb626cb39e3ad94cf5770bcbbd Mon Sep 17 00:00:00 2001 From: Thibaud Lepretre Date: Mon, 9 Jan 2017 23:13:36 +0100 Subject: [PATCH] Create `sidecar.hostname` and `sidecar.ipAddress` (#1561) In addition to `eureka.instance.hostname` property you can now defined `sidecar.hostname` in order to set different hostname from application and its sidecar. However if `eureka.instance.hostname` is present it will override `sidecar.hostname`. Fixes #981 --- .../netflix/sidecar/SidecarConfiguration.java | 31 +++++++++- .../netflix/sidecar/SidecarProperties.java | 4 ++ .../sidecar/SidecarApplicationTests.java | 61 +++++++++++++++---- .../src/test/resources/application.yml | 1 - 4 files changed, 80 insertions(+), 17 deletions(-) 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 17db83f5..a3b55124 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 @@ -20,6 +20,7 @@ import static org.springframework.cloud.commons.util.IdUtils.getDefaultInstanceI import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.bind.RelaxedPropertyResolver; @@ -35,9 +36,25 @@ import org.springframework.util.StringUtils; import com.netflix.appinfo.HealthCheckHandler; import com.netflix.discovery.EurekaClientConfig; +import java.net.InetAddress; +import java.net.UnknownHostException; + /** + * Sidecar Configuration that setting up {@link com.netflix.appinfo.EurekaInstanceConfig}. + *

+ * Depends on {@link SidecarProperties} and {@code eureka.instance.hostname} property. Since there is two way to + * configure hostname: + *

    + *
  1. {@code eureka.instance.hostname} property
  2. + *
  3. {@link SidecarProperties#hostname}
  4. + *
+ * {@code eureka.instance.hostname} will always win against {@link SidecarProperties#hostname} due to + * {@code @ConfigurationProperties("eureka.instance")} on {@link EurekaInstanceConfigBeanConfiguration}. + * * @author Spencer Gibb * @author Ryan Baxter + * + * @see EurekaInstanceConfigBeanConfiguration */ @Configuration @EnableConfigurationProperties @@ -80,13 +97,21 @@ public class SidecarConfiguration { int port = this.sidecarProperties.getPort(); config.setNonSecurePort(port); config.setInstanceId(getDefaultInstanceId(this.env)); - if(StringUtils.hasText(springAppName)) { + if (StringUtils.hasText(springAppName)) { config.setAppname(springAppName); config.setVirtualHostName(springAppName); config.setSecureVirtualHostName(springAppName); } - if (StringUtils.hasText(this.hostname)) { - config.setHostname(this.hostname); + String hostname = this.sidecarProperties.getHostname(); + String ipAddress = this.sidecarProperties.getIpAddress(); + if (!StringUtils.hasText(hostname) && StringUtils.hasText(this.hostname)) { + hostname = this.hostname; + } + if (StringUtils.hasText(hostname)) { + config.setHostname(hostname); + } + if (StringUtils.hasText(ipAddress)) { + config.setIpAddress(ipAddress); } String scheme = config.getSecurePortEnabled() ? "https" : "http"; config.setStatusPageUrl(scheme + "://" + config.getHostname() + ":" diff --git a/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarProperties.java b/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarProperties.java index 6b112d48..d7e17182 100644 --- a/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarProperties.java +++ b/spring-cloud-netflix-sidecar/src/main/java/org/springframework/cloud/netflix/sidecar/SidecarProperties.java @@ -40,4 +40,8 @@ public class SidecarProperties { @Min(1) private int port; + private String hostname; + + private String ipAddress; + } diff --git a/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java b/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java index 65761917..2a64dea7 100644 --- a/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java +++ b/spring-cloud-netflix-sidecar/src/test/java/org/springframework/cloud/netflix/sidecar/SidecarApplicationTests.java @@ -27,22 +27,57 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = SidecarApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { - "spring.application.name=mytest", "spring.cloud.client.hostname=mhhost", - "spring.application.instance_id=1", "eureka.instance.hostname=mhhost", - "sidecar.port=7000" }) public class SidecarApplicationTests { - @Autowired - EurekaInstanceConfigBean config; + @RunWith(SpringJUnit4ClassRunner.class) + @SpringBootTest(classes = SidecarApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=mytest", "spring.cloud.client.hostname=mhhost", "spring.application.instance_id=1", + "eureka.instance.hostname=mhhost", "sidecar.port=7000", "sidecar.ipAddress=127.0.0.1" }) + public static class EurekaTestConfigBeanTest { + @Autowired + EurekaInstanceConfigBean config; - @Test - public void testEurekaConfigBean() { - assertThat(this.config.getAppname(), equalTo("mytest")); - assertThat(this.config.getHostname(), equalTo("mhhost")); - assertThat(this.config.getInstanceId(), equalTo("mhhost:mytest:1")); - assertThat(this.config.getNonSecurePort(), equalTo(7000)); + @Test + public void testEurekaConfigBean() { + assertThat(this.config.getAppname(), equalTo("mytest")); + assertThat(this.config.getHostname(), equalTo("mhhost")); + assertThat(this.config.getInstanceId(), equalTo("mhhost:mytest:1")); + assertThat(this.config.getNonSecurePort(), equalTo(7000)); + } + } + + @RunWith(SpringJUnit4ClassRunner.class) + @SpringBootTest(classes = SidecarApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=mytest", "spring.cloud.client.hostname=mhhost", "spring.application.instance_id=1", + "sidecar.hostname=mhhost", "sidecar.port=7000", "sidecar.ipAddress=127.0.0.1" }) + public static class NewPropertyEurekaTestConfigBeanTest { + @Autowired + EurekaInstanceConfigBean config; + + @Test + public void testEurekaConfigBean() { + assertThat(this.config.getAppname(), equalTo("mytest")); + assertThat(this.config.getHostname(), equalTo("mhhost")); + assertThat(this.config.getInstanceId(), equalTo("mhhost:mytest:1")); + assertThat(this.config.getNonSecurePort(), equalTo(7000)); + } + } + + @RunWith(SpringJUnit4ClassRunner.class) + @SpringBootTest(classes = SidecarApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, value = { + "spring.application.name=mytest", "spring.cloud.client.hostname=mhhost", "spring.application.instance_id=1", + "eureka.instance.hostname=mhhost1", "sidecar.hostname=mhhost2", "sidecar.port=7000", "sidecar.ipAddress=127.0.0.1" }) + public static class BothPropertiesEurekaTestConfigBeanTest { + @Autowired + EurekaInstanceConfigBean config; + + @Test + public void testEurekaConfigBeanEurekaInstanceHostnamePropertyShouldBeUsed() { + assertThat(this.config.getAppname(), equalTo("mytest")); + assertThat(this.config.getHostname(), equalTo("mhhost1")); + assertThat(this.config.getInstanceId(), equalTo("mhhost:mytest:1")); + assertThat(this.config.getNonSecurePort(), equalTo(7000)); + } } } diff --git a/spring-cloud-netflix-sidecar/src/test/resources/application.yml b/spring-cloud-netflix-sidecar/src/test/resources/application.yml index c58d365c..d6dac53b 100644 --- a/spring-cloud-netflix-sidecar/src/test/resources/application.yml +++ b/spring-cloud-netflix-sidecar/src/test/resources/application.yml @@ -11,7 +11,6 @@ sidecar: eureka: instance: app-group-name: mysidecargroup - hostname: mysidecarhost client: serviceUrl: defaultZone: http://user:password@localhost:8761/eureka/