From 9e40714e3cf15817725c84eed1f41f7a20282794 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 7 Aug 2015 18:17:59 -0600 Subject: [PATCH] Use the first non-loopback address for host/ip addr fixes gh-468 --- .../eureka/EurekaInstanceConfigBean.java | 35 ++++++++++++++++--- .../eureka/EurekaInstanceConfigBeanTests.java | 10 +----- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java index 92969e1f..f40468a9 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java @@ -16,8 +16,11 @@ package org.springframework.cloud.netflix.eureka; +import java.io.IOException; +import java.net.Inet4Address; import java.net.InetAddress; -import java.net.UnknownHostException; +import java.net.NetworkInterface; +import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @@ -38,6 +41,7 @@ import com.netflix.appinfo.UniqueIdentifier; /** * @author Dave Syer + * @author Spencer Gibb */ @Data @ConfigurationProperties("eureka.instance") @@ -114,14 +118,35 @@ public class EurekaInstanceConfigBean implements EurekaInstanceConfig { private HostInfo initHostInfo() { this.hostInfo = this.hostInfo == null ? new HostInfo() : this.hostInfo; + + InetAddress address = getFirstNonLoopbackAddress(); + this.hostInfo.ipAddress = address.getHostAddress(); + this.hostInfo.hostname = address.getHostName(); + + return this.hostInfo; + } + + //TODO: move this method to s-c-commons + static InetAddress getFirstNonLoopbackAddress() { try { - this.hostInfo.ipAddress = InetAddress.getLocalHost().getHostAddress(); - this.hostInfo.hostname = InetAddress.getLocalHost().getHostName(); + for (Enumeration enumNic = NetworkInterface.getNetworkInterfaces(); + enumNic.hasMoreElements(); ) { + NetworkInterface ifc = enumNic.nextElement(); + if (ifc.isUp()) { + for (Enumeration enumAddr = ifc.getInetAddresses(); + enumAddr.hasMoreElements(); ) { + InetAddress address = enumAddr.nextElement(); + if (address instanceof Inet4Address && !address.isLoopbackAddress()) { + return address; + } + } + } + } } - catch (UnknownHostException ex) { + catch (IOException ex) { logger.error("Cannot get host info", ex); } - return this.hostInfo; + return null; } public void setHostname(String hostname) { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java index da18bb30..52bba0a8 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java @@ -20,9 +20,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.springframework.boot.test.EnvironmentTestUtils.addEnvironment; -import java.net.InetAddress; -import java.net.UnknownHostException; - import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -46,12 +43,7 @@ public class EurekaInstanceConfigBeanTests { @Before public void init() { - try { - this.hostName = InetAddress.getLocalHost().getHostName(); - } - catch (UnknownHostException e) { - // Ignore (test must be running in a restricted environment) - } + this.hostName = EurekaInstanceConfigBean.getFirstNonLoopbackAddress().getHostName(); } @After