CDN(Content Delivery Network,內容分發網絡)。其含義,在百度百科上是這麼寫的:CDN 是構建在數據網絡上的一種分佈式的內容分發網。CDN 的做用是採用流媒體服務器集羣技術,克服單機系統輸出帶寬及併發能力不足的缺點,可極大提高系統支持的併發流數目,減小或避免單點失效帶來的不良影響。。。後面一大堆。jquery
至於它到底寫的是什麼。我也解釋不清楚。其做用簡單粗暴地理解就是:加速。舉例說明:ajax
使用Chrome上一個網站(在這以前調出開發者工具(F12)):http://www.codeproject.com/windows
而且在開發者工具中選中「Network」。api
而後按下回車進入網站。等待網站加載完畢。而後看到這個Network裏面的內容。瀏覽器
有一條極其可恥的紅色請求。請求的文件名爲:jquery.min.js,類型爲Get,狀態爲(faild),還花費了10.93S。最下面的信息顯示總共花費了12.84秒,而這個jquery的請求就花費了10.93s,還失敗了。緩存
如今再單擊這條紅色的請求,來查看詳情。服務器
以下圖:網絡
看到這個Request URL,發現這條請求是發送到googleapis.com主機的。問題就在這裏。谷歌在中國,基本上是被防火牆轟殺至渣的。這條請求根本不能完成正常的響應,致使了花了10.93s尚未響應,最後還請求失敗了。併發
發生這類狀況,通常都是在咱們訪問國外的網站的時候發生的,國內開發者都知道國情,因此要麼已經把腳本放在本身的網站下了,或者直接把請求發送到某個CDN服務器上來加載。可是向Codeproject、Stackoverflow等國外網站都直接用googleapis,mvc
因此有這問題。
那麼這個問題該如何解決。這時候,CDN技術就能夠派上用場了。我這個所謂的CDN,只是一個測驗而已,擺不上臺面的。本身玩玩就能夠了。
那麼如何來操做。
下面分兩大塊來測試。一、不寫一行代碼;二、用少許的代碼控制(.net mvc4)
首先來講第一種:不寫一行代碼如何來作。
(1)須要的設備:一臺服務器(windows),一臺客戶機(windows)。注意:若是沒有服務器,那麼只有一臺客戶機也是能夠的,就是一臺計算機又當服務器,又當客戶機。
(2)服務器(或者客戶機)須要去控制面板打開IIS管理,這個不說了。
(3)下載一個jQuery文件。這裏有個微軟CDN服務器能夠下載,打開連接以後,Ctrl+S就好了——http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.4.min.js
(4)原理簡介:咱們在瀏覽器輸入一個域名(網址),按下回車以後,計算機(windows)作的事情,就是先在本地的一個名叫hosts的文件中查找映射關係。
這個hosts文件的做用就是解析域名,把請求的域名轉換成IP。來看一下hosts文件中內容(能夠直接用記事本打開,此處使用Notepad++,強烈推薦啊)。以下圖:
看到這個文件有不少的註釋,這些信息很是有用,建議仔細研讀,這裏稍做解釋。這些註釋說的大意就一句話:
本文件用於域名解析,用法:一行只能寫一個映射關係,語法是:IP 空格 域名。
也就是說,咱們只要像他那樣寫,在最後追加一行,並保存,好比
127.0.0.1 www.baidu.com
而後去瀏訪問百度,發現並無訪問到百度。由於域名解析被指向了本地127.0.0.1。
由此能夠想到,若是能把這個ajax.googleapis.com域名解析成咱們能夠訪問到的IP不就能夠了嘛。因而先肯定服務器(或者客戶機)的IP地址。我這裏的IP地址是局域網IP地址:192.168.1.108。
若是是客戶機,好比是本身的計算機,那麼能夠寫127.0.0.1。因而追加到hosts中去:
192.168.1.108 ajax.googleapis.com
接下來,看到光是域名解析作完了是不夠的,由於那一段請求很是的長,後面有不少級目錄:http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
那麼這時候IIS的功能就要用起來了。首先到服務器中建立好本地目錄,注意這個目錄的結構要作成:/ajax/libs/jquery/1.6.2/jquery.min.js。以下圖:
而後在IIS中添加網站,怎麼添加這裏不說,添加以後如圖:
而後注意,在訪問codeproject以前最好作一件事情,就是清空瀏覽器緩存,不然可能會從緩存中讀取,看不到效果。接着來訪問網站。
看到這結果,完美加載狀態碼爲200,成功了。而後單擊這條查看詳情:
咱們看到這裏多了一個Remote Address,就是咱們想要解析到的IP地址,後面的80是默認端口。簡直完美運行啊。
這裏不得不說明一下,hosts文件應該是不支持端口映射的,我試了不少,像什麼冒號+端口,逗號+端口,都不行,去查好像也是說不行,
也就是說咱們解析的時候只能使用80端口。而80端口是默認的,因此在hosts文件中不用指明。
那麼再來考慮一種狀況,不一樣的網站jquery文件請求版本可能不一樣。codeproject是1.6.2,stackoverflow的是1.7.1,jquery.com的請求是1.11.2。而咱們剛纔只有一個1.6.2。
既然這樣,那咱們會想,我在剛纔的文件夾/ajax/libs/jquery/下,多加幾個版本文件夾不就好了嗎。好比再加一個1.7.1,再加一個1.11.2,而後在這兩個文件夾下再各放一個
jquery.min.js。不錯,這的確是能夠的。這個jquery.min.js文件的實際版本,你能夠不跟文件夾對應,你能夠所有都是1.6.2,只要外面的文件夾版本寫對就好了,可是這樣不是很好,
由於有些網站用的1.11.2版本里的特性,而你給他解析加載的其實是1.6.2,這樣就會報錯了。因此最好仍是對應起來。
接下來講第二種方法,用少許的.net mvc手段來控制。
可讓jquery的實際版本和文件夾寫出來的版本號完美對應。
首先用visial studio 2012 update5來建立一個mvc4項目。
以下:
建立完了以後沒用的東西所有刪除,其中這個script文件夾中放了不少的jquery版本,如圖:
好了。而後咱們來建立一個控制器,取名爲HomeController,寫一個Action,取名爲Index,以下代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace CDN.Controllers { public class HomeController : Controller { public void Index(object id) { var js = String.Format(@"/Script/jquery-{0}.min.js", id); var temp = Server.MapPath("~" + js); Response.WriteFile(temp); } } }
而後根據http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js這個請求的特性,來配置一下路由參數。以下代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace CDN { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "ajax/libs/jquery/{id}/jquery.min.js", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } } }
懂MVC4的人一眼就知道了,若是不懂的,建議先看看mvc4的路由規則,這裏再也不贅述。這個url,就是根據那條請求特性寫的,把版本號用{id}來代替,把請求指向/Home/Index?id=版本號。
因而HomeController中的Index順利的接收到了請求,再根據id中傳過來的版本號找到服務器中相關文件,而後response出去,就能夠了。最後發佈出來,部署到IIS中。詳細過程不贅述。如圖:
而後去訪問一下,結果跟上面如出一轍,這裏不截圖了。
我的感受第二種方法好一點,用程序控制版本。不過第一種方法簡單粗暴,也是能夠的。
模擬CDN就完成了。這裏用googleapis來舉例,由於用到的仍是挺多,因此就用這個了。這種方法本身隨便玩玩就好了。畢竟要改hosts,不宜作什麼用處。