CDN的原理

2022-01-30 前端迷
image.png

上面做了個小實驗,設置了2個類型相同的 key,content-type;它們唯一不同的大小寫。可以看到結果,只保留了一個key,value值被拼接起來了。

域名解析的背景

在以前,人們用IP進行互訪,後來發現IP太多不好記憶,便有了域名,比如 www.baidu.com,你一看就知道是百度搜尋引擎,而不需要管他的伺服器IP是多少,但是在最開始通信的時候,電腦路由器不認識域名,只認得IP啊,要怎麼去獲得對應的IP呢,這時候有了域名解析,就是去請求網絡上的DNS伺服器,讓他們來告訴你這個域名對應的IP是多少。

常見的DNS解析服務商有:阿里雲解析,萬網解析,DNSPod,新網解析,Route53(AWS),Dyn,Cloudflare等。

CDN加速前image.png

cdn加速前,域名解析過程如下:瀏覽器dns緩存
-> 系統dns緩存(Hosts文件)
-> 路由器dns緩存
-> 本地DNS伺服器(ISP運營服務提供商)
-> 本地DNS伺服器請求根域名伺服器(13個,不是只有13臺伺服器,分布在世界各地),拿到dns記錄
-> 本地DNS伺服器根據拿到頂級域名伺服器的ip,去請求頂級域名伺服器(如.com頂級域名伺服器)
-> 本地DNS伺服器根據拿到二級域名伺服器的ip,去請求二級域名伺服器
-> ……
-> 直到X級域名伺服器返回我們目標域名對應的ip地址後,本地DNS伺服器緩存該dns記錄,然後返迴路由器
-> ……(層層緩存後,返回dns記錄結果)
-> 我們的客戶端拿到ip地址,利用該ip地址,封裝並發起http/http2請求。

備註:前面4個是遞歸查詢,一旦緩存可用,就直接返回,不會再進行後續步驟,後面是迭代查詢,最終獲取ip地址,才會返回。

不使用cdn時,利用ip發起請求的過程,如廣州的用戶要請求一個在北京的 IP 地址,過程如下:
廣州用戶 -> 廣州伺服器 -> 湖南伺服器 -> 湖北伺服器 -> 北京伺服器

這樣傳遞數據,就很浪費時間,那如果廣州伺服器就緩存了數據或資源呢,那不就可以就近獲取了。這便是cdn的部分策略了。

備註:TLD,意為頂級域名。
域名層級如下圖:

image.pngCDN的工作原理和緩存策略CDN概念

CDN(Content Delivery Network,內容分發網絡)是構建在現有網際網路基礎之上的一層智能虛擬網絡,通過在網絡各處部署節點伺服器,實現將源站內容分發至所有CDN節點,使用戶可以就近獲得所需的內容。
簡單的說,CDN的工作原理就是將您源站的資源緩存到位於全球各地的CDN節點上,用戶請求資源時,就近返回節點上緩存的資源,而不需要每個用戶的請求都回您的源站獲取,避免網絡擁塞、緩解源站壓力,保證用戶訪問資源的速度和體驗。

CDN的優點如下:

CDN服務縮短了用戶查看內容的訪問延遲,提高了用戶訪問網站的響應速度;(終端用戶內容獲取延時高,比如伺服器在北京,而用戶在廣州)

解決了源站網絡帶寬小、用戶訪問量大、網點分布不均等問題,緩解了源站的壓力;(中心伺服器負載過高,因為所有客戶端發起的請求都會打到伺服器上)

緩解甚至消除了不同運營商之間互聯的瓶頸造成的影響;

減輕了各省的出口帶寬壓力;

緩解了骨幹網的壓力;

優化了網上熱點內容的分布;

備註:第3~5點詳見參考連結[4],第6點舉個例子,熱點內容的伺服器都在北京,如果我想獲取熱點內容,我就需要發送請求到北京的伺服器,但若有了cdn,我只需要就近伺服器獲取熱點內容,這樣就分攤優化熱點內容的分布了。

CDN節點緩存策略

CDN通過在現有網絡中增加一層新的緩存節點,將源站的資源發布到最接近用戶的網絡節點,使得客戶端在請求時直接訪問到就近的CDN節點並命中該資源,減少回源情況,提高網站訪問速度。
CDN緩存節點可分為L1節點(一級節點)和L2節點(二級節點),請求的流程是:客戶端-->CDN_L1-->CDN_L2-->源站。CDN的L1節點分布在全國各省市,L2節點分布在幾個大區下,可以把L2節點理解為匯聚式節點,簡單架構如下圖所示。

