Node.js應用實戰和工做原理解析

Node.js是一個基於Chrome JavaScript運行時創建的開發平臺, 用於方便地搭建響應速度快、易於擴展的網絡應用。Node.js 使用事件驅動,非阻塞I/O模型而得以輕量和高效,很是適合在分佈式設備上運行數據密集型的實時應用,例如移動應用裏的消息模塊。php

1
爲知足雲智慧透視寶用戶對Node.js的代碼級性能監控需求,咱們的程序猿Else對Node.js的工做原理和運行機制進行了大量的深刻研究,而本次分享正是來自Else的心得體會。
本文分爲倆個部分:
第一部分:經過應用層面,給你們演示什麼Node.js,它能作什麼,怎麼去作。
第二部分:在你們對Node.js有個基本認識以後,從理論層面談談Node.js的運行機制。java

Node.js應用解析

Node.js是可以跨平臺的,今晚咱們分享將基於windows,但linux或者macro大體相同,若是有疑問你們能夠相互探討,本人郵件地址 else.li@yunzhihui.com qq:287798478
nodejs環境搭建
首先登錄node官網下載安裝包,地址是:nodejs.org/en/node

2
下載完成以後,安裝步驟就是傻瓜式的下一步下一步:linux

3
安裝完成以後在windows下打開powershell,而後執行 " node -v "就能查看到咱們node的版本信息,這也就說明咱們的node已經安裝成功。chrome

4
第一個demo
以後咱們找個目錄新建一個項目文件夾,而後在項目文件夾下面新建一個hello__.js的文件,將以下代碼寫入hello__.js的文件:shell

5
然後咱們cd到項目目錄下,運行node hello__.jsexpress

6
而後在瀏覽器裏輸入127.0.0.1:8899就能直接訪問咱們的服務了npm

7
咱們在代碼中用了 var http = require("http"); 這種方式引用了node的一個自身模塊http,模塊能夠理解成DotNet的類庫、Java的包,而後應用這個http模塊快速建了一個服務,這也是node給開發人員帶來的便利。
NPM
說到便利,對於node.js還必需要提到NPM,在上個demo中咱們用到var http = require("http"); 來引用模塊,咱們也說到了http是node自身的模塊,那麼若是須要引用一些node的非自身模塊,應該如何作呢?
這個任務的第一步就交給NPM,在安裝node的同時已經將NPM工具安裝完成,咱們只須要執行NPM -v就能查看NPM的版本,直接輸入NPM能夠查看相關幫助。
NPM的最多見用法就是安裝依賴模塊,當安裝完成以後咱們的項目就能對安裝的依賴模塊進行引用。如今咱們拿 express模塊來舉個栗子,首先須要cd 到項目的node_modules目錄下,而後運行npm install express:編程

8
當你看到這樣的界面的時候就說明模塊已經安裝成功,回到項目目錄下就能看見模塊目錄下新增了一個express目錄,而後在項目目錄下建立一個hello.js的腳本文件,文件內容以下:json

9
下一步就是啓動這個項目,直接運行 node .hello.js

10
而後在瀏覽器裏輸入地址127.0.0.1:8081

11
這種方式引用模塊很是方便。那麼咱們是否是也能夠編寫本身的第三方模塊上傳到npm庫給他人使用呢?答案是確定的!接下再舉個栗子給你們說明下,首先在項目根目錄下建立一個npmtest文件夾:

12
在當前目錄下建立一個hello.js文件,內容以下:

13
而後運行npm init 命令,在運行命令以後會要求你輸入一些模塊打包的描述信息,這些信息最終會生成一個包的描述文件叫package.json

14
輸入全部信息以後會問你"Is this ok?",輸入yes就完成了打包過程。查看文件夾下面會增長一個描述包文件:

15
而後你們再look下咱們生成描述文件的內容:

16
能夠看到這些信息都是剛纔輸入的內容。包打好了,接下來就是上傳到倉庫,上傳倉庫前咱們先註冊一個帳號npm adduser,而後輸入用戶名、密碼還有郵箱地址就能夠了。
如今萬事具有了,東風來吧,運行npm publish ,就能夠把咱們包上傳了:
17
注意publish後面有一個點 」.「。當咱們的包上傳完成以後,經過調用來作個驗證,換個目錄下來執行 npm install cloudwise_else_npmtest:

