遇到一个spring boot admin监控问题

 

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值