国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

坑爹的InetAddress getLocalHost函數

2019-11-14 21:48:55
字體:
來源:轉載
供稿:網友
坑爹的InetAddress getLocalHost函數

今天在跑dubbo 的 DemoService 2.5.4-SNAPSHOT版本的時候,遇到到一個奇怪的問題。consumer怎么都連接不上PRovider的服務。最后才發現是由于dubbo自 己實現的檢測本地ip地址代碼不夠強壯造成的。你這里的provider實際上是運行在A地址上,但是dubbo檢測到本地的IP地址是B,然后他在 zookeeper上注冊自己的服務地址的時候,用的是這個B這個IP地址,那么當consumer連接到zookeeper上的時候,查詢到 DemoService是在B上的,顯然這個IP地址上并沒有這樣的dubbo服務,那么這個consumer就肯定不能成功。為什么dubbo檢測本地IP地址的結果是錯的,因為dubbo檢測本地IP地址的策略是先調用InetAddress.getLocalHost,如果該方法返回一個合法的地址,則直接認為是本地的IP地址,否則會枚舉本地所有網卡,并返回第一個合法的IP地址作為本地地址。坑爹的就是InetAddress.getLocalHost返回了一個錯誤的IP地址。為什么這個函數會返回一個錯誤的地址,因為這個函數的原理是通過獲取本機的hostname,然后對此hostname做解析,從而獲取IP地址的。那么問題來了,如果在本機的/etc/hosts文件里對這個主機名指向了一個錯誤的IP地址,那么InetAddress.getLocalHost就會返回這個錯誤的IP地址。當然如果你的hostname是到DNS去解析的,碰巧DNS上的信息也是錯的,也同樣是悲慘結局。遇到同樣問題的人,可以先檢查下hosts文件的設置里面A地址指向哪里了,然后看一下DNS解析出的地址。當然如果dubbo的代碼檢查一下,這個返回的地址,是不是真的是本機的IP地址,也不會出現這個問題了,歸根結底還是dubbo的卡發人員太相信InetAddress.getLocalHost了,這貨自己應該確保不會出現這樣的烏龍事件的。你返回一個不是本機的IP地址作為本機的IP地址,這個在語義上就錯誤了。不管你用了多么愚蠢的算法,結果就是不應該返回一個不是本地的IP地址作為本地的地址,不是嗎?否則還叫什么狗屁get local host!!! 我為什么說InetAddress.getLocalHost的算法是愚蠢的,是因為這個盡管可能會被hosts文件和DNS誤導,但是顯然這兩個地方都不是本機IP地址的權威獲取處,權威獲取處是網卡本身的配置信息。即便你要使用一個不靠譜來源的信息,你至少跟本機的網卡地址做一下校驗嘛!如果你實在是不知道怎么獲取,拋出個異常說明一下你的無能為力,大家也是可以接受的嘛!犯不著給個錯誤的信息,讓這么多人掉坑里,浪費時間,對不對?最后,dubbo檢測本地地址的代碼位于:dubbo-common/src/main/java/com/alibaba/dubbo/common/utils/NetUtils.java里的getLocalAddress函數,可以看一下。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 公安县| 富阳市| 龙州县| 康马县| 东乌珠穆沁旗| 阜康市| 买车| 东平县| 巴彦县| 昌都县| 崇仁县| 普兰县| 九江市| 色达县| 平谷区| 南部县| 临沧市| 苍梧县| 新化县| 陆丰市| 仙桃市| 永昌县| 永城市| 牙克石市| 梧州市| 定日县| 吴江市| 陕西省| 陈巴尔虎旗| 阿克| 永吉县| 枣庄市| 太仆寺旗| 农安县| 涟水县| 改则县| 辛集市| 张家港市| 冕宁县| 嘉黎县| 阿拉善盟|