Java 杂谈程序员程序猿阵线联盟-汇总各类技术干货

InetAddress类中的getHostName()方法的坑

2017-12-07  本文已影响237人  爱说的夏老师

1.方法概述

这个方法会返回这个对象所表示的域名/机器名

如果刚开始构造的时候用的就是域名/机器名, 会直接返回这个

如果刚开始用的是IP来构造这个对象, 则会用DNS反向解析来找到对应的域名/机器名

2.问题

问题就在于DNS的反向解析, 如果解析不成功, 它会一直尝试, 大概10秒的时间, 所以这10秒是阻塞的.

如果使用到这个方法的时候, 特别是一些网络编程, 要注意考虑阻塞的情况.

3.案例

在项目中有用到spring继承MongoDB的时候, 有遇到这个问题, 启动的时候特别慢

image

原因就是在连接MongoDB的时候, 调用了getHostName()这个方法.


解决方案

在hosts文件中增加IP映射

image

注意这里的映射两边都是相同的IP, 即直接把这个IP作为域名去映射

4.总结

MongoDB的这个做法引发了我的思考:

实际上就算是不获取主机名/域名, 直接用IP也是可以进行网络连接的, 那为什么它要获取主机名/域名, 目的无非是后面用主机名/域名去进行网络连接, 那么用域名去进行网络连接有什么好处吗?

我能想到的是2点:

  1. 域名对于服务器的迁移来说会更加平滑, 因为IP变化不影响客户端的配置
  2. 域名更适合做一些负载均衡或者CDN的策略

另外, 还有一个问题:

DNS的反向解析为什么会不成功?

这个我查了一些资料, 感觉影响的因素可能有以下几点:

  1. 操作系统的限制(防火墙之类的)
  2. 本地的网络配置(包括IP, 网关, DNS等)
  3. 局域网网关的网络配置

当然我也只是说可能, 并没有深入研究, 有研究的可以告知我.

上一篇 下一篇

猜你喜欢

热点阅读