Node.js Basic

Node.js是一個JavaScript運行平臺

  • Node.js是基于Google Chrome的JavaScript運行時建立的平臺照卦,用于搭建響應(yīng)速度快、易擴(kuò)展的網(wǎng)絡(luò)應(yīng)用。
  • Node.js實際上是JavaScript運行環(huán)境,對Google V8引擎進(jìn)行了封裝智末。
  • Node.js使用事件驅(qū)動機(jī)制、非阻塞I/O模型徒河,因此得以輕量和高效系馆。
  • Node.js適用于分布式設(shè)備上運行數(shù)據(jù)密集型的實時應(yīng)用

Node.js所采用的GoogleV8引擎是基于ECMAScript2015開發(fā)的,ECMAScript2015是ECMAScript標(biāo)準(zhǔn)的第6個版本顽照,又稱為ES6由蘑,可簡寫為ES2015。

Node.js有什么優(yōu)點呢代兵?

Node.js和JavaScript的優(yōu)勢之一是它們的單線程編程模型尼酿,多個線程一般會引入bug,盡管一些新的編程語言奢人,包括Go谓媒、Rust試圖提供更加安全的并發(fā)工具,但Node.js仍然保留了JavaScript在瀏覽器中所用的模型何乎。在為瀏覽器編寫代碼時,編寫的指令序列依次執(zhí)行一條土辩,代碼并不是并行執(zhí)行的支救。然而對于用戶界面來說,這樣是不合理的拷淘。沒有用戶愿意在瀏覽器執(zhí)行網(wǎng)絡(luò)訪問或文件獲取這樣低速操作時等待各墨。為了解決這個問題,瀏覽器引入了事件機(jī)制:當(dāng)點擊按鈕時启涯,會有一個事件被觸發(fā)贬堵,有一個之前定義的函數(shù)會運行起來。事件機(jī)制可以規(guī)避在線程編程時經(jīng)常出現(xiàn)資源死鎖和靜態(tài)條件结洼。

  • 單線程
    Node.js單線程是指Node并沒有創(chuàng)建線程的能力黎做,所以代碼都是單線程執(zhí)行的。不過Node宿主環(huán)境并不是單線程的松忍,它維護(hù)一個執(zhí)行隊列蒸殿,循環(huán)檢測并調(diào)度JS線程來執(zhí)行,因此單線程執(zhí)行和并發(fā)操作并不沖突。
  • 事件輪詢機(jī)制
    Node.js 可在不斷新增額外線程的情況下宏所,依然對任務(wù)進(jìn)行并發(fā)處理酥艳。它是通過事件輪詢(event loop)來實現(xiàn)并行操作的。
  • 非阻塞I/O
    由于Node.js是事件驅(qū)動的爬骤,因此使用了事件循環(huán)來解決I/O操作帶來的瓶頸充石。在Node.js中一個I/O操作通常會帶有 一個回調(diào)函數(shù),當(dāng)I/O操作完畢并返回時霞玄,會調(diào)用此回調(diào)函數(shù)骤铃。與此同時,主線程則繼續(xù)執(zhí)行接下來的代碼溃列。
  • V8虛擬機(jī)
    Node.js是一個基于Google Chrome V8 Javascript引擎之上的平臺劲厌,可用于創(chuàng)建輕量級、快速听隐、可擴(kuò)展补鼻、事件驅(qū)動和非堵塞I/O的應(yīng)用。
  • 事件驅(qū)動
    Node.js使用事件驅(qū)動模型雅任,即當(dāng)Web Server接收到請求時风范,將其關(guān)閉然后進(jìn)行處理,然后去服務(wù)下一個Web請求沪么。當(dāng)請求完成后硼婿,被放回處理隊列中。當(dāng)?shù)竭_(dá)隊列開頭時禽车,結(jié)果被返回給客戶端寇漫。
  • RESTful API
    支持Web服務(wù)和動態(tài)Web應(yīng)用程序的多層架構(gòu),實現(xiàn)可重用性殉摔、可擴(kuò)展性州胳、組件可響應(yīng)性的清晰分離。開發(fā)人員可輕松使用AJAX和RESTful Web服務(wù)創(chuàng)建豐富網(wǎng)絡(luò)應(yīng)用逸月。

Node.js適用于那些場景呢栓撞?

  • 面向服務(wù)的架構(gòu)

面向服務(wù)的架構(gòu)就是做號前后端的依賴分離,將所有業(yè)務(wù)的關(guān)鍵業(yè)務(wù)邏輯都封裝成RESTful接口調(diào)用碗硬,上層只需考慮如何用接口來構(gòu)建具體應(yīng)用瓤湘。這樣后臺程序員無需知道具體數(shù)據(jù)是如何從一個頁面?zhèn)鬟f到另一個頁面的,也無需知道用戶數(shù)據(jù)更新是通過AJAX異步獲取還是刷新頁面獲取的恩尾。

  • RESTful API

