當前位置:首頁 > 公眾號精選 > 小林coding
[導讀]大家好,我是小林。我寫技術(shù)文章畫的圖片是保存到GitHub的,沒別的原因,就是因為免費,但是GitHub訪問的速度大家都懂的,訪問的速度很慢。所以我會用CDN來加速圖片的訪問,也就是我的圖床的方案是GitHubjsdelivrCDN,使用很簡單,只需要把域名地址替換一下就行。那為什么訪問GitHub會很慢呢?GitHub離國內(nèi)就近的服務(wù)器是在新加波,距離我這有2600公里,也就是說,訪問GitHub上的一張圖片,一個數(shù)據(jù)包就要走2600公里這么遠!而且,互聯(lián)網(wǎng)從邏輯上看是一張大網(wǎng),但實際上是由許多小網(wǎng)絡(luò)組成的,每個網(wǎng)絡(luò)絡(luò)中還存在許多的路由器、網(wǎng)關(guān),數(shù)據(jù)每經(jīng)過一個節(jié)點,都要處理一下,在二層、三層...

大家好,我是小林。

我寫技術(shù)文章畫的圖片是保存到 GitHub 的,沒別的原因,就是因為免費,但是 GitHub 訪問的速度大家都懂的,訪問的速度很慢。所以我會用 CDN 來加速圖片的訪問,也就是我的圖床的方案是 GitHub jsdelivr CDN,使用很簡單,只需要把域名地址替換一下就行。那為什么訪問 GitHub 會很慢呢?GitHub 離國內(nèi)就近的服務(wù)器是在新加波,距離我這有 2600 公里,也就是說,訪問 GitHub 上的一張圖片,一個數(shù)據(jù)包就要走 2600 公里這么遠!而且,互聯(lián)網(wǎng)從邏輯上看是一張大網(wǎng),但實際上是由許多小網(wǎng)絡(luò)組成的,每個網(wǎng)絡(luò)絡(luò)中還存在許多的路由器、網(wǎng)關(guān),數(shù)據(jù)每經(jīng)過一個節(jié)點,都要處理一下,在二層、三層解析轉(zhuǎn)發(fā),這也會消耗一定的時間,帶來延遲。把這些因素再放到全球來看,地理距離、運營商網(wǎng)絡(luò)、路由轉(zhuǎn)發(fā)的影響就會成倍增加,也就是訪問 GitHub 慢的一個原因。那我是怎么知道 GitHub 服務(wù)器在哪的呢?很簡單,ping www.github.com 后,就會顯示出服務(wù)器的 ip 地址,然后把 ip 地址用百度搜索,就能查到該服務(wù)器是在哪里的了。圖片資源是靜態(tài)資源,所以要解決訪問慢的問題,就可以用 CDN 加速。在我加上 jsdelivr CDN 后,GitHub 的圖片就會被緩存到 CDN 服務(wù)器上,而深圳正好就有一臺 jsdelivr 的 CDN 服務(wù)器。這樣我訪問 GitHub 圖片不用再大老遠跑去新加波的服務(wù)器,而是遵循就近訪問原則,直接訪問離深圳的這臺 CDN 服務(wù)器,大大加快了訪問速度。這次,我們就來好好聊一聊 CDN。開車啦!

什么是 CDN?

