天天看點

Node.js 筆記01

一、Node.js 前言

1.node.js 之父

Ryan Dahl(瑞安達爾) ,技術好,顔值高!

Node.js 筆記01
  • 數學系博士, 中途退學, 為了生活, 學習了Ruby On Rails接Web項目, 經過兩年成了Web伺服器專家。第一個階段: 接項目做網站。第二個階段: 幫助客戶解決性能問題。
  • 2009年推出Node.js, 2012年退出Node.js, 轉戰Go語言。

2.Node出現的背景

為了解決Web伺服器的高并發性能問題,Dyan Dahl 嘗試用 ruby,c,lua去解決,但因語言自身原因失敗,即語言曆史包袱太重,船大難掉頭,各種語言的生态根深蒂固,無法輕易改變。關于如何避免IO阻塞:異步I/O,事件驅動

3、V8引擎

一款專門對 JavaScript 進行解釋和執行的流程虛拟機

比如把V8引擎嵌入到浏覽器中,那麼我們寫的JavaScript代碼就會被浏覽器所執行;那麼如果把V8引擎嵌入到NodeJS環境下,那麼我們寫的JavaScript代碼就會被伺服器所執行。

V8引擎嵌入到不同的宿主環境中時,就可以把JavaScript語言應用到不同的多領域中。

V8優勢:

  • 編譯強大、快速執行
  • 性能好,比python,Ruby等腳本語言好
  • 曆史包袱輕,沒有同步I/O
  • 事件驅動機制

瑞安 達爾,修改了V8引擎核心,并使用者伺服器開發,于是産生了 Node.js

二、Node.js 簡介

Node.js 是一個讓 JavaScript 運作在服務端的開發平台,使得 javascript從浏覽器 延伸到了伺服器,一開始叫 web.js,目的就是用來寫高性能的Web伺服器的。後來越來越壯大,改為叫 Node.js,從2009年到現在,不斷改進和更新......

與其他背景語言的差別:

  • Node.js 不是一種獨立的語言,Node.js 用JavaScript進行程式設計,運作環境是包裝後的js 引擎(V8)
  • Node.js不架設在任何伺服器軟體上,java,php 等需要部署到tomcat,apache等
  • 用最小的硬體成本,達到跟高的并發,更優秀的處理性能

Node.js的特點:

1、單線程:

  • 優勢:減少了記憶體開銷(作業系統不會有線程建立、銷毀的開銷)
  • 劣勢:如果一個事情被I/O阻塞,整個線程就被阻塞了

2、非I/O阻塞

當在通路資料庫取得資料的時候,需要一段時間。在傳統的單線程處理機制中,在執行了通路資料庫代碼之後,整個線程都将暫停下來,等待資料庫傳回結果,才能執行後面的代碼。也就是說,I/O阻塞了代碼的執行,極大地降低了程式的執行效率。

Node.js中采用了非阻塞型I/O機制,是以在執行了通路資料庫的代碼之後,将立即轉而執行其後面的代碼,把資料庫傳回結果的處理代碼放在回調函數中,進而提高了程式的執行效率。

當某個I/O執行完畢時,将以事件的形式通知執行I/O操作的線程,線程執行這個事件的回調函數。為了處理異步I/O,線程必須有事件循環,不斷的檢查有沒有未處理的事件,依次予以處理。

阻塞模式下,一個線程隻能處理一項任務,要想提高吞吐量必須通過多線程。而非阻塞模式下,一個線程永遠在執行計算操作,這個線程的CPU核心使用率永遠是100%。

3、事件驅動

比如執行着小紅的業務,執行過程中,小剛的I/O回調完成了,此時怎麼辦??是以要有事件驅動循環

不管是新使用者的請求,還是老使用者的I/O完成,都将以事件方式加入事件環,等待排程,Node.js當中所有的I/O都是異步的, 都是回調函數套回調函數

運作流程:

Node.js 筆記01

  • 在Node中,用戶端請求建立連接配接,送出資料等行為,會觸發相應的事件。
  • 在Node中,在一個時刻,隻能執行一個事件回調函數, 但是在執行一個事件回調函數的中途,可以轉而處理其他事件

    (比如,又有新使用者連接配接了),然後傳回繼續執行原事件的回調函數,這種處理機制,稱為“事件環”機制。

  • 當某一個事件發生的時候,就去執行回調函數。執行完畢之後,再去找到事件循環當中找一個新的事件進行來

Node.js當中所有的I/O都是異步的, 都是回調函數套回調函數

三、Node.js的應用方向

1.特點

  • 善于I/O,不善于計算

因為Node.js最擅長的就是任務排程,如果你的業務有很多的CPU計算,實際上也相當于這個計算阻塞了這個單線程,就不适合Node開發。

當應用程式需要處理大量并發的I/O,而在向用戶端發出響應之前,應用程式内部并不需要進行非常複雜的處理的時候,Node.js非常适合。Node.js也非常适合與web socket配合,開發長連接配接的實時互動應用程式。

  • 異步

2.适用場景

網站開發(如express/koa等)

im即時聊天(socket.io)

api(移動端,pc,h5)

HTTP Proxy(淘寶、Qunar、騰訊、百度都有)

前端建構工具(grunt/gulp/bower/webpack/fis3…)

跨平台打包工具

PC端的electron、nw.js,比如釘釘PC用戶端、微信小程式IDE、微信用戶端,移動的cordova,Phonegap,一站式開發架構ionic framework

寫作業系統(NodeOS)

指令行工具(比如cordova、shell.js)

反向代理(比如anyproxy,node-http-proxy)

編輯器Atom、VSCode等

3.Node.js 不是全能的

Node.js本是就是極客追求性能極緻的産物,缺少了很多伺服器的健壯考量, 是以Node不可能應用在銀行、證券、電信等需要極高可靠性的業務中。

創業型公司(正處于A輪、B輪)非常愛使用Node做核心業務

■ 功夫熊的APP,背景是Node.js在伺服

■ 實作網,整站為Node.js搭建

成熟大企業,基本上都是用Node實作某一方面的功能:

■ 知乎用了一個Node程序,跑起了“站内信”功能

■ 百度的很多表單,是用Node儲存到資料庫的

4.企業中的使用場景

Node.js 筆記01

轉載于:https://www.cnblogs.com/friday69/p/10091962.html