RESTful API場景可處理數(shù)萬條連接請求弛说,該操作沒有太復(fù)雜的邏輯,僅僅就是請求API特笋,將數(shù)據(jù)進(jìn)行返回即可剃浇。簡而言之巾兆,其本質(zhì)是從數(shù)據(jù)庫中查找值并將其組成一個響應(yīng),由于這類響應(yīng)是很小的文本虎囚,同時連接請求也是很小的文本角塑,因此整體流量不高。

  • AJAX請求應(yīng)用

大數(shù)據(jù)時代對個人用戶也面的定制信息已成為主流淘讥,當(dāng)緩存失效后需發(fā)起AJAX請求圃伶,此時應(yīng)用Node.js可響應(yīng)大量的并發(fā)請求。Node.js適用于高并發(fā)蒲列、I/O密集窒朋、少量業(yè)務(wù)邏輯情況下的AJAX請求。

Node.js 不適用那些場景呢蝗岖?

  • 實時性要求很高的場景

例如工程交換機(jī)侥猩、工控機(jī)器人、DCS集控系統(tǒng)等抵赢。此類場景基本通過垃圾回收機(jī)制來管理系統(tǒng)內(nèi)存欺劳,因此Node.js將會影響響應(yīng)速度,并且難以優(yōu)化铅鲤。

  • 計算密集惡性系統(tǒng)

計算密集型系統(tǒng)基本是C語言的天下划提,基于JavaScript語言的Node.js在計算性能上很難與C相比。

  • 單一進(jìn)程控制大內(nèi)存的場景

由于Google V8引擎的設(shè)計原則邢享,在32bit下有1G最大內(nèi)存的限制鹏往,在64bit下有1.7GB的最大內(nèi)存限制。雖然Node.js的Buffer分配可以不超過此限制骇塘,但也會帶來垃圾回收機(jī)制上性能的退化伊履。

Node異步機(jī)制的種類

Node異步機(jī)制大致分為回調(diào)函數(shù)、pub/sub模式(事件模式)款违、異步庫控制庫(async湾碎、when...)、promise項目奠货、Generator項目等。

Node與V8

Node的動力源自Google V8 JavaScript引擎座掘,是由服務(wù)于Google Chrome的Chromium項目組開發(fā)的递惋,V8中一個值得稱道的特性是它會被JavaScript直接編譯為機(jī)器碼,另外還有一些代碼優(yōu)化特性溢陪,所以Node才能這么快萍虽。

Node的本地部件libuv負(fù)責(zé)處理I/O,V8負(fù)責(zé)JavaScript代碼的解釋和執(zhí)行形真。使用C++綁定層可將libev和V8結(jié)合杉编。

Node軟件組合(軟件棧)

非阻塞I/O

在服務(wù)器編程中訪問磁盤和網(wǎng)絡(luò)這樣的I/O請求會比較慢超全,所以希望在讀取文件或通過網(wǎng)絡(luò)發(fā)送消息時,運行平臺不會阻塞業(yè)務(wù)邏輯的執(zhí)行邓馒。Node.js使用了三種技術(shù)來解決這個問題:事件嘶朱、異步API、非阻塞I/O光酣。

非阻塞I/O是一個底層術(shù)語疏遏,意思是說程序可以在做其它事情時發(fā)起一個請求來獲取網(wǎng)絡(luò)資源,當(dāng)網(wǎng)絡(luò)操作完成時救军,將會運行一個回調(diào)函數(shù)來處理這個操作結(jié)果财异。

例如:典型Node Web應(yīng)用程序

使用Web應(yīng)用庫Express來處理商店的訂單流程,為了購買商品唱遭,瀏覽器發(fā)起了一個請求戳寸,然后應(yīng)用程序檢查庫存,為用戶創(chuàng)建一個賬號并發(fā)送回執(zhí)郵件拷泽,同時會返回一個JSON格式的HTTP響應(yīng)給瀏覽器疫鹊。

這里同時在做的使用包括:

  • 發(fā)送一件回執(zhí)郵件
  • 更新數(shù)據(jù)庫來保存用戶詳細(xì)信息和訂單
典型Node Web應(yīng)用程序

數(shù)據(jù)庫是通過網(wǎng)絡(luò)訪問的,Node中的網(wǎng)絡(luò)訪問是非阻塞的跌穗,使用名為libuv的庫訪問操作系統(tǒng)的非阻塞網(wǎng)絡(luò)調(diào)用困鸥。libuv庫在Linux、MaxOS褐筛、Windows中的實現(xiàn)是不同的龄坪。

