InetAddress類中的getHostName()方法的坑

1.方法概述

這個方法會返回這個對象所表示的域名/機器名

如果剛開始構(gòu)造的時候用的就是域名/機器名, 會直接返回這個

如果剛開始用的是IP來構(gòu)造這個對象, 則會用DNS反向解析來找到對應(yīng)的域名/機器名

2.問題

問題就在于DNS的反向解析, 如果解析不成功, 它會一直嘗試, 大概10秒的時間, 所以這10秒是阻塞的.

如果使用到這個方法的時候, 特別是一些網(wǎng)絡(luò)編程, 要注意考慮阻塞的情況.

3.案例

在項目中有用到spring繼承MongoDB的時候, 有遇到這個問題, 啟動的時候特別慢

image

原因就是在連接MongoDB的時候, 調(diào)用了getHostName()這個方法.


解決方案

在hosts文件中增加IP映射

image

注意這里的映射兩邊都是相同的IP, 即直接把這個IP作為域名去映射

4.總結(jié)

MongoDB的這個做法引發(fā)了我的思考:

實際上就算是不獲取主機名/域名, 直接用IP也是可以進行網(wǎng)絡(luò)連接的, 那為什么它要獲取主機名/域名, 目的無非是后面用主機名/域名去進行網(wǎng)絡(luò)連接, 那么用域名去進行網(wǎng)絡(luò)連接有什么好處嗎?

我能想到的是2點:

  1. 域名對于服務(wù)器的遷移來說會更加平滑, 因為IP變化不影響客戶端的配置
  2. 域名更適合做一些負(fù)載均衡或者CDN的策略

另外, 還有一個問題:

DNS的反向解析為什么會不成功?

這個我查了一些資料, 感覺影響的因素可能有以下幾點:

  1. 操作系統(tǒng)的限制(防火墻之類的)
  2. 本地的網(wǎng)絡(luò)配置(包括IP, 網(wǎng)關(guān), DNS等)
  3. 局域網(wǎng)網(wǎng)關(guān)的網(wǎng)絡(luò)配置

當(dāng)然我也只是說可能, 并沒有深入研究, 有研究的可以告知我.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容