一、什麼是nodejs?node
簡單的說 Node.js 就是運行在服務端的 JavaScript。程序員
Node.js 是一個基於Chrome JavaScript 運行時創建的一個平臺。數據庫
Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎,V8引擎執行Javascript的速度很是快,性能很是好。(不用考慮兼容性問題)後端
Node.js是JS的一種運行環境,node.js爲JS提供操做文件、建立http服務、建立TCP、UDP服務等接口,因此Node.js能夠完成其餘後臺語言能完成的工做。瀏覽器
二、什麼是交互式運行環境緩存
在cmd中輸入node回車進入的谷歌的控制檯界面叫作repl交互式運行環境,服務器
REPL:Read-Eval-Print-Loap,即讀-計算-寫-循環,描述了其四項基本功能。多線程
REPL是可交互運行環境,開發者能夠在該運行環境中輸入任何JavaScript表達式,回車後運行環境會顯示結果。REPL是爲了開發者方便測試JavaScript代碼。架構
三、REPL中的基礎命令:併發
break:放棄或重寫當前函數(ctrl+c);
clear:清楚REPL上下文中保存的全部變量和函數;
exit:退出REPL運行環境(ctrl+d);(按兩次ctrl + c 也能夠退出)
help:顯示全部命令提示;
save:把輸入的全部表達式保存到一個文件中;
load:把某文件中保存的全部表達式一次加載到REPL;
四、NodeJS的特色
1. 它是一個Javascript運行環境
2. 依賴於Chrome V8引擎進行代碼解釋
3. 事件驅動
4. 非阻塞I/O
5. 輕量、可伸縮,適於實時數據交互應用
6. 單進程,單線程
五、NodeJS帶來的對系統瓶頸的解決方案
1. 併發鏈接
更改鏈接到服務器的方式,每一個鏈接發射(emit)一個在NodeJS引擎進程中運行的事件(Event),放進事件隊列當中,而不是爲每一個鏈接生成一個新的OS線程(併爲其分配一些配套內存)
(1)系統線程模型:
(2)多線程、線程池模型:
(3)異步、事件驅動模型
2. I/O阻塞
NodeJS遇到I/O事件會建立一個線程去執行,而後主線程會繼續往下執行的,所以,拿profile的動做觸發一個I/O事件,立刻就會執行拿timeline的動做,兩個動做並行執行,假如各須要1S,那麼總的時間也就是1S。
它們的I/O操做執行完成後,發射一個事件,profile和timeline,事件代理接收後繼續往下執行後面的邏輯,這就是NodeJS非阻塞I/O的特色。
(1)串行獲取數據
(2)NodeJS非阻塞I/O,發射/監聽事件來控制執行過程
六、NodeJS的優缺點
優勢:
1. 高併發(最重要的優勢)
2. 適合I/O密集型應用
缺點:
1. 不適合CPU密集型應用;CPU密集型應用給Node帶來的挑戰主要是:因爲JavaScript單線程的緣由,若是有長時間運行的計算(好比大循環),將會致使CPU時間片不能釋放,使得後續I/O沒法發起;
2. 只支持單核CPU,不能充分利用CPU
3. 可靠性低,一旦代碼某個環節崩潰,整個系統都崩潰
4. 開源組件庫質量良莠不齊,更新快,向下不兼容
5. Debug不方便,錯誤沒有stack trace
七、適合NodeJS的場景
NodeJS適合運用在高併發、I/O密集、少許業務邏輯的場景。
1. RESTful API
這是NodeJS最理想的應用場景,能夠處理數萬條鏈接,自己沒有太多的邏輯,只須要請求API,組織數據進行返回便可。它本質上只是從某個數據庫中查找一些值並將它們組成一個響應。因爲響應是少許文本,
入站請求也是少許的文本,所以流量不高,一臺機器甚至也能夠處理最繁忙的公司的API需求。
2. 統一Web應用的UI層
目前MVC的架構,在某種意義上來講,Web開發有兩個UI層,一個是在瀏覽器裏面咱們最終看到的,另外一個在server端,負責生成和拼接頁面。不討論這種架構是好是壞,可是有另一種實踐,面向服務的架構,
更好的作先後端的依賴分離。若是全部的關鍵業務邏輯都封裝成REST調用,就意味着在上層只須要考慮如何用這些REST接口構建具體的應用。那些後端程序員們根本不操心具體數據是如何從一個頁面傳遞到另外一個頁面的,
他們也不用管用戶數據更新是經過Ajax異步獲取的仍是經過刷新頁面。
3. 大量Ajax請求的應用
例如個性化應用,每一個用戶看到的頁面都不同,緩存失效,須要在頁面加載的時候發起Ajax請求,NodeJS能響應大量的併發請求。