初識Node.js之Node與java做爲後臺服務器的對比

文章原創於公衆號:程序猿周先森。本平臺不定時更新,喜歡個人文章,歡迎關注個人微信公衆號。
file

想一想很久沒有更新文章了,最近去了新公司,又拾起了被我拋下許久的後端了,不過由於公司的需求,後端採用node.js,最近一直在學習Node.js,隨着逐漸深刻的瞭解,發現真的node能愈來愈變得熱門是有其存在的道理的。可能有人會說,java做爲後端語言一直隱隱有龍頭老大的姿式,爲什麼咱們還要去學node呢?Node.js到底是什麼?它是新的語言仍是新的框架,是新的工具抑或只是一個簡單的JavaScript文件?前端

運行時環境java

咱們衆所周知Java具備一個稱做JRE的運行時環境來使得java程序可以順利運行。JRE有一個稱爲JVM的虛擬機。JVM有許多組件,如垃圾回收器(GC),即時(JIT)編譯器,解釋器,類裝載器,線程管理器,異常處理器,用於在不一樣時間執行不一樣的任務。JRE還有一系列的庫來幫助運行時的Java程序。

咱們爲何要忽然牽扯到JRE運行時環境呢,其實正是爲了與node做比較,Node不是一種語言,也不是框架,更不是工具,它是運行JavaScript應用程序的運行時環境。Node.js有一個稱爲JavaScript Virtual Machine的虛擬機。它爲基於JavaScript的應用程序生成機器代碼,以便在不一樣的平臺上啓用它。這個虛擬機就是Google的V8引擎,也有主要組件,如JIT和GC,分別用於執行任務,運行時編譯,和內存管理。node

發展潛力c++

判斷Java和node的發展潛力可能要從其背後的生態社區和支持庫上切入,然而以Java爲核心的傳統體系天然比不上node這樣的新勢力,簡而言之,Java成熟而龐大,node迅捷而活躍。java其功能性和實用性天然沒必要多說,可是java包含了大量的樣品代碼,擾亂了程序猿所想表達的意圖,就不如java三大框架之一的spring,程序猿在使用spring的時候servlet,數據持久,以及構成系統的底層的東西,spring框架已經封裝好會幫助你處理這一切,咱們只須要專一於寫業務層代碼就足以。可是在Spring中,子系統一個接一個,哪怕你犯最微小的錯誤,它都會用讓你崩潰的異常來懲罰你。可能緊接着你就會看到巨大的異常信息。裏面包含着一個一個你根本不知道的封裝好的方法,Spring作了許多工做來實現代碼的功能。這種級別的抽象顯然須要大量的邏輯,長長的異常信息不必定是壞事,它指出了一個症狀:這須要多少內存和性能上的額外開銷?spring是怎麼執行的?框架須要解析方法名、猜想程序員的意圖、構建相似於抽象語法樹的東西、生成SQL等等。這些事情的額外開銷有多大?因此說使用java掩蓋複雜性並不會所以簡單化,只會讓系統更復雜。java嚴格的類型檢查使得Java幫你避免許多類型的bug,由於很差的代碼沒法經過編譯。Java的強類型的缺點就是太多樣板代碼。程序員要不斷進行類型轉換,程序員要花掉更多時間寫精確的代碼,使用更多的樣板代碼,以圖早期發現錯誤並改正。

而Node.js偏偏相反。線程會致使更復雜化的系統。因此Node.js採用輕量級,單線程的系統,利用了js的匿名函數進行異步回調,你只須要簡單的使用匿名函數,也就是閉包。不須要搜索正確的抽象接口,只須要寫下業務代碼,沒有任何冗餘。這就是使用Node.js的最大好處,不過異步回調天然也出現一個急需解決的問題:回調陷阱。程序員

在Node.js中,咱們不斷嵌套回調函數的同時,很容易就陷入回調函數的陷阱中,每層嵌套都會讓代碼更復雜,使得錯誤處理和結果處理更困難。一個相關的問題就是js語言不會幫助程序員恰當地表達異步執行。其實有些庫會使用Promise來簡化異步操做,可是看起來咱們把問題簡單化了,可是事實上代碼層面更復雜化了,Promise用了許多樣板代碼,掩蓋了程序員的真實意圖。後來Node.js支持ES5與ES6,能夠採用async/await函數重寫回調函數。仍是一樣的異步結構,但使用了正常的循環結構來書寫。錯誤和結果處理的位置也很天然,代碼更易於理解,更容易編寫,並且也能夠很容易地理解程序員的意圖。回調陷阱並非用掩蓋複雜性的方式解決的。相反,語言和範式的改變解決了回調陷阱的問題,同時還解決了過多樣板代碼的問題。有了async函數,代碼就更漂亮了。簡單化的解決方法,將Node.js的缺點轉化爲了優勢。spring

可是JavaScript的類型很鬆散。並且在你書寫代碼的時候不會進行報錯,許多類型不須要定義,一般也不須要用類型轉換。所以代碼更清晰易讀,但存在漏掉編碼錯誤的風險,只有在編譯的時候纔會去檢查你語法以及邏輯是否存在問題,因此在Node.js中,爲了更好的調試BUG,node支持將程序分紅不一樣的模塊,由於有模塊的存在,將錯誤發生的範圍縮小到某個範圍內,使得Node.js模塊更容易測試。npm

包管理segmentfault

java最重要的問題之一就是沒有統一的包管理系統,可能有人會和我說Maven。可是不管是用途、易用性仍是功能上,Maven與Node.js的包管理系統相比簡直是天壤之別。npm 是 Node.js 官方提供的包管理工具,他已經成了 Node.js 包的標準發佈平臺,用於 Node.js 包的發佈、傳播、依賴控制。npm 提供了命令行工具,使你能夠方便地下載、安裝、升級、刪除包,也可讓你做爲開發者發佈並維護包。最好的地方是npm代碼庫不只供Node.js使用,也可讓前端工程師使用。全部的前端JavaScript庫都以npm包的形式存在。許多前端工具如Webpack都是用Node.js編寫的。

性能後端

java使用HotSpot這個超級虛擬機,它採用了多字節編譯策略。它會檢測常常執行的代碼,一段代碼執行次數越多,就會應用越多的優化。所以HotSpot性能相對來講更快。Node底層選擇用c++和v8引擎來實現的,node.js的事件驅動機制,這意味着要面對大規模的http請求,node.js是憑藉事件驅動來完成的,性能部分是不用擔憂的,而且很出色。並且,因爲V8引擎的改進,Node.js的每次發佈都會帶來巨大的性能提高。

雖然Node對高併發應用有着極高的性能,可是Node.js也有着本身的缺點:微信

  • Node不適合CPU密集型應用,由於CPU密集型應用若是有長時間的運算,不如大循環,將會致使CPU時間片不能釋放,使得後續的IO操做所有暫停。
  • 並且Node只支持單核CPU,不能充分利用CPU資源
  • 可靠性低,一旦代碼某個環節崩潰,將會致使整個系統都崩潰,緣由就在於Node是使用單進程。
  • Node的開源組件庫質量良莠不齊,更新快,並且不向下兼容。

其實Node.js做爲後端能實現幾乎全部應用,只是咱們選擇的時候考慮更多的是項目場景是否是適合用NodeJS。

歡迎關注我我的公衆號:程序猿周先森
file

相關文章
相關標籤/搜索