最近把服务集群中的接口调用记录到日志中,用以记录每台主机上各服务的性能情况,部署后外现内网的服务器IP取的都是127.0.0.1 这个地址。查了下资料,现在把这个区别记录下:
如题,使用InetAddress.getLocalHost()返回了 hostname/ip
令我不解的是,ip与本机的IP不匹配。
解决问题的思路:
1)把这段程序拷贝到其它机器,执行结果正常,排除使用api不当的问题。
2)在/etc下查找返回的hostname值的位置,我使用的是geetoo Linux系统,返回/etc/conf.d/hostname
以同样的方式在另外一台机器上查找,另外一台机器使用的是redhat Linux, 位于/etc/sysconfig/network
,然后查看/etc/hosts,发现该机器上的对应hostname的值可以找到,并且对应为正确的ip地址。
于是,回到自己机器,查看/etc/hosts,将机器IP对应的hostname修改成/etc/conf.d/hostname一致。
问题解决。
3)没有查看InetAddress的源码,但可以猜测它检索/etc/hosts文件中对应hostname的值,然后返回IP。
为了验证该假设,修改/etc/hosts的hostname对应的IP的值,然后执行程序,结果与预测一致。
4)InetAddress查找IP地址是一个很方便的方法,但是我们需要考虑的问题的是,如果/etc/hosts不可靠,结果面目全非。在baidu上搜索的时候,有一个兄弟使用ProcessBuilder来执行/sbin/ipconfig 来获取对应eth0的地址,遭到了下面的同志抨击,使用InetAddress就可以了,现在分析来,使用ProcessBuilder来直接执行命令,获取结果是一个非常可靠的办法。一个大的系统如果这里有问题,就会是大问题。
5)解决问题的思路比问题的答案更有意思。
原文:http://blog.sina.com.cn/s/blog_4a1f59bf0100n2pe.html