我為看一張圖片,跨過了 2600 公里!
時(shí)間:2021-09-27 13:55:14
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]大家好,我是小林。我寫技術(shù)文章畫的圖片是保存到GitHub的,沒別的原因,就是因?yàn)槊赓M(fèi),但是GitHub訪問的速度大家都懂的,訪問的速度很慢。所以我會(huì)用CDN來加速圖片的訪問,也就是我的圖床的方案是GitHubjsdelivrCDN,使用很簡(jiǎn)單,只需要把域名地址替換一下就行。那為什么訪問GitHub會(huì)很慢呢?GitHub離國內(nèi)就近的服務(wù)器是在新加波,距離我這有2600公里,也就是說,訪問GitHub上的一張圖片,一個(gè)數(shù)據(jù)包就要走2600公里這么遠(yuǎn)!而且,互聯(lián)網(wǎng)從邏輯上看是一張大網(wǎng),但實(shí)際上是由許多小網(wǎng)絡(luò)組成的,每個(gè)網(wǎng)絡(luò)絡(luò)中還存在許多的路由器、網(wǎng)關(guān),數(shù)據(jù)每經(jīng)過一個(gè)節(jié)點(diǎn),都要處理一下,在二層、三層...
大家好,我是小林。我寫技術(shù)文章畫的圖片是保存到 GitHub 的,沒別的原因,就是因?yàn)槊赓M(fèi),但是 GitHub 訪問的速度大家都懂的,訪問的速度很慢。所以我會(huì)用 CDN 來加速圖片的訪問,也就是我的圖床的方案是 GitHub jsdelivr CDN,使用很簡(jiǎn)單,只需要把域名地址替換一下就行。那為什么訪問 GitHub 會(huì)很慢呢?GitHub 離國內(nèi)就近的服務(wù)器是在新加波,距離我這有 2600 公里,也就是說,訪問 GitHub 上的一張圖片,一個(gè)數(shù)據(jù)包就要走 2600 公里這么遠(yuǎn)!而且,互聯(lián)網(wǎng)從邏輯上看是一張大網(wǎng),但實(shí)際上是由許多小網(wǎng)絡(luò)組成的,每個(gè)網(wǎng)絡(luò)絡(luò)中還存在許多的路由器、網(wǎng)關(guān),數(shù)據(jù)每經(jīng)過一個(gè)節(jié)點(diǎn),都要處理一下,在二層、三層解析轉(zhuǎn)發(fā),這也會(huì)消耗一定的時(shí)間,帶來延遲。把這些因素再放到全球來看,地理距離、運(yùn)營商網(wǎng)絡(luò)、路由轉(zhuǎn)發(fā)的影響就會(huì)成倍增加,也就是訪問 GitHub 慢的一個(gè)原因。那我是怎么知道 GitHub 服務(wù)器在哪的呢?很簡(jiǎn)單,ping www.github.com 后,就會(huì)顯示出服務(wù)器的 ip 地址,然后把 ip 地址用百度搜索,就能查到該服務(wù)器是在哪里的了。圖片資源是靜態(tài)資源,所以要解決訪問慢的問題,就可以用 CDN 加速。在我加上 jsdelivr CDN 后,GitHub 的圖片就會(huì)被緩存到 CDN 服務(wù)器上,而深圳正好就有一臺(tái) jsdelivr 的 CDN 服務(wù)器。這樣我訪問 GitHub 圖片不用再大老遠(yuǎn)跑去新加波的服務(wù)器,而是遵循就近訪問原則,直接訪問離深圳的這臺(tái) CDN 服務(wù)器,大大加快了訪問速度。這次,我們就來好好聊一聊 CDN。開車?yán)玻?h3>什么是 CDN?CDN 的全稱叫 Content Delivery Network,中文名叫「內(nèi)容分發(fā)網(wǎng)絡(luò)」,它是解決由于長(zhǎng)距離而網(wǎng)絡(luò)訪問速度慢的問題。
怎么做到的呢?簡(jiǎn)單來說,CDN 將內(nèi)容資源分發(fā)到位于多個(gè)地理位置機(jī)房中的服務(wù)器上,這樣我們?cè)谠L問內(nèi)容資源的時(shí)候,不用訪問源服務(wù)器。而是直接訪問離我們最近的 CDN 節(jié)點(diǎn) ,這樣一來就省去了長(zhǎng)途跋涉的時(shí)間成本,從而實(shí)現(xiàn)了網(wǎng)絡(luò)加速。
CDN 能加速什么類型的內(nèi)容?CDN 加速的是內(nèi)容資源是靜態(tài)資源。所謂的「靜態(tài)資源」是指數(shù)據(jù)內(nèi)容靜態(tài)不變,任何時(shí)候來訪問都是一樣的,比如圖片、音頻。與之相反的「動(dòng)態(tài)資源」,是指數(shù)據(jù)內(nèi)容是動(dòng)態(tài)變化的,每次訪問都不一樣,比如用戶信息等。不過,動(dòng)態(tài)資源如果也想被緩存加速,就要使用動(dòng)態(tài) CDN,其中一種方式就是將數(shù)據(jù)的邏輯計(jì)算放在 CDN 節(jié)點(diǎn)來做,這種方式就被稱為邊緣計(jì)算。
CDN 是怎么從源服務(wù)器獲取資源的呢?CDN 加速策略有兩種方式,分別是「推模式」和「拉模式」。大部分 CDN 加速策略采用的是「拉模式」,當(dāng)用戶就近訪問的 CDN 節(jié)點(diǎn)沒有緩存請(qǐng)求的數(shù)據(jù)時(shí),CDN 會(huì)主動(dòng)從源服務(wù)器下載數(shù)據(jù),并更新到這個(gè) CDN 節(jié)點(diǎn)的緩存中??梢钥闯觯J綄儆诒粍?dòng)緩存的方式,與之相反的 「推模式」就屬于主動(dòng)緩存的方式。如果想要把資源在還沒有用戶訪問前緩存到 CDN 節(jié)點(diǎn),則可以采用「推模式」,這種方式也叫 CDN 預(yù)熱。通過 CDN 服務(wù)提供的 API 接口,把需要預(yù)熱的資源地址和需要預(yù)熱的區(qū)域等信息提交上去,CDN 收到后,就會(huì)觸發(fā)這些區(qū)域的 CDN 節(jié)點(diǎn)進(jìn)行回源來實(shí)現(xiàn)資源預(yù)熱。
如何找到離用戶最近的 CDN 節(jié)點(diǎn) ?
找到離用戶最近的 CDN 節(jié)點(diǎn)是由 CDN 的全局負(fù)載均衡器(Global Sever Load Balance,GSLB)負(fù)責(zé)的。那 GSLB 是在什么時(shí)候起作用的呢?在回答這個(gè)問題前,我們先來看看在沒有 CDN 的情況下,訪問域名時(shí)發(fā)生的事情。在沒有 CDN 的情況下,當(dāng)我們?cè)L問域名時(shí),DNS 服務(wù)器最終會(huì)返回源服務(wù)器的地址。比如,當(dāng)我們?cè)跒g覽器輸入 www.xiaolin.com 域名后,在本地 host 文件找不到域名時(shí),客戶端就會(huì)訪問本地 DNS 服務(wù)器。這時(shí)候:- 如果本地 DNS 服務(wù)器有緩存該網(wǎng)站的地址,則直接返回網(wǎng)站的地址;
- 如果沒有就通過遞歸查詢的方式,先請(qǐng)求根 DNS,根 DNS 返回頂級(jí) DNS(.com)的地址;再請(qǐng)求 .com 頂級(jí) DNS 得到 xiaolin.com 的域名服務(wù)器地址,再從 xiaolin.com 的域名服務(wù)器中查詢到 www.xiaolin.com 對(duì)應(yīng)的 IP 地址,然后返回這個(gè) IP 地址,同時(shí)本地 DNS 緩存該 IP 地址,這樣下一次的解析同一個(gè)域名就不需要做 DNS 的迭代查詢了。
- 看用戶的 IP 地址,查表得知地理位置,找相對(duì)最近的 CDN 節(jié)點(diǎn);
- 看用戶所在的運(yùn)營商網(wǎng)絡(luò),找相同網(wǎng)絡(luò)的 CDN 節(jié)點(diǎn);
- 看用戶請(qǐng)求 URL,判斷哪一臺(tái)服務(wù)器上有用戶所請(qǐng)求的資源;
- 查詢 CDN 節(jié)點(diǎn)的負(fù)載情況,找負(fù)載較輕的節(jié)點(diǎn);