InetAddress类中的getHostName()方法的坑

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. 局域网网关的网络配置

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。