Node.js與Golang使用感覺與小結【二】

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.jshttp模塊對比


5、Node.js簡介

   Node.js是一個基於谷歌V8引擎的平臺,經過利用V8引擎並遵照COMMONJS標準實現了一個高效穩定的平臺。Node.jsweb編程是基於數據流的方式,能夠直接操控http流,正因爲這樣的特性,咱們能夠方便的去定製發送給客戶端的數據,同時因爲使用了Javascript而且因爲它的異步性,更適合於現代應用程序的開發。目前全世界已經有多家公司在使用,著名的用戶如linkin,TaoBaoMyspace等。

6、是前端選擇,仍是後端的福音?

   Node.js發佈以後,在國內外都引發了不小的討論風暴。甚至國內有很大一批前端工程師認爲這個爲前端工程師準備的平臺,也有一些後端工程師不習慣於Node.js的編程風格。

     Javascript是一門飽受爭議的語言,它從設計到投入使用只花了很短的一段時間。它借鑑了不少語言的特性,固然也存在了不少語言有的缺點。因爲歷史的緣由,Javascript早期是沒有包的根據,類的話也只是去經過prototype去模擬實現。不過Javascript 倒是世界上最爲自由的語言之一,你能夠天馬行空的利用語法糖去模擬你熟悉的語言。通常狀況下不建議去模擬其它語言,當你使用什麼語言的時候,最好去思想在這門語言中去解決一樣的問題會怎麼作,而不是用另外一種語言的思惟去作 Javascript早期彷佛成爲了前端開發者的必備工具,可隨着時代的發展你們發現原來JS也是能夠寫服務器端程序的。

   事實上,它只是一個高效http服務器的解決方案之一。並不是特別的爲前端仍是後端工程師準備,若是你想,你就能夠用。可是是否能用好,就在於你本身。縱觀軟件發展,咱們已經很難以分清什麼是前端或後端工程師,以操做系統而言,咱們如今都是在應用層上面做開發(有些書中稱爲用戶態模式),那麼相對於那些內核工程師,咱們是前端仍是後端暱?

  

7、Node.js與傳統php-fpm模式之間的對比

     傳統PHP的運行模式(非libevent之類的運行方式):

     大部份PHP運行的環境,基本上都會有一箇中間件角色的服務器,它負責與PHP的端口進行通訊(默認是9000端口),如ApacheNginx均可以做爲這樣的中間件。當一個http請求從客戶端發起後,服務器通常作如下幾件事情:

      一、根據用戶發送的請求報文,判斷是哪一種HTTP方法,是POST 仍是GET,而後在根據服務器軟件的實現進行下一步處理。

      二、判斷用戶請求的資源是不是靜態仍是動態腳本,這一步特別是一些nginx之類的中間件會去處理。若是請求的是靜態文件,在權限都符合而且資源存在的狀況下會直接發送給瀏覽器,固然有些已經請求過的文件可能會直接返回一個304狀態碼,這樣瀏覽器就會利用緩存裏面的內容給用戶。若是是動態文件,那麼中間件就會去判斷應該怎麼去處理。這也是爲何大多數相似於nginx之類的服務器,須要對php之類的腳本在配置文件中進行配置的緣由。

     三、若是是php,那麼中間件會把請求先轉發給php解釋器,而後由php解釋器運算完成以後,在把結果返回給中間件,中間件在把結果返回給瀏覽器。中間件在這裏做了代理的功能,事實上它作的工做由php經過libevent之類的模塊也能夠作,可是實現成本太高,因此大部份企業仍是選擇nginxapache去實現這些基礎功能,而把精力用於業務的開發上。

   Node.js的運行模式---基於數據流的現代編程

   對於現代程序開發來講,最爲直接的方式即是對於數據流進行直接控制。這樣你能夠決定哪些東西返回給用戶,哪些東西是你須要隱藏的。一個Node.js的應用接到一個http請求以後會作如下事情:

    一、路由器分發處理規則:由於應用自己就是服務器,因此不用轉發,不用代理,直接經過自定義的規則去處理請求。

    二、具體業務能夠按隊列形式處理,也能夠按異步形式處理。簡單來講,傳統的web開發之中,咱們須要作一件事情的時候,通常會等待上一個事情作完,而後纔會去處理新的事情。可是在node.js中,你能夠同時處理多件事情。並且當它們完成後,會將各自的結果返回給用戶。

 

 

 

  


(圖爲之前所作PPT中所截取)

    平臺風格

Node.js

  PHP

安裝方式

可源碼或直接安裝二進制安裝包

 經過源碼編譯安裝或使用第三方綠色包等

    編程風格

異步風格且基於數據操做

同步風格

    處理用戶請求方式

應用自己便是HTTP服務器

須要藉助如Nginx之類的服務器

    擴展安裝方式

npm

Phpize或在初始安裝時配置

    實時運行模式

每次更改須要重啓應用,可是也能夠參考JavaPlay框架去熱加載,可是會影響性能。由於熱加載的通常緣由是實時對文件改動進行監控。

修改文件後直接保存,即時生效,但程序會每次去讀取新的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異步流程控制,這一部份中文資料較少,而如今業內據我所知大可能是用AsyncJSstep之類的node庫來實現,並非說他們的實現很差,而是中間的原理須要搞懂才能掌握某些被認爲的關鍵技術。

將來完,,,待續

==========================================================

關於做者:

網名:念念之間    現居:深圳

Email:jinfei121@qq.com

QQ:490821193

  從03年開始玩論壇,但正式寫代碼是前幾年的事情。剛工做前兩主要寫php程序,目前主要專職寫

Javascript.平時喜歡研究各類新鮮技術~~ 

  Node與Golang的粉絲~~

==========================================================

相關文章
相關標籤/搜索