image.png

CDN節點緩存策略如下:

客戶端向CDN節點發起連接請求,當L1節點有緩存資源時,會命中該資源,直接將數據返回給客戶端。當L1節點無緩存資源時,會向L2節點請求對應資源,如果L2節點有緩存資源,則將資源同步到L1節點,並返回給用戶;如果L2節點無緩存資源,則直接回客戶源站獲取資源,並按照配置的緩存策略進行緩存。

為了方便理解,再舉一個例子,假設有杭州移動節點L1-hz和寧波移動節點L1-nb兩個L1節點,這兩個L1節點都回源到同一個L2這個節點,源站在北京。這幾個CDN節點初始的時候都沒有用戶的緩存資源。當ABC三個用戶依次請求同一個圖片的時候,過程如下:

杭州移動用戶A被CDN調度到杭州移動L1-hz節點,L1-hz由於沒有緩存,則回源到L2,L2由於也沒有緩存,則回源到北京源站,請求到數據以後再返回給L1-hz,L1再返回給用戶A。

用戶A請求完以後,L1-hz和L2節點都有了緩存資源。此時杭州移動用戶B也開始訪問這個圖片,用戶B也被分配到了L1-hz節點,由於L1-hz已經有這個圖片的緩存了,因此不需要再去回源了,而是直接返回緩存給用戶B。

寧波移動用戶C此時也訪問了同一個圖片,用戶C被分配到了寧波移動節點L1-nb,由於L1-nb還沒有緩存,就會回源到L2,而L2已經有緩存,因此L2會直接返回緩存數據給L1-nb,然後L1-nb再返回給用戶B。此過程存在L1-nb向L2回源的過程,而L2不需要再去回源到源站了。

通過CDN加速,杭州用戶A和B可以直接從杭州節點讀取緩存數據,寧波用戶C可以直接從寧波節點讀取數據,不需要每一次都去請求北京伺服器了,提高了用戶側的訪問速度,降低了伺服器壓力。

備註:

CDN工作原理

通過以下案例,可以進一步了解CDN的工作原理。
假設加速域名為www.a.com, 接入CDN網絡,開始使用加速服務後,當終端用戶(北京)發起HTTP請求時,處理流程如下圖所示。

image.png

當終端用戶(北京)向www.a.com 下的某資源發起請求時,首先向LDNS(本地DNS)發起域名解析請求。

LDNS檢查緩存中是否有www.a.com 的IP位址記錄。如果有,則直接返回給終端用戶;如果沒有,則向授權DNS查詢。

當授權DNS解析www.a.com 時,返回域名CNAME www.a.tbcdn.com 對應IP位址(實際就是DNS調度系統的ip地址)。

域名解析請求發送至DNS調度系統,DNS調度系統為請求分配最佳節點IP位址。

LDNS獲取DNS返回的解析IP位址。

用戶獲取解析IP位址。

用戶向獲取的IP位址發起對該資源的訪問請求。

如果該IP位址對應的節點已緩存該資源,則會將數據直接返回給用戶,例如,圖中步驟7和8,請求結束。

如果該IP位址對應的節點未緩存該資源,則節點向源站發起對該資源的請求。獲取資源後,結合用戶自定義配置的緩存策略,將資源緩存至節點,例如,圖中的北京節點,並返回給用戶,請求結束。

什麼資源可以被加速

在HTTP請求的資源,請求可以分為靜態請求和動態請求。

備註:(以下為個人見解)
動態請求中,路由優化是指請求路徑優化為最短傳輸路徑(不用經過太多伺服器);傳輸優化是指同時部署多個運營商的伺服器(比如電信、聯通、移動都部署上),避免跨運營商間的請求轉換。

CDN的緩存策略

靜態內容可以在CDN上緩存多久,這個是根據CDN的緩存策略的。用戶通過亞馬遜雲/阿里雲/騰訊雲控制臺按照文件類型和目錄設置緩存時間,針對靜態資源配置指定目錄和文件後綴名的緩存過期時間和優先級,資源過期後,自動從CDN節點刪除。