CDN 的全稱叫 Content Delivery Network,中文名叫「內(nèi)容分發(fā)網(wǎng)絡(luò)」,它是解決由于長距離而網(wǎng)絡(luò)訪問速度慢的問題。
怎么做到的呢?
簡單來說,CDN 將內(nèi)容資源分發(fā)到位于多個地理位置機房中的服務(wù)器上,這樣我們在訪問內(nèi)容資源的時候,不用訪問源服務(wù)器。而是直接訪問離我們最近的 CDN 節(jié)點 ,這樣一來就省去了長途跋涉的時間成本,從而實現(xiàn)了網(wǎng)絡(luò)加速。
CDN 能加速什么類型的內(nèi)容?
CDN 加速的是內(nèi)容資源是靜態(tài)資源。所謂的「靜態(tài)資源」是指數(shù)據(jù)內(nèi)容靜態(tài)不變,任何時候來訪問都是一樣的,比如圖片、音頻。與之相反的「動態(tài)資源」,是指數(shù)據(jù)內(nèi)容是動態(tài)變化的,每次訪問都不一樣,比如用戶信息等。不過,動態(tài)資源如果也想被緩存加速,就要使用動態(tài) CDN,其中一種方式就是將數(shù)據(jù)的邏輯計算放在 CDN 節(jié)點來做,這種方式就被稱為邊緣計算。
CDN 是怎么從源服務(wù)器獲取資源的呢?
CDN 加速策略有兩種方式,分別是「推模式」和「拉模式」。大部分 CDN 加速策略采用的是「拉模式」,當用戶就近訪問的 CDN 節(jié)點沒有緩存請求的數(shù)據(jù)時,CDN 會主動從源服務(wù)器下載數(shù)據(jù),并更新到這個 CDN 節(jié)點的緩存中??梢钥闯?,拉模式屬于被動緩存的方式,與之相反的 「推模式」就屬于主動緩存的方式。如果想要把資源在還沒有用戶訪問前緩存到 CDN 節(jié)點,則可以采用「推模式」,這種方式也叫 CDN 預(yù)熱。通過 CDN 服務(wù)提供的 API 接口,把需要預(yù)熱的資源地址和需要預(yù)熱的區(qū)域等信息提交上去,CDN 收到后,就會觸發(fā)這些區(qū)域的 CDN 節(jié)點進行回源來實現(xiàn)資源預(yù)熱。

如何找到離用戶最近的 CDN 節(jié)點 ?

找到離用戶最近的 CDN 節(jié)點是由 CDN 的全局負載均衡器(Global Sever Load Balance,GSLB負責的。那 GSLB 是在什么時候起作用的呢?在回答這個問題前,我們先來看看在沒有 CDN 的情況下,訪問域名時發(fā)生的事情。在沒有 CDN 的情況下,當我們訪問域名時,DNS 服務(wù)器最終會返回源服務(wù)器的地址。比如,當我們在瀏覽器輸入 www.xiaolin.com 域名后,在本地 host 文件找不到域名時,客戶端就會訪問本地 DNS 服務(wù)器。這時候:
  • 如果本地 DNS 服務(wù)器有緩存該網(wǎng)站的地址,則直接返回網(wǎng)站的地址;

  • 如果沒有就通過遞歸查詢的方式,先請求根 DNS,根 DNS 返回頂級 DNS(.com)的地址;再請求 .com 頂級 DNS 得到 xiaolin.com 的域名服務(wù)器地址,再從 xiaolin.com 的域名服務(wù)器中查詢到 www.xiaolin.com 對應(yīng)的 IP 地址,然后返回這個 IP 地址,同時本地 DNS 緩存該 IP 地址,這樣下一次的解析同一個域名就不需要做 DNS 的迭代查詢了。

但加入 CDN 后就不一樣了。會在 xiaolin.com 這個 DNS 服務(wù)器上,設(shè)置一個 CNAME 別名,指向另外一個域名 www.xiaolin.cdn.com,返回給本地 DNS 服務(wù)器。接著繼續(xù)解析該域名,這個時候訪問的就是 xiaolin.cdn.com 這臺 CDN 專用的 DNS 服務(wù)器,在這個服務(wù)器上,又會設(shè)置一個 CNAME,指向另外一個域名,這次指向的就是 CDN 的 GSLB。接著,本地 DNS 服務(wù)器去請求 CDN 的 GSLB 的域名,GSLB 就會為用戶選擇一臺合適的 CDN 節(jié)點提供服務(wù),選擇的依據(jù)主要有以下幾點:
  • 看用戶的 IP 地址,查表得知地理位置,找相對最近的 CDN 節(jié)點;

  • 看用戶所在的運營商網(wǎng)絡(luò),找相同網(wǎng)絡(luò)的 CDN 節(jié)點;

  • 看用戶請求 URL,判斷哪一臺服務(wù)器上有用戶所請求的資源;

  • 查詢 CDN 節(jié)點的負載情況,找負載較輕的節(jié)點;

GSLB 會基于以上的條件進行綜合分析后,找出一臺最合適的 CDN 節(jié)點,并返回該 CDN 節(jié)點的 IP 地址給本地 DNS 服務(wù)器,然后本地 DNS 服務(wù)器緩存該 IP 地址,并將 IP 返回給客戶端,客戶端去訪問這個 CDN 節(jié)點,下載資源。這次就說到這啦,我們下次見!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