很神奇,明明就不是localhost,admin和activity不在同一个服务上。所以一直处于down的状态,有的时候还是offline,unknown等。狂发报警邮件啊。
参考下这段话:
https://www.cnblogs.com/jizhao/p/4081675.html
爹的就是InetAddress.getLocalHost返回了一个错误的IP地址。为什么这个函数会返回一个错误的地址,因为这个函数的原理是通过 获取本机的hostname,然后对此hostname做解析,从而获取IP地址的。那么问题来了,如果在本机的/etc/hosts文件里对这个主机名 指向了一个错误的IP地址,那么InetAddress.getLocalHost就会返回这个错误的IP地址。当然如果你的hostname是到DNS 去解析的,碰巧DNS上的信息也是错的,也同样是悲惨结局。
我们的一个服务,就是本机的hosts文件中:
127.0.0.1 web138
写了个java文件测试:
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* Created by 67534 on 2019/8/22.
*/
public class Test {
public static void main(String[] args) {
InetAddress address = getLocalHost();
System.out.println("address:"+address.toString());
System.out.println(address.getHostAddress());
System.out.println(address.getCanonicalHostName());
System.out.println("hostname:"+address.getHostName());
}
protected static InetAddress getLocalHost() {
try {
return InetAddress.getLocalHost();
} catch (UnknownHostException var2) {
throw new IllegalArgumentException(var2.getMessage(), var2);
}
}
}
编译:javac Test.java
执行:java Test
打印出:
看了spring boot 源码:
进行了调试。发现源码中获取ip地址的代码:
DefaultApplicationFactory文件中
protected String getHost(InetAddress address) {
return this.client.isPreferIp()?address.getHostAddress():address.getCanonicalHostName();
}
这个方法:会返回address.getCanonicalHostName()这个值。( this.client.isPreferIp()是false)
所以我们这个项目竟然返回了localhost:
错误的hosts文件:
需要将127.0.0.1 web138这一行修改为:1xx.xx.xxx.138 web138(即真实ip地址)
改完hosts文件后,重启服务(重新注册到admin)
yeah,正常注册~