CDN網絡的組成要素

對於普通的Internet用戶,每個CDN節點就相當於一個放置在它周圍的網站伺服器. 通過對dns的接管,用戶的請求被透明地指向離他最近的節點,節點中CDN伺服器會像網站的原始伺服器一樣,響應用戶的請求。由於它離用戶更近,因而響應時間必然更快。

image.png

從上面圖中 虛線圈起來的那塊,就是CDN層,這層是位於 用戶端 和 站點伺服器群 之間。

DNS智能調度系統(比如f5的3DNS)

緩存功能服務

負載均衡設備(如lvs, F5的BIG/IP)

內容Cache伺服器(如squid)

共享存儲

名詞解釋 A記錄:解析域名到IP

A記錄,即Address記錄,它並不是一個IP或者一個域名,我們可以把它理解為一種指向關係:域名 www.xx.com → 222.222.222.222
也就是當你訪問這些域名或者主機名的時候,DNS伺服器上會通過A記錄會幫你解析出相應的IP位址,以達到後續訪問目的。
所以A記錄是IP解析,直接將域名或主機名指向某個IP。

CNAME:解析域名到另外一個域名

CNAME記錄,也叫別名記錄,相當於給A記錄中的域名起個小名兒,比如www.xx.com的小名兒就叫www.yy.com好了,然後CNAME記錄也和A記錄一樣,是一種指向關係,把小名兒www.yy.com指向了www.xx.com,然後通過A記錄,www.xx.com又指向了對應的IP:www.yy.com → www.xx.com → 111.111.111.111
這樣一來就能通過它的小名兒直接訪問111.111.111.111了。

這時候有人問:這不多了一步嘛,不嫌麻煩?

假如這個時候我又想給原域名取幾個小名兒,分別叫www.cc.com和www.kk.com那麼存在下列指向關係:
www.yy.com → www.xx.com → 111.111.111.111
www.cc.com → www.xx.com → 111.111.111.111
www.kk.com → www.xx.com → 111.111.111.111

突然伺服器的IP位址因為一些不可描述的原因要換了,不再是111.111.111.111了,換成了333.333.333.333,這時候你發現,只要把www.xx.com的指向修改一下即可:
域名 www.xx.com → 333.333.333.333

這時候你又發現了,原來他的小名兒不需要做更改,直接就能訪問伺服器,因為他們都只指向了www.xx.com,伺服器IP改動與否,它們不管。

那麼假如不用CNAME,直接做A記錄會怎樣?
www.yy.com → 111.111.111.111
www.cc.com → 111.111.111.111
www.xx.com → 111.111.111.111
www.kk.com → 111.111.111.111
那麼當111.111.111.111更改的時候,全部相關A記錄指向關係都要做更改,這時會很麻煩。

CNAME的應用

比較多的是用在CDN加速上。
舉個例子:假如你公司中的一臺IP為1.1.1.1的伺服器,註冊了域名為www.dd.com,要對外提供客戶訪問。隨著公司越做越大,訪問量也越來越多,伺服器頂不住了,你去找CDN提供商購買CDN加速服務,這個時候他們要求你的域名做個CNAME指向他們給你的一個域名叫www.xdd.com,當用戶訪問www.dd.com的時候,本地DNS會獲得CDN提供的CNAME域名:www.xdd.com,然後再次向DNS調度系統發出請求,通過DNS調度系統的智能分析,把這個www.xdd.com指向一個(離用戶最近的)CDN提供商的伺服器IP,讓用戶就近取到想要的資源(如訪問網站),這樣就可以大大降低了延遲。

回源

當 cdn 緩存伺服器中沒有符合客戶端要求的資源的時候,緩存伺服器會請求上一級緩存伺服器,以此類推,直到獲取到,如果最後還是沒有,就會回到我們自己的伺服器(簡稱源站)去獲取資源。

回源的時機:

回源host

回源host:回源host決定回源請求訪問到源站上的具體某個站點。

例子1:源站是域名源站為www.a.com, 回源host為www.b.com, 那麼實際回源是請求到 www.a.com 解析到的IP, 對應的主機上的站點www.b.com

例子2:源站是IP源站為1.1.1.1, 回源host為www.b.com,那麼實際回源的是1.1.1.1對應的主機上的站點 www.b.com

協議回源

