很神奇,明明就不是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,正常注册~

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