InetAddress类中的getHostName()方法的坑

作者: 爱说的夏老师 | 来源:发表于2017-12-07 11:51 被阅读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. 局域网网关的网络配置

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

相关文章

  • InetAddress类中的getHostName()方法的坑

    1.方法概述 这个方法会返回这个对象所表示的域名/机器名如果刚开始构造的时候用的就是域名/机器名, 会直接返回这个...

  • java.net.InetAddress.getHostName

    最近在做公司项目时遇到请求慢响应,经过排查发现阻塞发生在InetAddress.getHostName() 方法,...

  • zookeeper连接很慢

    直接用ip去连接zk,特别慢。发现是InetAddress.getHostName()这个方法太慢导致。zk会用i...

  • 网络通信

    TCP程序设计基础 InetAddress类 InetAddress类的常用方法 ServerSocket类 Se...

  • InetAddress

    Java socket应用—通信** InetAddress** 1、InetAddress 类用于标示网络上的...

  • Java 网络编程 -- IP地址

    InetAddress类 java.net.InetAddress类是Java对IP地址的高层表示。 包括IPv4...

  • InetAddress

    类InetAddress。 在java.net包下面。 InetAddress类的对象用于IP地址和域名,该类提供...

  • Java网络实例

    1、Java 实例 – 获取指定主机的IP地址:使用 InetAddress 类的 InetAddress.get...

  • 17_网络编程基础

    InetAddress类 该类的对象代表一个ip地址对象 常用的类成员方法: 示例 UDP通信 与UDP协议主要相...

  • 网络通讯的三要素

    IP地址 IPV4大约能表示43亿个地址 InetAddress类 1.static InetAddress ge...

网友评论

    本文标题:InetAddress类中的getHostName()方法的坑

    本文链接:https://www.haomeiwen.com/subject/rxddixtx.html