指回源時使用的協議和客戶端訪問資源時的協議保持一致,即如果客戶端使用 HTTPS 方式請求資源,當CDN節點上未緩存該資源時,節點會使用相同的 HTTPS 方式回源獲取資源;同理如果客戶端使用 HTTP 協議的請求,CDN節點回源時也使用HTTP協議。

TTL

TTL,Time-To-Live,意思為一條域名解析記錄在DNS伺服器中的存留時間。當各地的DNS伺服器接受到解析請求時,就會向域名指定的NS伺服器(NS,Name Server,名稱伺服器,DNS是最著名的NS伺服器)發出解析請求從而獲得解析記錄;在獲得這個記錄之後,記錄會在DNS伺服器中保存一段時間,這段時間內如果再接到這個域名的解析請求,DNS伺服器將不再向NS伺服器發出請求,而是直接返回剛才獲得的記錄;而這個記錄在DNS伺服器上保留的時間,就是TTL值。

TTL的數值應該如何設置?

增大TTL值,減少域名解析時間。

減小TTL值,及時更新網絡。

邊緣節點

邊緣節點,指距離最終用戶接入具有較少的中間環節的網絡節點。

CDN 調度策略

CDN 調度是指通過各種策略將客戶端請求調度到合理的目標機房。以達到成本、質量(可用性、平均速度)的最佳控制。

調度形式一般有以下幾種:

DNS 調度

HTTP DNS 調度

302 調度

路由調度(Anycast)

DNS 調度

基於請求端 local DNS 的出口 IP 歸屬地以及運營商的 DNS 調度。

DNS 調度的問題:

HTTP DNS 調度

客戶端請求固定的 HTTP DNS 地址,根據返回獲取解析結果。可以提高解析的準確性(不像DNS調度,只能通過local DNS IP來做決策),能很好的避免劫持等問題。

當然這種模式也有一些問題,例如客戶端每次加載URL都可能產生一次HTTP DNS查詢,這就對性能和網絡接入要求很高。

302調度

基於客戶端 IP 和 302 調度集群進行實時的流量調度。

我們來看一個例子:

訪問 URL 連結後,此時請求到了調度群集上,我們能拿到的客戶端信息有 客戶端的出口IP(絕大多情況下是相同的),接下來算法和基於 DNS 的調度可以是一樣的,只是判斷依據由 local DNS 出口 ip 變成了客戶端的出口IP。

瀏覽器收到302回應,跟隨 Location 中的 URL,繼續發起 http 請求,這次請求的目標 IP 是CDN 邊緣節點,CDN節點會響應實際的文件內容。

302 調度的優勢:

302 調度的劣勢:

AnyCast BGP路由調度

基於 BGP AnyCast 路由策略,只提供極少的對外 IP,路由策略可以很快的調整。

目前 AWS CloudFront、CloudFlare 都使用了這種方式,在路由層面進行調度。

這種方式可以很好地抵禦 DDOS 攻擊,降低網絡擁塞。

當然這種方式的成本和方案設計都比較複雜,所以國內的 CDN 目前還都是用 UniCast 的方式。

除了靜態資源,API 是否可以緩存?

動態加速的對象是動態生成的網頁,動態加速一般是對針對內容(如資料庫信息等)在用戶與- 源站之間建立高速通道,通過路由優化、TCP加速等技術手段對動態內容進行加速,降低節點到源站之間的時延,從而大大降低了用戶訪問動態網頁的延遲。

其實這個問題我沒有找到比較合適的解答,以下是個人見解:
我們使用 cdn 的原因是,我們經常有一些比較頻繁請求且容量比較大的文件,並且更新頻率不那麼高的文件。這些文件如果我們都放在自己的伺服器上,對於客戶端,問題在於延長訪問時間;對於伺服器端是佔用伺服器端的資源。所以我們採用分布式的方式扔在 cdn 上。
但是 API請求不同,

首先API請求經常更新,就算是簡單的get請求,推送更新到所有 cdn 節點同樣是需要耗費資源(如帶寬,會對源站有壓力)的。

如果API請求是和用戶信息等相關聯的get請求,這種不適合進行cdn緩存,因為總是要進行回源,做緩存沒有意義,而且還不安全;

如果是post請求,那壓根不用考慮cdn;