訪問硬盤時比如在生成回執(zhí)郵件并從硬盤中讀取郵件模板時,libuv庫會借助線程池模擬出一種使用非阻塞調(diào)用的假象羹唠。

在進(jìn)行速度較慢的處理時讓Node能做其它事情奕枢,是使用帶非阻塞I/O的異步API真正的好處。即便只有一個單線程佩微、單進(jìn)程的Node Web應(yīng)用缝彬,也可以同時處理上千個網(wǎng)絡(luò)訪客發(fā)起的連接。Node是如何做的哺眯,得先研究一下事件輪詢谷浅。

事件輪詢

例如:在典型的Node Web應(yīng)用程序中,響應(yīng)瀏覽器請求時奶卓,Node內(nèi)置的HTTP服務(wù)器庫即核心模塊http.Server使用流一疯、事件、Node的HTTP請求解析器的組合來處理請求夺姑。在使用Express Web應(yīng)用庫添加的回調(diào)函數(shù)也是由它觸發(fā)的墩邀。這個回調(diào)函數(shù)會觸發(fā)數(shù)據(jù)庫查詢語言,最終應(yīng)用程序會使用HTTP發(fā)送JSON作為響應(yīng)盏浙。

整個過程使用了三種非阻塞網(wǎng)絡(luò)調(diào)用:

  • 一個用于請求
  • 一個用于數(shù)據(jù)庫
  • 一個用于響應(yīng)

Node是如何調(diào)配這些網(wǎng)絡(luò)操作的呢眉睹?答案是事件輪詢event loop荔茬。

事件輪詢

事件輪詢是單項運行的先入先出隊列,需要經(jīng)歷幾個階段竹海,輪詢中每個迭代都需要運行的重要階段上圖已展示慕蔚。

  1. 首先計時器開始執(zhí)行,計時器都是用JavaScript的setTimeout和setInterval函數(shù)安排好的站削。
  2. 接著是運行I/O回調(diào)坊萝,即觸發(fā)提前編寫的回調(diào)函數(shù)。
  3. 輪詢階段會去獲取新的I/O事件
  4. 最后使用setImmediate安排回調(diào)

本例是個特例许起,因為允許將回調(diào)安排在當(dāng)前隊列中的I/O回調(diào)完成之后立即執(zhí)行

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末十偶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子园细,更是在濱河造成了極大的恐慌惦积,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猛频,死亡現(xiàn)場離奇詭異狮崩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鹿寻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門睦柴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毡熏,你說我怎么就攤上這事坦敌。” “怎么了痢法?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵狱窘,是天一觀的道長。 經(jīng)常有香客問我财搁,道長蘸炸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任尖奔,我火速辦了婚禮搭儒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘提茁。我一直安慰自己仗嗦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布甘凭。 她就那樣靜靜地躺著,像睡著了一般火邓。 火紅的嫁衣襯著肌膚如雪丹弱。 梳的紋絲不亂的頭發(fā)上德撬,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音躲胳,去河邊找鬼蜓洪。 笑死,一個胖子當(dāng)著我的面吹牛坯苹,可吹牛的內(nèi)容都是我干的隆檀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粹湃,長吁一口氣:“原來是場噩夢啊……” “哼恐仑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起为鳄,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裳仆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孤钦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歧斟,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年偏形,在試婚紗的時候發(fā)現(xiàn)自己被綠了静袖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俊扭,死狀恐怖队橙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情统扳,我是刑警寧澤喘帚,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站咒钟,受9級特大地震影響吹由,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜朱嘴,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一倾鲫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萍嬉,春花似錦乌昔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至行冰,卻和暖如春溺蕉,著一層夾襖步出監(jiān)牢的瞬間伶丐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工疯特, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留哗魂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓漓雅,卻偏偏與公主長得像录别,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邻吞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,080評論 0 1
  • 這篇文章來自 Github 上的一位開發(fā)者收集整理的 Node.js 中文學(xué)習(xí)資料和教程導(dǎo)航组题。Node 是一個服務(wù)...
    吾名無雙閱讀 1,503評論 0 19
  • 作者:Weiwei SUN文章源自:http://wwsun.github.io/posts/nodejs-int...
    IT程序獅閱讀 42,925評論 3 52
  • 1、什么是錯誤優(yōu)先的回調(diào)函數(shù)吃衅? 錯誤優(yōu)先的回調(diào)函數(shù)用于傳遞錯誤和數(shù)據(jù)往踢。第一個參數(shù)始終應(yīng)該是一個錯誤對象, 用于檢查...
    Keely閱讀 12,395評論 1 7
  • Node.js是目前非撑遣悖火熱的技術(shù)峻呕,但是它的誕生經(jīng)歷卻很奇特。 眾所周知趣效,在Netscape設(shè)計出JavaScri...
    w_zhuan閱讀 3,613評論 2 41