18
在咱們的目錄裏查看,就知道建立的模塊已經引用過來了:

19
上面咱們介紹Node.js的環境搭建,模塊安裝、引用,以及如何建立和引用本身的模塊,並對每個點都作了相應的示例。
調試工具
如今咱們已經可以讓項目run起來了,項目運行過程當中若是出現異常怎麼辦,這是程序猿尤其關心的。在我接觸的PHP開發者中,他們比較習慣用日誌去跟蹤,本人是DotNet的忠實粉絲,江湖流傳宇宙最強IDE的Visual Studio給DotNet開發者提供了很是強大的調試功能,可讓咱們爲所欲爲的調試,快速準確的定位到Bug。因此日誌調試讓我很不能接受,如此火熱的Node.js確定也給開發者提供了不錯的debug工具。
首先仍是用npm來安裝,命令以下:
npm install -g node-inspector
啓動的時候咱們會在中間加一個debug,命令以下:
node debug .hello.js
接下來咱們啓動調試插件 node-inspector.cmd,此處linux跟windows有點差異,linux下沒有後面cmd,而後打開瀏覽器(當前此插件只支持chrome跟Opera),地址以下:http://127.0.0.1:8080/?port=5858

20
當咱們在代碼中打斷點的時候,程序就會捕獲到斷點,而後在這裏添加監視,也能夠單步執行或者逐過程逐語句,愛怎麼玩就怎麼玩。說到這裏咱們對Node.js是什麼、能作什麼、怎麼作有了基本的認識,那麼是否是就能夠開始coding工做了呢?
徹底能夠的!有人或許會問,Node.js能作的事情php、java、.net也都能作,爲何要選擇Node.js呢,難道單單是由於他不用去搭建Apache、IIS、Tomcat嗎?接下來我就根據本身的理解和你們探討下Node.js可以在最近幾年被聚光的原因。

Node.js運行機制解析

當咱們搜索Node.js時,奪眶而出的關鍵字就是 "單線程,異步I/O,事件驅動",應用程序的請求過程能夠分爲倆個部分:CPU運算和I/O讀寫,CPU計算速度一般遠高於磁盤讀寫速度,這就致使CPU運算已經完成,可是不得不等待磁盤I/O任務完成以後再繼續接下來的業務。
因此I/O纔是應用程序的瓶頸所在,在I/O密集型業務中,假設請求須要100ms來完成,其中99ms化在I/O上。若是須要優化應用程序,讓他能同時處理更多的請求,咱們會採用多線程,同時開啓100個、1000個線程來提升咱們請求處理,固然這也是一種可觀的方案。
可是因爲一個CPU核心在一個時刻只能作一件事情,操做系統只能經過將CPU切分爲時間片的方法,讓線程能夠較爲均勻的使用CPU資源。但操做系統在內核切換線程的同時也要切換線程的上線文,當線程數量過多時,時間將會被消耗在上下文切換中。因此在大併發時,多線程結構仍是沒法作到強大的伸縮性。
那麼是否能夠另闢蹊徑呢?!咱們先來看看單線程,《深刻淺出Node》一書提到 "單線程的最大好處,是不用像多線程編程那樣到處在乎狀態的同步問題,這裏沒有死鎖的存在,也沒有線程上下文切換所帶來的性能上的開銷",那麼一個線程一次只能處理一個請求豈不是無稽之談,先讓咱們看張圖:

21

Node.js的單線程並非真正的單線程,只是開啓了單個線程進行業務處理(cpu的運算),同時開啓了其餘線程專門處理I/O。當一個指令到達主線程,主線程發現有I/O以後,直接把這個事件傳給I/O線程,不會等待I/O結束後,再去處理下面的業務,而是拿到一個狀態後當即往下走,這就是「單線程」、「異步I/O」。

22
I/O操做完以後呢?Node.js的I/O 處理完以後會有一個回調事件,這個事件會放在一個事件處理隊列裏頭,在進程啓動時node會建立一個相似於While(true)的循環,它的每一次輪詢都會去查看是否有事件須要處理,是否有事件關聯的回調函數須要處理,若是有就處理,而後加入下一個輪詢,若是沒有就退出進程,這就是所謂的「事件驅動」。

圖片描述

相關文章
相關標籤/搜索