我們都知道node.js現在得到了所有的關注。每個人都對學習node.js感興趣,并希望可以工作于node.js。在開始工作之前了解技術背後的概念總是不會錯的。但對初學者來說,可能會因為不同的人使用的不同定義而暈頭轉向。node.js究竟是什麼?它是新的語言還是新的架構,是新的工具抑或隻是一個簡單的javascript檔案?即使對于有經驗的java開發人員來說,也很難快速了解node.js。是以,在本文中,我将嘗試為java開發人員诠釋node.js。
運作時環境
我們知道java需要一個稱為jre的運作時環境來運作java程式。jre有一個稱為java virtual machine(jvm)的虛拟機。jvm有許多元件,如垃圾回收器(gc),即時(jit)編譯器,解釋器,類裝載器,線程管理器,異常處理器,用于在不同時間執行不同的任務。
除了jvm之外,jre還有一系列的庫(例如,rt.jar)來幫助運作時的java程式。我們有單獨的jre用于不同的平台,如windows,macintosh和linux,以及還有jvm。
好吧,就試着記住如何編譯和執行一個java程式。我們有源代碼(.java),它由java編譯器編譯成一個名為bytecode(.class)的中間代碼。此bytecode被提供給jvm以便在給定的目标平台上執行。jvm在執行之前将bytecode轉換為特定于目标平台的機器碼。
java程式的執行可以通過下面的圖檔解釋:
web應用程式架構
典型的java web應用程式架構有四個層:客戶層(client),展示層(presentation),服務/業務層(service/business)和資料層(data)。
客戶層(client layer)可以使用像jquery這樣的庫來支援ajax功能并且具有一些用戶端驗證和dom操作。
展示層(presentation layer)通常是與客戶層互動的一個層。該層通常已經實作了用于請求和響應處理的mvc模式。在這一層可以使用如spring mvc這樣的架構。此外,還有一個模闆引擎,如velocity,可以根據預定義的布局動态地渲染視圖。
服務或業務層(service/business
layer)負責具備業務邏輯并與其他層通信。在ajax請求的情況下,該層直接向客戶層提供資料。此層執行業務邏輯并回應到展示層以更新模型。服務層是與資料層通信以擷取或更新所需資料的一個層。服務層可以具有使用任何架構,例如spring的soap或rest服務實作。
資料層(data layer)通常使用一些orm架構,如hiberate,或任何基于jdbc的庫/模闆(spring jdbc模闆)來與任意rdbms(如oracle)進行通信。
架構部署
java web應用程式架構部署包括apache http伺服器,它充當代理伺服器以及提供靜态内容。動态内容由web容器提供,web容器實際上是處理java檔案的引擎。
下圖說明了java web應用程式的架構部署:
我如何了解node.js?
我們上面讨論jre的原因是為了直接與node.js進行比較。對,你看明白了吧! node.js不是一種語言;不是架構;也不是工具。它是用于運作基于javascript應用程式的運作時環境。
與jre類似,node.js有一個稱為javascript virtual machine(jsvm?)的虛拟機。它為基于javascript的應用程式生成機器代碼,以便在不同的平台上啟用它。
node.js還有一系列庫,它們可能被稱為node api或node
modules,用于幫助在運作時運作javascript應用程式,類似于jre中的java庫。我們對不同的平台,如windows,macintosh和linux,以及jsvm有不同的node.js要求。
javascript virtual machine就是v8,來自google的開源javascript引擎。與java virtual machine一樣,jsvm(v8引擎)也有主要元件,如jit和gc,分别用于執行任務,運作時編譯,和記憶體管理。
現在,讓我們試試了解javascript程式是如何編譯和執行的。源代碼是用javascript(.js)編寫的。在将其提供給jsvm(v8引擎)之前,沒有生成中間代碼。jsvm直接擷取此源代碼并将其編譯為特定于給定目标平台的機器代碼以便執行。
下面的圖檔可以簡明地說明上述解釋:
基于node.js的web應用程式主要遵循java web應用程式架構。主要差別在于用戶端請求處理。用戶端請求将由單個線程處理,但在node.js應用程式的情況下将異步處理。使用java,每個用戶端請求将由單獨的線程同步處理,是以它是多線程的。
有許多架構/庫可用于基于node.js的web應用程式開發。這裡有趣的地方在于,所有的架構/庫都是基于javascript的。
你可以從下面的圖檔中快速了解不同的層和在那些node.js應用程式層中使用的架構/庫。
客戶層使用angular.js,用戶端mvc架構。展示層,以及服務層,可以通過使用express.js,一個基于javascript的web應用程式架構來開發。這也自帶一個用于運作node.js應用程式的獨立伺服器。資料層使用對象資料模組化子產品(例如mongoose.js)來與nosql資料庫(如mongodb)通信。
這個特殊的棧稱為mean,它由mongodb,express.js,angular.js,用戶端mvc架構和node.js(運作時環境)組成。
基于node.js的web應用程式的架構部署遵循java的web應用程式部署架構。它有一個nginx伺服器,它的作用就如同http代理伺服器,并提供靜态内容。動态内容由node.js伺服器提供,該伺服器包含處理javascript檔案的引擎。
下面的圖解釋了基于node.js的web應用程式的架構部署:
就這樣?
請注意,這篇文章的目的隻是為了幫助從java開發人員的角度了解node.js,而不是為了顯擺對java或node.js的支援。此外,除了我們在讨論中涉及到的之外,還有許多不同的架構解決方案、架構和工具。為了便于比較和了解,我采用了最簡單和可行的架構解決方案以及最簡單的架構和庫系列。是以,請務必更進一步地去深入了解。祝大家學習愉快!
作者:小峰
來源:51cto