當(dāng)前位置:首頁 > 公眾號(hào)精選 > 小林coding
[導(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 的迭代查詢了。

但加入 CDN 后就不一樣了。會(huì)在 xiaolin.com 這個(gè) DNS 服務(wù)器上,設(shè)置一個(gè) CNAME 別名,指向另外一個(gè)域名 www.xiaolin.cdn.com,返回給本地 DNS 服務(wù)器。接著繼續(xù)解析該域名,這個(gè)時(shí)候訪問的就是 xiaolin.cdn.com 這臺(tái) CDN 專用的 DNS 服務(wù)器,在這個(gè)服務(wù)器上,又會(huì)設(shè)置一個(gè) CNAME,指向另外一個(gè)域名,這次指向的就是 CDN 的 GSLB。接著,本地 DNS 服務(wù)器去請(qǐng)求 CDN 的 GSLB 的域名,GSLB 就會(huì)為用戶選擇一臺(tái)合適的 CDN 節(jié)點(diǎn)提供服務(wù),選擇的依據(jù)主要有以下幾點(diǎn):
  • 看用戶的 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);

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

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