diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/HostInfoEnvironmentPostProcessor.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/HostInfoEnvironmentPostProcessor.java new file mode 100644 index 00000000..f131d955 --- /dev/null +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/HostInfoEnvironmentPostProcessor.java @@ -0,0 +1,36 @@ +package org.springframework.cloud.client; + +import java.util.LinkedHashMap; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.context.config.ConfigFileEnvironmentPostProcessor; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.cloud.util.InetUtils; +import org.springframework.core.Ordered; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; + +/** + * @author Spencer Gibb + */ +public class HostInfoEnvironmentPostProcessor implements + EnvironmentPostProcessor, Ordered { + + // Before ConfigFileApplicationListener + private int order = ConfigFileEnvironmentPostProcessor.DEFAULT_ORDER - 1; + + @Override + public int getOrder() { + return order; + } + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + InetUtils.HostInfo hostInfo = InetUtils.getFirstNonLoopbackHostInfo(); + LinkedHashMap map = new LinkedHashMap<>(); + map.put("spring.cloud.client.hostname", hostInfo.getHostname()); + map.put("spring.cloud.client.ipAddress", hostInfo.getIpAddress()); + MapPropertySource propertySource = new MapPropertySource("springCloudClientHostInfo", map); + environment.getPropertySources().addLast(propertySource); + } +} diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/util/InetUtils.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/util/InetUtils.java new file mode 100644 index 00000000..e9248710 --- /dev/null +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/util/InetUtils.java @@ -0,0 +1,81 @@ +package org.springframework.cloud.util; + +import lombok.Data; +import lombok.SneakyThrows; +import lombok.extern.apachecommons.CommonsLog; + +import java.io.IOException; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.UnknownHostException; +import java.util.Enumeration; + +/** + * @author Spencer Gibb + */ +@CommonsLog +public class InetUtils { + + /** + * Find the first non-loopback host info. + * If there were errors return a hostinfo with 'localhost' and '127.0.0.1' for hostname and ipAddress respectively. + */ + public static HostInfo getFirstNonLoopbackHostInfo() { + InetAddress address = getFirstNonLoopbackAddress(); + if (address != null) { + return convert(address); + } + HostInfo hostInfo = new HostInfo(); + hostInfo.setHostname("localhost"); + hostInfo.setIpAddress("127.0.0.1"); + return hostInfo; + } + + /** + * Find the first non-loopback InetAddress + */ + @SneakyThrows + public static InetAddress getFirstNonLoopbackAddress() { + try { + 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 (IOException ex) { + log.error("Cannot get first non-loopback address", ex); + } + + try { + return InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + log.warn("Unable to retrieve localhost"); + } + + return null; + } + + public static HostInfo convert(InetAddress address) { + HostInfo hostInfo = new HostInfo(); + hostInfo.setHostname(address.getHostName()); + hostInfo.setIpAddress(address.getHostAddress()); + return hostInfo; + } + + @Data + public static final class HostInfo { + public boolean override; + private String ipAddress; + private String hostname; + } +} diff --git a/spring-cloud-commons/src/main/resources/META-INF/spring.factories b/spring-cloud-commons/src/main/resources/META-INF/spring.factories index 0345563f..5499768a 100644 --- a/spring-cloud-commons/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-commons/src/main/resources/META-INF/spring.factories @@ -3,3 +3,8 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.client.CommonsClientAutoConfiguration,\ org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,\ org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration + + +# Environment Post Processors +org.springframework.boot.env.EnvironmentPostProcessor=\ +org.springframework.cloud.client.HostInfoEnvironmentPostProcessor