OkHttp接入HttpDNS,最佳實踐

2021-09-13 03:20:57 字數 3103 閱讀 2194

dns(domain name system)即網域名稱解析系統,這個東西說對於開發者來說,應該是沒有不知道的。說簡單點,這個系統的作用就是將網域名稱解析成ip位址。我們的每一次網路請求,如果是使用網域名稱,那麼就是進行網域名稱解析。

乙個優秀的網域名稱服務應該能夠滿足兩點要求,乙個是能夠正確的返回ip位址,二就是能夠根據網路情況返回所請求的網域名稱最近的伺服器ip。

乙個dns查詢,會先從本地快取查詢,如果沒有或者已經過期,就從dns伺服器查詢,如果客戶端沒有主動設定dns伺服器,一般是從服務商dns伺服器上查詢。這就出現了不可控。因為如果使用了ips的localdns網域名稱伺服器,那麼基本都會或多或少地無法避免在有中國特色的網際網路環境中遭遇到各種網域名稱被快取、使用者跨網訪問緩慢等問題。

我們先來看看普通網域名稱服務會有什麼問題:

1. 網域名稱劫持:

2.智慧型dns策略失效

智慧型dns,就是為了排程使用者訪問策略,但是這些因素會導致智慧型dns策略失效。

目前國內大多數企業對於網域名稱解析這塊問題沒有進行特殊處理,這導致了上述說的那些問題,其中網域名稱劫持的問題相當普遍。那麼有沒有一種方法能夠避免上述的情況呢?有,當然有。那就是使用httpdns。

httpdns其實也是對dns解析的另一種實現方式,只是將網域名稱解析的協議由dns協議換成了http協議,並不複雜。使用http協議向d+伺服器的80埠進行請求,代替傳統的dns協議向dns伺服器的53埠進行請求,繞開了運營商的local dns,從而避免了使用運營商local dns造成的劫持和跨網問題。

接入httpdns也是很簡單的,使用普通dns時,客戶端傳送網路請求時,就直接傳送出去了,有底層網路框架進行網域名稱解析。當接入httpdns時,就需要自己傳送網域名稱解析的http請求,當客戶端拿到網域名稱對應的ip之後,就向直接往此ip傳送業務協議請求。

這樣,就再也不用再考慮傳統dns解析會帶來的那些問題了,因為是使用http協議,所以不用擔心網域名稱劫持問題了;而且,如果選擇好的dns伺服器提供商,還保證將使用者引導的訪問速度最快的idc節點上。

既然httpdns這麼好,那麼咱們就開始接入吧。不過先慢著,在接入時還需要考慮乙個問題:httpdns伺服器用哪家的呢?

選擇服務商

因為第一家有免費版本可供使用,所以我們就使用 dnspod 來演示如何接入httpdns了。

選擇接入sdk

既然已經選擇了 dnspod ,那麼我們進入其**的接入頁面,能夠看到其收費資訊和接入指南。一般來說乙個服務提供商應該會想所有客戶端提供響應的sdk以方便使用,不過這個 dnspod 沒有,他只提供了乙個c語言版本,如果是企業使用者,他會給提供乙個定製的sdk以供使用,對於免費使用者,如果不用這個c語言版本,還有乙個選擇,那就是開源的第三方sdk:

上面的sdk大同小異用哪個都差不多,此處我們就拿七牛的安卓版本來演示接入。

現在我們已經做好了接入前的大量準備,那麼從現在開始就可以進入**部分了,這也是最重點的部分了。

首先,為了方便演示,我們使用 android studio 新建立了乙個空的工程;然後,我們需要引入兩個庫,乙個是okhttp,另乙個就是七牛的d+開源sdk了:

第乙個是七牛的庫,這個庫在github上沒有說明自己的gradle依賴,但是可以查到,這個庫的名字起的還是挺歡樂的。

第二個庫就是大名鼎鼎的okhttp了,至於為什麼會用這個庫,有兩方面原因:一是該庫使用人數巨大;二是使用其設定dns解析服務是相當方便。

在構造okhttpcient時,我們可以通過方法okhttpclient.builder.dns(httpdns)來設定該物件使用的dns解析服務,這樣我們就可以自定義httpdns網域名稱解析了。

下面需要按照okhttp的要求自定義dns解析了,具體的就是需要實現dns介面。下面的**是我封裝的乙個dns實現類:

//在返回result之前,我們可以新增一些其他自己知道的ip

return result;

} catch (ioexception e)

//當有異常發生時,使用預設解析

return dns.system.lookup(hostname);}}

有了上面的dns實現類,下面就是要構造出乙個使用這個網域名稱解析方式的okhttpclient物件:

那麼接下來我們使用這個okhttpclient進行網路請求時,使用的網域名稱解析就會從預設的網域名稱解析轉換為httpdns網域名稱解析了。是不是很容易,這也是okhttp的優勢之一:便於定製。

這樣就完成了接入httpdns。

得力於okhttp的優勢和七牛提供的庫,我並沒有感覺很麻煩。之前我看到有的部落格上寫的使用***的方式接入httpdns,雖然也能用,但是我個人感覺並不是很好。所以***方式的**就不貼出來了。okhttp的***很強大,能做很多事,處理dns當然也不在話下,不過***不是做這個事情的,更何況okhttp提供了對於dns的設定。所以還是建議使用這種方式接入。

dns(domain name system)即網域名稱解析系統,這個東西說對於開發者來說,應該是沒有不知道的。說簡單點,這個系統的作用就是將網域名稱解析成ip位址。我們的每一次網路請求,如果是使用網域名稱,那麼就是進行網域名稱解析。

OkHttp接入 簡單使用 封裝

二 使用 三 封裝 先看文件okhttp dependency implementation com.squareup.okhttp3 okhttp 3.11.0 android開發一般用這個 這個不建議 請求一般分為get post 兩種方式,下面一一說 初始化 提交json格式,同步 提交表單格...

HttpDns 原理是什麼

張松然 作者 張松然,京東 pop平台系統架構師。對構建高效能,高可用的大規模分布系統有豐富的開發經驗,有多年nio領域的設計 開發經驗,對http tcp長連線技術有深入研究與領悟。什麼是 dns dns domain name system,網域名稱系統 dns 服務用於在網路請求時,將網域名稱...

阿里雲HTTPDNS使用教程

httpdns 是面向移動開發者推出的一款網域名稱解析產品,具有網域名稱防劫持 精準排程等特性。開通 httpdns 服務後,您就可以在管理控制台新增要解析的網域名稱,呼叫服務 api 進行網域名稱解析。httpdns 是一款遞迴dns服務,與權威dns不同,httpdns 並不具備決定解析結果的能...