Node.js與Golang使用感覺與小結 javascript
目錄 php
1、互聯網的基石TCP/IP協議 css
2、HTTP服務器編寫與編程語言無關 html
3、構建HTTP服務器須要掌握的知識點 前端
4、HTTP協議基礎 java
5、Node.js簡介 node
6、是前端選擇,仍是後端的福音? nginx
7、Node.js與傳統php-fpm模式之間的對比 web
8、安裝Node.js apache
9、讓瀏覽器讀懂你的心--Content-Type
10、向瀏覽器發送文件
11、Node.js異步流程控制(序列模式、併發模式、有限併發模式)
12、靜態資源文件的簡單優化
十3、如今還需少些什麼?
十4、Golang 簡介
十5、爲何要用Golang ?
十6、安裝Golang開發環境
十7、如何使用Golang 編寫一個HTTP服務器?
十8、Golang 的http包與Node.js的http模塊對比
5、Node.js簡介
Node.js是一個基於谷歌V8引擎的平臺,經過利用V8引擎並遵照COMMONJS標準實現了一個高效穩定的平臺。Node.js作web編程是基於數據流的方式,能夠直接操控http流,正因爲這樣的特性,咱們能夠方便的去定製發送給客戶端的數據,同時因爲使用了Javascript而且因爲它的異步性,更適合於現代應用程序的開發。目前全世界已經有多家公司在使用,著名的用戶如linkin,TaoBao,Myspace等。
6、是前端選擇,仍是後端的福音?
Node.js發佈以後,在國內外都引發了不小的討論風暴。甚至國內有很大一批前端工程師認爲這個爲前端工程師準備的平臺,也有一些後端工程師不習慣於Node.js的編程風格。
Javascript是一門飽受爭議的語言,它從設計到投入使用只花了很短的一段時間。它借鑑了不少語言的特性,固然也存在了不少語言有的缺點。因爲歷史的緣由,Javascript早期是沒有包的根據,類的話也只是去經過prototype去模擬實現。不過Javascript 倒是世界上最爲自由的語言之一,你能夠天馬行空的利用語法糖去模擬你熟悉的語言。通常狀況下不建議去模擬其它語言,當你使用什麼語言的時候,最好去思想在這門語言中去解決一樣的問題會怎麼作,而不是用另外一種語言的思惟去作 Javascript早期彷佛成爲了前端開發者的必備工具,可隨着時代的發展你們發現原來JS也是能夠寫服務器端程序的。
事實上,它只是一個高效http服務器的解決方案之一。並不是特別的爲前端仍是後端工程師準備,若是你想,你就能夠用。可是是否能用好,就在於你本身。縱觀軟件發展,咱們已經很難以分清什麼是前端或後端工程師,以操做系統而言,咱們如今都是在應用層上面做開發(有些書中稱爲用戶態模式),那麼相對於那些內核工程師,咱們是前端仍是後端暱?
7、Node.js與傳統php-fpm模式之間的對比
傳統PHP的運行模式(非libevent之類的運行方式):
大部份PHP運行的環境,基本上都會有一箇中間件角色的服務器,它負責與PHP的端口進行通訊(默認是9000端口),如Apache、Nginx均可以做爲這樣的中間件。當一個http請求從客戶端發起後,服務器通常作如下幾件事情:
一、根據用戶發送的請求報文,判斷是哪一種HTTP方法,是POST 仍是GET,而後在根據服務器軟件的實現進行下一步處理。
二、判斷用戶請求的資源是不是靜態仍是動態腳本,這一步特別是一些nginx之類的中間件會去處理。若是請求的是靜態文件,在權限都符合而且資源存在的狀況下會直接發送給瀏覽器,固然有些已經請求過的文件可能會直接返回一個304狀態碼,這樣瀏覽器就會利用緩存裏面的內容給用戶。若是是動態文件,那麼中間件就會去判斷應該怎麼去處理。這也是爲何大多數相似於nginx之類的服務器,須要對php之類的腳本在配置文件中進行配置的緣由。
三、若是是php,那麼中間件會把請求先轉發給php解釋器,而後由php解釋器運算完成以後,在把結果返回給中間件,中間件在把結果返回給瀏覽器。中間件在這裏做了代理的功能,事實上它作的工做由php經過libevent之類的模塊也能夠作,可是實現成本太高,因此大部份企業仍是選擇nginx或apache去實現這些基礎功能,而把精力用於業務的開發上。
Node.js的運行模式---基於數據流的現代編程
對於現代程序開發來講,最爲直接的方式即是對於數據流進行直接控制。這樣你能夠決定哪些東西返回給用戶,哪些東西是你須要隱藏的。一個Node.js的應用接到一個http請求以後會作如下事情:
一、路由器分發處理規則:由於應用自己就是服務器,因此不用轉發,不用代理,直接經過自定義的規則去處理請求。
二、具體業務能夠按隊列形式處理,也能夠按異步形式處理。簡單來講,傳統的web開發之中,咱們須要作一件事情的時候,通常會等待上一個事情作完,而後纔會去處理新的事情。可是在node.js中,你能夠同時處理多件事情。並且當它們完成後,會將各自的結果返回給用戶。
(圖爲之前所作PPT中所截取)
平臺風格 |
Node.js |
PHP |
安裝方式 |
可源碼或直接安裝二進制安裝包 |
經過源碼編譯安裝或使用第三方綠色包等 |
編程風格 |
異步風格且基於數據操做 |
同步風格 |
處理用戶請求方式 |
應用自己便是HTTP服務器 |
須要藉助如Nginx之類的服務器 |
擴展安裝方式 |
npm |
Phpize或在初始安裝時配置 |
實時運行模式 |
每次更改須要重啓應用,可是也能夠參考Java中Play框架去熱加載,可是會影響性能。由於熱加載的通常緣由是實時對文件改動進行監控。 |
修改文件後直接保存,即時生效,但程序會每次去讀取新的php文件,有必定的I/O損耗。 |
語言規則 |
類C風格 |
類C風格 |
性能對比 |
----請自行使用http_load之類工具對比 |
----請自行使用http_load之類工具對比 |
8、安裝Node.js
先登陸 http://nodejs.org/download/ 而後下載適合你的平臺版本,建議初學者下載二進制安裝包,但熟悉以後仍是用源碼方式編譯安裝好。編譯安裝的好處在於,編譯器會根據用戶所工做的平臺環境進行優化。
假設咱們此時下載了二進制包,那麼
一路Next下去就能夠了。
要檢測是否安裝成功,在你的控制檯中輸入 node -v (windows用戶能夠在開始菜單中的運行中輸入cmd進行,因爲文章在windows平臺寫的,以windows版本爲例)
9、讓瀏覽器讀懂你的心--Content-Type
寫Node.js程序,你只須要一個編輯器,一個運行環境就好~
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': "text/plain; charset=utf-8"});
res.write('世界你好~!\n');
res.end();
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
將裏面的代碼內容保存爲hello.js,而後經過控制檯運行 node <你保存的目錄>/hello.js 。作完這一切以後,打開你的瀏覽器輸入http://127.0.0.1:3000 按下回車看看效果吧。
經過這個DEMO,你應該能看到一個簡單的http服務器的成功產生了吧。固然要作一個功能齊全的服務器還有不少東西須要作,這裏只是一個簡單的DEMO.在這個DEMO中,你們應該會發現Content-Type這個東東,前面講進Content-Type這個東東是告訴瀏覽器要作些什麼事情。好比有的時候你發給用戶的是否是文本文件而是視頻或是圖片,那麼就須要告訴瀏覽器調用系統的某些程序來運行或是顯示它。
10、向瀏覽器發送文件
仍是先上代碼吧,一切以代碼爲先。
var server,
ip = "127.0.0.1", port = 3000,http = require('http'), fs = require("fs"), folderPath = "static",//存放文件夾
url = require('url'),
path=require('path'),
urlpath,//請求路徑
filePath;//文件路徑
var types = {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"png": "image/png",
"tiff": "image/tiff",
"txt": "text/plain"
};
server = http.createServer(function (req, res) {
urlpath = url.parse(req.url);
filePath = folderPath + urlpath.pathname;
var content_type= types[path.extname(urlpath.pathname).substr(1)]||'text/plain';
fs.readFile(filePath, function(err, file) {
if (err) {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end();
return;
}
res.writeHead(200, {'Content-Type': content_type});
res.write(file);
res.end();
});
});
server.listen(port, ip);
console.log("Server running at http://" + ip + ":" + port);
發送文件固然存在讀取的文件的這一過程,因此須要用到fs包。這個DEMO應該比較簡單,只要你有前面的基礎,相信很快能明白這個DEMO的意圖。這一部份不打算具體說明,由於已經有不少前期的說明,並且網絡上也有不少文章,咱們着重須要講的是Node.js異步流程控制,這一部份中文資料較少,而如今業內據我所知大可能是用AsyncJS或step之類的node庫來實現,並非說他們的實現很差,而是中間的原理須要搞懂才能掌握某些被認爲的關鍵技術。
將來完,,,待續
==========================================================
關於做者:
網名:念念之間 現居:深圳
Email:jinfei121@qq.com
QQ:490821193
從03年開始玩論壇,但正式寫代碼是前幾年的事情。剛工做前兩主要寫php程序,目前主要專職寫
Javascript.平時喜歡研究各類新鮮技術~~
Node與Golang的粉絲~~
==========================================================