我們手機游戲中,通過上報收集到的數據來分析,發現相當多的一部分用戶,在請求一些配置時會遇到無法解析的情況,或者域名的解析直接被攔截了。
特別是游戲的補丁包文件(放在CDN上),遇到的域名解析失敗是最多的,比較小的配置可以通過請求動態接口來獲得數據,但是比較大的補丁文件,比如單個zip就超過15M這樣的文件,就無法提供接口來返回數據了。這些問題很棘手,如何解決確實困擾了很久
有一個方案,就是分流,多提供幾個CDN的域名進行輪詢,也就是下載分流。但它依然面臨的問題是域名解析,被ISP運營商劫持就over了(電信、移動它們經常干這種事情)
后來內部討論的結果是說把這些請求全部放到BGP機房(成本會高一些),然后較大的補丁文件放到CDN上,購買幾家CDN供應商,配置幾個不同的CDN請求域名,使用輪詢的方式下載補丁。但即便是這種,如同上面所說,依然無法避免域名解析失敗的問題
后來我看到一篇文件,就是騰訊的GSLB團隊開放出來的HttpDNS服務(點擊查看原文鏈接>>),說白一點就是請求一個動態接口,這個動態接口根據你請求的ip來返回你想要訪問域名的最近的ip列表(它會不斷的優化ip庫)。這樣所有的請求都可以走ip了,跳過ISP的域名解析了
比如我們想要訪問www.baidu.com,那么請求http://119.29.29.29/d?dn=www.baidu.com
就會返回離我最近的IP地址:
180.97.33.107;180.97.33.108
我使用的是蘇州電信,它返回的IP列表是泰州的電信,我直接訪問IP也是能顯示百度首頁

能訪問到,是因為它的服務器配置對ip也做了支持。如果遇到比如網宿這種它沒有對相應的ip進行支持(就是當你直接訪問ip時不鳥你的),怎么辦呢?
我們來做這樣一個實驗,使用libcurl訪問www.baidu.com,正常情況下應該是直接返回百度首頁,現在我在本地配置nginx(但未配置hosts),規則如下圖:

然后我訪問http://127.0.0.1/index.html

這樣訪問就直接到我本機了,使用了我本機的配置(下圖是Nginx的訪問日志)。
如何做到的呢?其實就只是修改了http的頭部host參數。我直接訪問指定的ip,並設置相應的host,這樣就繞開了域名解析這一步。
回到文章的開始,騰訊提供的HttpDNS就派上用場了,調用接口獲取到IP列表,取其中一個ip,然后修改訪問目標網址(以http://ip/xxx開頭了),並設置請求的host,這樣就直接跳過了域名解析。其實還是有解析的,只是這一步完全交給騰訊的那個動態接口了,它會根據域名來返回離我當前請求網絡最近的ip列表
希望這篇文章對同樣被域名解析所困擾的同行有所幫助吧,如果你有更好的方案,歡迎一起討論:)
本文參考鏈接:
