Android端HttpDNS優(yōu)化方案

1. 需求與問題

在互聯(lián)網(wǎng)企業(yè)中絕大多數(shù)都是使用域名來給用戶提供服務,但是在有中國特色的互聯(lián)網(wǎng)環(huán)境中遭遇到各種域名被緩存、用戶跨網(wǎng)訪問緩慢等問題的情況或多或少的無法避免。
所以如何提高域名解析成功率成為關注的重點。

2. Android端解決方案

目前在實踐Android端的解決方案為:

  • 初次從服務端拉取域名對應的IP列表,并緩存到本地,知道下次啟動應用時再次拉取;
  • 優(yōu)先使用IP進行接口訪問,在請求失敗之后重走默認的域名訪問;
  • 解決Https請求是證書的檢驗。

3. 具體實現(xiàn)

  • 假如服務端返回數(shù)據(jù)中包含如下ip字段,客戶端解析之后將域名對應的ip保存
{
    "www.baidu.com":[
        "192.168.212.195",
        "192.168.212.196"
    ],
    "www.json.cn":[
        "192.168.212.197",
        "192.168.212.198"
    ]
}
  • 需要在請求頭中為設置host為對應的域名,需要考慮到多域名、多ip的情況
//這里使用的是okhttp3,以map形式向請求頭中設置參數(shù),不同的框架按照自己的形式設置
headsMap.put("Host", "你的域名");
  • 對于使用Https方式的需要設置對證書的不校驗,可以參考 :
    OkHttp使用https,忽略證書驗證

    但是對于域名這個部分我們需要增加一個校驗,來判斷HTTPDNS返回的源站IP與Session攜帶的IP信息是否一致。
               /*
                 * 關于這個接口的說明,官方有文檔描述:
                 * This is an extended verification option that implementers can provide.
                 * It is to be used during a handshake if the URL's hostname does not match the
                 * peer's identification hostname.
                 *
                 * 使用HTTPDNS后URL里設置的hostname不是遠程的主機名(如:m.taobao.com),與證書頒發(fā)的域不匹配,
                 * Android HttpsURLConnection提供了回調(diào)接口讓用戶來處理這種定制化場景。
                 * 在確認HTTPDNS返回的源站IP與Session攜帶的IP信息一致后,您可以在回調(diào)方法中將待驗證域名替換為原來的真實域名進行驗證。
                 *
                 */
            HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return HttpsURLConnection.getDefaultHostnameVerifier().verify("你使用的域名", session);
                }
            };
  • 對于什么情況下使用域名、什么情況下使用ip,還是需要依據(jù)項目本身的需求來配置的,我這邊在項目中增加了一個配置,來控制整個項目是否使用域名或ip

4. 價值參考

切換ip進行請求,必須要服務端支持,否則也是白忙活。
動手前可以參考如下文章或開源項目:
1. HTTPS(含SNI)業(yè)務場景“IP直連”方案說明

2.【鵝廠網(wǎng)事】全局精確流量調(diào)度新思路-HttpDNS服務詳解

3. HTTPDNSLib

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

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,662評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,234評論 25 708
  • 看了Joy一篇關于網(wǎng)絡部分優(yōu)化的文章,總結(jié)一下,方便以后查閱使用 目前客戶端存在的網(wǎng)絡問題主要有下面幾方面: 1....
    SpursGo閱讀 3,784評論 1 5
  • 5.1 Defining Data Representations To keep things simple, ...
    thehgz閱讀 373評論 0 0
  • 肯定自己 之前,我的信念里我是一個傻傻笨笨的人,需要別人的保護,聽話照做,成為我的心智模式。迷失了自己不自知,直到...
    王明霞2016閱讀 352評論 1 1

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