cdn 判斷是否緩存是依靠 url,意味著cdn只能緩存 get 請求,所以cdn的應用範圍是有限的。

所以 API 是不適合放在 cdn 上的。但是如果你的內容是相對靜態的,不涉及和用戶信息關聯,更新不頻繁,那麼勉強可以考慮用cdn加速,如配置信息(但最好不要)。

資源的過期如何判定?cdn 是如何更新數據的?

資源過期時間就是請求/響應頭部來判定(詳情請自行搜索 強緩存和協商緩存 等關鍵詞)。

那麼 cdn 是如何更新數據的?

不同運營商寬帶如何實現互相訪問的?

通過BGP Peering(對等)等方式實現流量交換(相互訪問),如兩家運營商約定在特定地點(網際網路交換點)集中進行流量交換。

所以如果你的運營商是電信,可以直接通過電信伺服器訪問你的目標IP,不需要經過交換轉換,那肯定能大幅提高訪問速度,當然還要看其他限制原因,如本市的電信,還是跨省的電信。

參考連結:

DNS缺點&升級方案(HttpDns,解決Local DNS劫持)

計算機網絡基礎之CDN

阮一峰的DNS 原理入門

不同運營商寬帶如何實現互相訪問的?

淘寶的cdn緩存方案,包括三級緩存結構、多副本清除CDN緩存方案等

CDN節點緩存策略、CDN工作原理、什麼資源可以被加速

CDN加速原理

什麼是CNAME

關於 cdn、回源等問題一網打盡

CDN 調度策略

