Node.js學習筆記1(簡介)

        1.什麼是Node.js?
        Node.js,或者 Node,是一個可讓 JavaScript 運行在服務器端的平臺。它可讓 JavaScript 脫離瀏覽器的束縛運行在通常的服務器環境下,就像運行 Python、 Perl、 PHP、 Ruby  程序同樣。你能夠用 Node.js 輕鬆地進行服務器端應用開發,Python、Perl、PHP、Ruby 能 作的事情 Node.js 幾乎都能作,並且能夠作得更好。 
        Node.js 是一個爲實時Web(Real-time Web)應用開發而誕生的平臺,它從誕生之初就充分 考慮了在實時響應、超大規模數據要求下架構的可擴展性。這使得它摒棄了傳統平臺依靠多線 程來實現高併發的設計思路,而採用了單線程、異步式I/O、事件驅動式的程序設計模型。
        Node.js 是一個讓 JavaScript 運行在服務 端的開發平臺,它讓 JavaScript 成爲腳本語言世界的一等公民。
        Node.js 中所謂的 JavaScript 只是 Core JavaScript,或者說是 ECMAScript 的一個 實現,不包含 DOM、BOM 或者 Client JavaScript。這是由於 Node.js 不運行在瀏覽器中,所 以不須要使用瀏覽器中的許多特性。 
        Node.js 的 JavaScript 引擎是 V8,它的 JIT(Just-in-time Compilation,即時編譯) 執行速度已經快到了接近本地代碼的執行速度。Node.js 不運行在瀏覽器中,因此也就不存 在 JavaScript 的瀏覽器兼容性問題,你能夠放心地使用 JavaScript 語言的全部特性。 
        2.Node.js能作什麼?
  • 具備複雜邏輯的網站;  
  • 基於社交網絡的大規模 Web 應用;  
  • Web Socket 服務器;  
  • TCP/UDP 套接字應用程序;  
  • 命令行工具;  
  • 交互式終端程序;  
  • 帶有圖形用戶界面的本地應用程序;  
  • 單元測試工具;  
  • 客戶端 JavaScript 編譯器。
        Node.js 內建了 HTTP 服務器支持,也就是說你能夠垂手可得地實現一個網站和服務器 的組合。而當你使用 Node.js 時,不用額外搭建一個 HTTP 服務器,由於 Node.js 自己 就內建了一個。這個服務器不只能夠用來調試代碼,並且它自己就能夠部署到產品環境,它 的性能足以知足要求。
        Node.js 還能夠部署到非網絡應用的環境下,好比一個命令行工具。
        3.異步式 I/O 與事件驅動 
        Node.js 最大的特色就是採用異步式 I/O 與事件驅動的架構設計。對於高併發的解決方 案,傳統的架構是多線程模型,也就是爲每一個業務邏輯提供一個系統線程,經過系統線程切 換來彌補同步式 I/O 調用時的時間開銷。Node.js 使用的是單線程模型,對於全部 I/O 都採用 異步式的請求方式,避免了頻繁的上下文切換。Node.js 在執行的過程當中會維護一個事件隊 列,程序在執行時進入事件循環等待下一個事件到來,每一個異步式 I/O 請求完成後會被推送 到事件隊列,等待程序進程進行處理。 
        例如,對於簡單而常見的數據庫查詢操做,按照傳統方式實現的代碼以下: 
        res = db.query('SELECT * from some_table');
        res.output(); 
        以上代碼在執行到第一行的時候,線程會阻塞,等待數據庫返回查詢結果,而後再繼續 處理。然而,因爲數據庫查詢可能涉及磁盤讀寫和網絡通訊,其延時可能至關大(長達幾個 到幾百毫秒,相比CPU的時鐘差了好幾個數量級),線程會在這裏阻塞等待結果返回。對於高併發的訪問,一方面線程長期阻塞等待,另外一方面爲了應付新請求而不斷增長線程,所以 會浪費大量系統資源,同時線程的增多也會佔用大量的 CPU 時間來處理內存上下文切換, 並且還容易遭受低速鏈接攻擊。  看看Node.js是如何解決這個問題的:  
        db.query('SELECT * from some_table', function(res) {
                  res.output();
        });
        這段代碼中  db.query 的第二個參數是一個函數,咱們稱爲回調函數。進程在執行到 db.query 的時候,不會等待結果返回,而是直接繼續執行後面的語句,直到進入事件循環。 當數據庫查詢結果返回時,會將事件發送到事件隊列,等到線程進入事件循環之後,纔會調 用以前的回調函數繼續執行後面的邏輯。
        Node.js 的異步機制是基於事件的,全部的磁盤 I/O、網絡通訊、數據庫查詢都以非阻塞的方式請求,返回的結果由事件循環來處理。圖1-1 描述了這個機制。Node.js 進程在同一時 刻只會處理一個事件,完成後當即進入事件循環檢查並處理後面的事件。這樣作的好處是, CPU 和內存在同一時間集中處理一件事,同時儘量讓耗時的 I/O 操做並行執行。對於低速 鏈接攻擊,Node.js 只是在事件隊列中增長請求,等待操做系統的迴應,於是不會有任何多 線程開銷,很大程度上能夠提升 Web 應用的健壯性,防止惡意攻擊。 
        
相關文章
相關標籤/搜索