我為看一張圖片,跨過了 2600 公里!
時間:2021-09-27 13:55:14
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]大家好,我是小林。我寫技術(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 的迭代查詢了。
- 看用戶的 IP 地址,查表得知地理位置,找相對最近的 CDN 節(jié)點;
- 看用戶所在的運營商網(wǎng)絡(luò),找相同網(wǎng)絡(luò)的 CDN 節(jié)點;
- 看用戶請求 URL,判斷哪一臺服務(wù)器上有用戶所請求的資源;
- 查詢 CDN 節(jié)點的負載情況,找負載較輕的節(jié)點;