本文中會(huì)提到部分廠商足删,不過均為舉例需要或客觀推薦的解決方案,并無任何利益關(guān)系
有用戶反應(yīng)產(chǎn)品偶然會(huì)出現(xiàn)『未能找到使用指定主機(jī)的服務(wù)器』問題纪蜒,應(yīng)該是 DNS 沒有正確解析瓤漏。從監(jiān)控記錄中并沒有發(fā)現(xiàn)什么問題,各地的監(jiān)測點(diǎn)的結(jié)果都很正常校套,那就應(yīng)該是用戶所處網(wǎng)絡(luò)環(huán)境出了問題价脾。
為了盡量提高產(chǎn)品可用性,進(jìn)行了 HTTP DNS 的改造笛匙。
什么是 HTTP DNS
普通的網(wǎng)絡(luò)請求侨把,系統(tǒng)自動(dòng)通過 DNS Server 將目標(biāo)域名解析成 IP 地址,然后向這個(gè) IP 地址發(fā)送請求完成數(shù)據(jù)交互妹孙。這個(gè)解析的過程對于 APP 來說是不可見的秋柄。
HTTP DNS 則是 APP 主動(dòng)向 HTTP DNS Server 發(fā)送解析請求,Server 返回目標(biāo)域名對應(yīng)的 IP 地址蠢正,然后 APP 直接向目標(biāo)地址發(fā)送請求骇笔,繞開了系統(tǒng)解析的這個(gè)環(huán)節(jié),避免了用戶所處環(huán)境帶來的干擾嚣崭。
當(dāng)然 HTTP DNS Server 也是通過 IP 地址直接訪問的笨触,比如 DNSPod 免費(fèi)版的 119.29.29.29,還有其他廠商可以自己尋找雹舀。
如何進(jìn)行改造
根據(jù)改動(dòng)范圍是否設(shè)計(jì)后端(包括運(yùn)維)有兩種方法
A. 前后端配合版
這種改造方案非常簡單芦劣,后端 Web Server 將 IP 地址直接綁定到目標(biāo)站點(diǎn),APP 在發(fā)起請求前说榆,直接將所有 URL 中自己域名的部分換為通過 HTTP DNS 獲得目標(biāo) IP 即可虚吟。
當(dāng)然如果后端有針對域名的邏輯也需要處理下,比如防盜鏈用的 Referer 校驗(yàn)等签财。
另外有的第三方庫(比如支付寶)需要 APP 傳入 Server 回調(diào)地址串慰。這種是沒必要改的,畢竟請求來自 IDC 機(jī)房等網(wǎng)絡(luò)環(huán)境很好的場合唱蒸。不過一定要改的話邦鲫,這種地址可能在第三方平臺(tái)上有綁定審核,實(shí)際動(dòng)手前請?zhí)崆皽?zhǔn)備審核油宜。
B. APP 單獨(dú)版
不同公司合作開發(fā)或者一臺(tái) Server 托管了若干站點(diǎn)的情況掂碱,只能 APP 自己想辦法了。這種稍微麻煩點(diǎn)慎冤,針對不同用途的 URL 需要做不同的處理疼燥。
普通請求,類似于 REFTful API蚁堤,每次請求完成一個(gè)動(dòng)作醉者,比如獲得數(shù)據(jù)之類
這種可以直接用 IP 替換域名但狭,然后在 HTTP request header 中將 Host 指定為域名即可。Webview 中加載 Web page
如果只是加載用戶協(xié)議撬即、關(guān)于我們這種單頁純文本的東西立磁,和普通請求相同改法即可。不過很多網(wǎng)頁內(nèi)都會(huì)有相對地址的超鏈接剥槐,Webview 內(nèi)的超鏈接跳轉(zhuǎn)時(shí)無法指定 Host 字段唱歧,后端 Server 可能無法正確處理這種請求。另外 cookie 等和域有關(guān)對的東西也容易出問題粒竖,所以這種類型最好還是維持域名訪問的原狀颅崩。傳給第三方庫使用的回調(diào)地址
同樣,這種本來就沒問題蕊苗,強(qiáng)行改的話反而會(huì)出問題沿后,所以不要更改。第三方地址朽砰,比如 Apple Store 的評分頁面尖滚,或者點(diǎn)擊廣告后跳轉(zhuǎn)的營銷頁
這種可改可不改,視具體情況而定瞧柔,總體建議維持原狀比較好漆弄。
一些有用的實(shí)踐經(jīng)驗(yàn)
APP 啟動(dòng)時(shí)異步 HTTP DNS 查詢 IP 地址
畢竟大部分用戶網(wǎng)絡(luò)狀況都是正常的,沒必要影響所有人的啟動(dòng)速度查到后將 IP 地址緩存
除了內(nèi)存外最好也能持久化緩存非剃,這樣下次啟動(dòng)時(shí)即使萬一 HTTP DNS 查詢比較慢也能確保有可用的 IP置逻。HTTP DNS 查詢后觸發(fā)進(jìn)行一次系統(tǒng)的 DNS 解析
仍有使用域名請求的場景(比如APP單獨(dú)改造時(shí)用到 Webview)下使用推沸。
如果域名不是被刻意劫持或干擾备绽,一般無法找到主機(jī)的問題只是解析過慢,提前觸發(fā)查詢后鬓催,等用戶操作到相關(guān)邏輯時(shí)正常的概率就會(huì)更高肺素。發(fā)送請求前若有 IP 則使用 IP,否則使用域名
這是當(dāng)然的 XD網(wǎng)絡(luò)狀況發(fā)生變化時(shí)宇驾,重新異步 HTTP DNS 查詢 IP 地址
如果產(chǎn)品在不同線路部署有不同 Server 的話倍靡,重新查詢一遍可以確保總是使用最合適的那臺(tái)课舍。
第三方庫
iOS/Android 都有現(xiàn)成的第三方庫可供使用塌西,GitHub 上有新浪和七牛的項(xiàng)目
Objective-C | Java |
---|---|
新浪:貌似不成熟,開發(fā)者不推薦商用 | 新浪:功能異常強(qiáng)大筝尾,解釋也很詳細(xì)捡需,請直接查看該項(xiàng)目主頁 |
七牛:提供 DNSPod 等 HTTP 方式,也支持 nslookup 方式(可以指定 DNS Server) | 七牛:同左邊 |
另外七牛項(xiàng)目的分別發(fā)布到了 CocoaPods 和 maven 上更易使用筹淫,所以推薦七牛站辉。