
本文中會(huì)提到部分廠商,不過均為舉例需要或客觀推薦的解決方案,并無任何利益關(guān)系
有用戶反應(yīng)產(chǎn)品偶然會(huì)出現(xiàn)『未能找到使用指定主機(jī)的服務(wù)器』問題,應(yīng)該是 DNS 沒有正確解析。從監(jiān)控記錄中并沒有發(fā)現(xiàn)什么問題,各地的監(jiān)測(cè)點(diǎn)的結(jié)果都很正常,那就應(yīng)該是用戶所處網(wǎng)絡(luò)環(huán)境出了問題。
為了盡量提高產(chǎn)品可用性,進(jìn)行了 HTTP DNS 的改造。
什么是 HTTP DNS
普通的網(wǎng)絡(luò)請(qǐng)求,系統(tǒng)自動(dòng)通過 DNS Server 將目標(biāo)域名解析成 IP 地址,然后向這個(gè) IP 地址發(fā)送請(qǐng)求完成數(shù)據(jù)交互。這個(gè)解析的過程對(duì)于 APP 來說是不可見的。
HTTP DNS 則是 APP 主動(dòng)向 HTTP DNS Server 發(fā)送解析請(qǐng)求,Server 返回目標(biāo)域名對(duì)應(yīng)的 IP 地址,然后 APP 直接向目標(biāo)地址發(fā)送請(qǐng)求,繞開了系統(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. 前后端配合版
這種改造方案非常簡(jiǎn)單,后端 Web Server 將 IP 地址直接綁定到目標(biāo)站點(diǎn),APP 在發(fā)起請(qǐng)求前,直接將所有 URL 中自己域名的部分換為通過 HTTP DNS 獲得目標(biāo) IP 即可。
當(dāng)然如果后端有針對(duì)域名的邏輯也需要處理下,比如防盜鏈用的 Referer 校驗(yàn)等。
另外有的第三方庫(比如支付寶)需要 APP 傳入 Server 回調(diào)地址。這種是沒必要改的,畢竟請(qǐng)求來自 IDC 機(jī)房等網(wǎng)絡(luò)環(huán)境很好的場(chǎng)合。不過一定要改的話,這種地址可能在第三方平臺(tái)上有綁定審核,實(shí)際動(dòng)手前請(qǐng)?zhí)崆皽?zhǔn)備審核。
B. APP 單獨(dú)版
不同公司合作開發(fā)或者一臺(tái) Server 托管了若干站點(diǎn)的情況,只能 APP 自己想辦法了。這種稍微麻煩點(diǎn),針對(duì)不同用途的 URL 需要做不同的處理。
普通請(qǐng)求,類似于 REFTful API,每次請(qǐng)求完成一個(gè)動(dòng)作,比如獲得數(shù)據(jù)之類
這種可以直接用 IP 替換域名,然后在 HTTP request header 中將 Host 指定為域名即可。Webview 中加載 Web page
如果只是加載用戶協(xié)議、關(guān)于我們這種單頁純文本的東西,和普通請(qǐng)求相同改法即可。不過很多網(wǎng)頁內(nèi)都會(huì)有相對(duì)地址的超鏈接,Webview 內(nèi)的超鏈接跳轉(zhuǎn)時(shí)無法指定 Host 字段,后端 Server 可能無法正確處理這種請(qǐng)求。另外 cookie 等和域有關(guān)對(duì)的東西也容易出問題,所以這種類型最好還是維持域名訪問的原狀。傳給第三方庫使用的回調(diào)地址
同樣,這種本來就沒問題,強(qiáng)行改的話反而會(huì)出問題,所以不要更改。第三方地址,比如 Apple Store 的評(píng)分頁面,或者點(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 解析
仍有使用域名請(qǐng)求的場(chǎng)景(比如APP單獨(dú)改造時(shí)用到 Webview)下使用。
如果域名不是被刻意劫持或干擾,一般無法找到主機(jī)的問題只是解析過慢,提前觸發(fā)查詢后,等用戶操作到相關(guān)邏輯時(shí)正常的概率就會(huì)更高。發(fā)送請(qǐng)求前若有 IP 則使用 IP,否則使用域名
這是當(dāng)然的 XD網(wǎng)絡(luò)狀況發(fā)生變化時(shí),重新異步 HTTP DNS 查詢 IP 地址
如果產(chǎn)品在不同線路部署有不同 Server 的話,重新查詢一遍可以確??偸鞘褂米詈线m的那臺(tái)。
第三方庫
iOS/Android 都有現(xiàn)成的第三方庫可供使用,GitHub 上有新浪和七牛的項(xiàng)目
| Objective-C | Java |
|---|---|
| 新浪:貌似不成熟,開發(fā)者不推薦商用 | 新浪:功能異常強(qiáng)大,解釋也很詳細(xì),請(qǐng)直接查看該項(xiàng)目主頁 |
| 七牛:提供 DNSPod 等 HTTP 方式,也支持 nslookup 方式(可以指定 DNS Server) | 七牛:同左邊 |
另外七牛項(xiàng)目的分別發(fā)布到了 CocoaPods 和 maven 上更易使用,所以推薦七牛。