相關焦點

  • 網站CDN流量加速原理和簡單構建
    另外,由於用戶訪問源站業務有性能瓶頸,通過cdn技術把源站的內容緩存到多個節點。用戶向源站域名發起請求時,請求會被調度至最接近用戶的服務節點,直接由服務節點直接快速響應,有效降低用戶訪問延遲,提升可用性。
  • cdn技術原理
    在描述CDN的實現原理,讓我們先看傳統的未加緩存服務的訪問過程,以便了解CDN緩存訪問方式與未加緩存訪問方式的差別:  由上圖可見,用戶訪問未使用CDN緩存網站的過程為:  1)、用戶向瀏覽器提供要訪問的域名;  2)、瀏覽器調用域名解析函數庫對域名進行解析,以得到此域名對應的IP位址;  3)、瀏覽器使用所得到的
  • 為了搞清楚CDN的原理,我頭都禿了...
    簡單的說,CDN的工作原理就是將您源站的資源緩存到位於全球各地的CDN節點上,用戶請求資源時,就近返回節點上緩存的資源,而不需要每個用戶的請求都回您的源站獲取,避免網絡擁塞、緩解源站壓力,保證用戶訪問資源的速度和體驗。
  • CDN工作原理及其在淘寶圖片業務中的應用
    如果全網一半的圖片都同時變化,cdn的命中率降到50%,對img-picasso的訪問量就會增加25倍,這個擴容成本肯定沒法接受。這意味著,一張圖片,在cdn上最多可能有2400+個不同的url,當圖片內容變化後,要把這些緩存全部清掉,才能保證所有用戶看到的圖片都是新內容。
  • cdn背後的網站真實IP
    cdn在防禦拒絕服務攻擊的時候頗有建樹,正好我這裡有一個發生在我身邊的真實案例之前買的一個資源合購類的站點就是這樣,因為侵犯被人利益,所以經常遭受拒絕服務攻擊,實在是不堪其擾後被迫使用了cdn,後來就再也沒有被D成功過。這個例子並不是說cdn一定能防住畢竟很多cdn節點流量並不大,可能自己本身就會被拒絕服務,只是說其在這方面有流量清洗的作用。
  • 如何使用jsDelivr+Github 實現免費CDN加速?
    下面就以jsDelivr+Github 實現免費cdn加速為例,記錄自己優化過程。1 cdn簡介cdn 全稱Content Delivery Network即內容分發網絡。cdn分發原理圖(1)用戶向瀏覽器提供需要訪問的域名;(2)瀏覽器調用域名解析庫對域名進行解析,由於CDN對域名解析過程進行了調整
  • 2020年十大 CDN網頁加速 服務
    按照一般的思維,當一個訪客想打開某個目標網站,那麼計算機的工作原理應該是這樣的:訪客瀏覽器發送頁面請求給目標頁面的主機—主機進行安全性和內容需求檢查—目標網站主機將內容數據包發送給訪客主機—主機解析接受到的內容數據包—訪客看到所需的內容頁面。
  • 前端必需了解的CDN知識
    四、CDN工作原理CDN的基本原理是廣泛採用各種緩存伺服器,將這些緩存伺服器分布到用戶訪問相對集中的地區或網絡中,在用戶訪問網站時,利用全局負載技術將用戶的訪問指向距離最近的工作正常的緩存伺服器上,由緩存伺服器直接響應用戶請求。1.
  • cdn.chxjon直播源
    id=zjws 安徽衛視,http://cdn.chxjon.cn/iptv/QQ582185381/gzyx.php?id=ahws江蘇衛視,http://cdn.chxjon.cn/iptv/QQ582185381/gzyx.php?id=jsws山東衛視,http://cdn.chxjon.cn/iptv/QQ582185381/gzyx.php?
  • 國內最著名的公用CDN BootCDN停止服務
    BootCDN 所收錄的開源項目主要同步於 cdnjs 倉庫。自2013年10月31日上線以來已經為30多萬家網站提供了穩定、可靠的免費 CDN 加速服務。使用cdn的好處很多讀者就要問了,為什麼你網站的css和js資源不放在本地而要依賴cdn呢?這就要說到cdn的好處啦。
  • vue性能優化之CDN
    : { js: [ "https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.js", "https://cdn.jsdelivr.net/npm/vue-router@3.1.3/dist/vue-router.js", "https://cdn.jsdelivr.net/npm/axios@0.19.0
  • CDN:什麼是邊緣CDN和虛擬CDN(vCDN)?
    原文連結:https://stlpartners.com/edge-computing/cdn-what-is-edge-cdn-and-virtual-cdn-vcdn/責任編輯:邊小白若轉載文章為原創文章,可在相應文章下或公眾號後臺留言;其他非轉載類文章須在文首以不小於14號字體標明轉載自SDNLAB。
  • CDN對流媒體和應用分發的支持及優化 高可用CDN架構詳解
    1.CDN系統工作原理1.1 DNS解析方式客戶網站使用CDN加速應用或其他下載類資源:客戶域名: example.com客戶加速域名: cdn.example.comCDN 廠商加速域名: cdn.comCDN 廠商 CNAME 域名: example.com.cdn.com
  • 平安CDN 服務正式上線
    · 加速原理加速原理假設源站域名為 http://www.a.com ,用戶發起源站的瀏覽請求,源站接入CDN後的處理流程如下圖所示:               詳細說明如下:1、用戶發起http://www.a.com/test.html請求,先要向
  • 什麼是CDN,有何作用?
    cdn顧名思義是一個英文縮寫,全稱是content delivery network(內容分發網絡),即服務商通過在世界各地部署大量伺服器節點
  • 什麼是CDN?
    因為CDN技術牽涉到技術研發,以及售後問題解決的是否快捷,所以在選擇cdn服務商時,一定選擇技術研發實力強專業的公司,以保證在售後出現問題時能得到及時的解決,而不能僅僅圖便宜,當時是便宜了,可事後會用更大的金錢代價來彌補,所以請選擇CDN服務的企業網站,一定要慎重了,尤其是中小企業,更經不起折騰。
  • CDN原理及應用
    CDN原理CDN是什麼
  • 推薦一個前端開源項目 CDN網站
    推薦網址BootCDN:http://www.bootcdn.cn/在學習JS過程中, 會接觸到好多類庫和框架, 比如jquery, bootstrap, backbone,react,等, 每次下載下來,放在本地文件夾,再引入到自己的項目文件裡面用太麻煩
  • Kendo UI使用教程:CDN服務
    DOCTYPEhtml><html><head><title>Welcometo Kendo UI</title><link rel="stylesheet"href="http://kendo.cdn.telerik.com/2019.2.619/styles/kendo.common.min.css"/&
  • OkHttp從原理到應用
    能夠低成本實現複雜的業務需求;OkHttp 和 Retrofit,Glide,Fresco 第三方庫能很好的銜接,擁有良好的生態系統;Android4.4的源碼中可以看到HttpURLConnection已經替換成OkHttp實現;下面我們一起來探索OkHttp的部分原理和在項目實戰中的花式運用: