之前了解了node是什么,以及成功的安裝了node環(huán)境,接下來就來了解一些node有哪些特性?并實現(xiàn)一個最簡單的hello world.
(1)在學(xué)習(xí)node特性之前再來回顧一下node的江湖
據(jù)說node的作者Ryan Dahl起初是一個學(xué)數(shù)學(xué)的,后來走上了碼農(nóng)的道路,再工作兩年后已然成了高性能的web服務(wù)器專家,專門為客戶解決性能問題,在這期間,他嘗試過用Ruby寫過web服務(wù)器,但是因為Ruby的虛擬機(jī)太爛,而沒有解決根本的問題,他也嘗試過c語言,雖然c的性能高,但是讓c來實現(xiàn)業(yè)務(wù)邏輯不太現(xiàn)實,經(jīng)過這樣一次次的經(jīng)歷,Ryan Dahl感受到了解決問題的關(guān)鍵 是要通過事件驅(qū)動和異步的I/O來達(dá)成目的。這時候正好v8(瀏覽器中用來渲染js部分)引擎來了,v8滿足了他關(guān)于高性能web服務(wù)器的所有想象。因為:
- v8沒有同步的I/O流。不會出現(xiàn)一個同步I/O導(dǎo)致事件性能急劇下降。
- v8性能足夠好,遠(yuǎn)比python,ruby等語言執(zhí)行快。
- javascript的閉包特性非常的方便,比c中的回掉函數(shù)好用
因為有了v8,node也就接重而來。node的誕生可以讓js運行在服務(wù)器端的平臺,也就是說可以和jsp,php等服務(wù)器端語言進(jìn)行媲美了。當(dāng)然和他們也有不同,nodejs不是獨立的語言,不像php,jsp等,既是平臺又是語言,nodejs使用js進(jìn)行編程,運行在js引擎上。而且node跳過了Apach,Naginx,IIS等HTTP服務(wù)器,他自己不用建設(shè)在任何服務(wù)器軟件之上,沒有web容器的概念。
(2)nodejs的特性:
根據(jù)node官方文檔介紹,Node.js? 是一個基于 Chrome V8 引擎的 JavaScript 運行時。 Node.js 使用高效、輕量級的事件驅(qū)動、非阻塞 I/O 模型。它的包生態(tài)系統(tǒng),npm,是目前世界上最大的開源庫生態(tài)系統(tǒng)。因此可以提煉出一下特點(所謂的特點就是node是如何解決服務(wù)器高性能瓶頸問題的):
單線程:
??所謂的單線程是指,nodejs不是為每一個客戶的請求都創(chuàng)建一個單獨的線程,而是僅僅使用一個線程,當(dāng)有用戶連接的時候就會觸發(fā)一個內(nèi)部事件,通過非阻塞I/O,事件驅(qū)動機(jī)制,讓node程序在宏觀上也是并行的(一個線程怎么能是并行的了?這就涉及到事件驅(qū)動了),不像java等服務(wù)器端語言,會為每一個客戶的請求創(chuàng)建一個單獨的線程,每個線程如果耗用2M的內(nèi)存的話,理論上一個8G的內(nèi)存服務(wù)器可以同時連接的最大用戶數(shù)為4000個左右,要讓web支持更多的用戶,就需要怎見服務(wù)器的數(shù)量,這樣硬件成本也就上去了。而nodejs不一樣,一個8G的內(nèi)服務(wù)器可以同時處理超過4萬用戶的連接,另外,操作系統(tǒng)會減少線程創(chuàng)建和銷毀的開銷。因為node的單線程也造就了node的不健壯,因為所有用戶的請求都是運行在一個線程上面的,當(dāng)有一個用戶導(dǎo)致線程崩掉時其他用戶也就蹦了。非阻塞I/O
??所謂的非阻塞I/O,是相對于阻塞I/O而言的,像java這樣的服務(wù)端語言,當(dāng)在訪問數(shù)據(jù)庫取得數(shù)據(jù)的時候,需要一定的時間,在傳統(tǒng)的單線程處理機(jī)制中,在執(zhí)行了訪問數(shù)據(jù)庫的代碼之后,整個線程都將暫停下來,等待數(shù)據(jù)庫返回結(jié)果才能 執(zhí)行后面的代碼,也就是說I/O(讀取數(shù)據(jù)庫)阻塞了代碼的執(zhí)行,極大的降低了程序的執(zhí)行效率。nodejs使用的是事件回掉的機(jī)制,通過這種機(jī)制可以讓I/O的操作變?yōu)榉亲枞@是因為node在執(zhí)行了訪問數(shù)據(jù)庫的代碼后,不會等待數(shù)據(jù)庫返回結(jié)果,而是立即轉(zhuǎn)而執(zhí)行后面的代碼,把數(shù)據(jù)庫返回的結(jié)果的處理代碼放在回掉函數(shù)中,從而提高程序的執(zhí)行效率。
??阻塞模式下,一個線程只能處理一個任務(wù),想要提高吞吐量必須使用多線程,在非阻塞模式下,一個線程永遠(yuǎn)都在執(zhí)行計算操作,這個現(xiàn)成的CPU核心利用率永遠(yuǎn)是百分之百。所以這也是一種特別有哲理的解決方案,與其有好多人,但是多個人都閑著,不如一個人在不停的忙著。事件驅(qū)動
??在node中,客戶端請求建立連接,提交數(shù)據(jù)等行為,會觸發(fā)相應(yīng)的事件,node中,在某一時刻 ,只能執(zhí)行一個 事件回掉函數(shù),但是在執(zhí)行事件回掉的中途,可以轉(zhuǎn)而處理其他 事件(比如又有新的用戶連接了,他會把新的請求放入事件隊列當(dāng)中,然后返回執(zhí)行原來事件的回掉函數(shù)),像這種事件處理機(jī)制稱作為事件環(huán)機(jī)制。
(3)知道了node的江湖和特性,了解nodejs是如何進(jìn)行編程的,以hello worls為例編寫一個最簡單的node程序
新建一個文件hello.js,內(nèi)容如下:
var http = require('http')
// 創(chuàng)建服務(wù)器
var server = http.createServer(function (req, res) {
// req 表示請求 res表示響應(yīng)
res.writeHead(200, {"Content-type": "text/html;charset=UTF-8"})
res.end("hello world")
});
// 運行服務(wù)器
server.listen(3000, '127.0.0.1')
創(chuàng)建好文件怎么來運行了?注意不是通過瀏覽器的方式,因為 nodejs是服務(wù)器的程序,寫的js語句都將運行在服務(wù)器上 ,返回給客戶的都是處理好的純html??梢酝ㄟ^打開控制臺,輸入node + 文件路徑名如下:
node C:\Users\Administrator\Desktop\node\hello.js
輸入命令敲回車后打開瀏覽器在地址欄輸入127.0.0.1:3000,就會看到在瀏覽器上出現(xiàn)一個hello world.
總結(jié): 通過前面章節(jié),已經(jīng)明確了node的概念,并且創(chuàng)建了自己web服務(wù)。接下來的章節(jié)就來學(xué)習(xí)用node來 進(jìn)行編程。