架構(gòu)選型之Nodejs與Java
前言:
身邊越來越多的同事談?wù)揘odejs,談其異步IO、事件回調(diào)、前后臺(tái)統(tǒng)一一門語言,創(chuàng)業(yè)的朋友的第一個(gè)創(chuàng)業(yè)項(xiàng)目也選擇了Nodejs,期望能夠使用一種語言節(jié)省成本快速完成需求開發(fā)。與其他項(xiàng)目組的同事聊項(xiàng)目選型Java時(shí)被他們嘲笑了一把,怎么這么不與時(shí)俱進(jìn)怎么還在用Java。而且發(fā)現(xiàn),越來越多的前端同事通過Nodejs輕松上手后端功能開發(fā),作為后端開發(fā)工程師倍感壓力。
借新項(xiàng)目的機(jī)會(huì)系統(tǒng)了解了下Nodejs的知識(shí)體系,本文對(duì)了解到的Nodejs技術(shù)作了總結(jié),同時(shí)將其與Java的相關(guān)技術(shù)進(jìn)行了總結(jié)對(duì)比,為其他考慮兩種語言選型的架構(gòu)師提供選型的決策依據(jù)。為了避免爭(zhēng)議,本文避免對(duì)選型語言的推薦,也不對(duì)未來的發(fā)展趨勢(shì)做出預(yù)測(cè)。
語言背景分析:
簡(jiǎn)單對(duì)兩門語言進(jìn)行“拼爹”對(duì)比,發(fā)現(xiàn)有技術(shù)深度的事情還是博士比較擅長(zhǎng),計(jì)算機(jī)專業(yè)的技術(shù)又未必是計(jì)算機(jī)專業(yè)的人貢獻(xiàn):

語言及SDK分析:
Nodejs選擇javascript語法導(dǎo)致了其靈活、面向過程、單進(jìn)程單線程執(zhí)行的基本特性。然而得意其語言的靈活性,一些面向?qū)ο蟮奶卣饕部梢酝ㄟ^邏輯代碼實(shí)現(xiàn),但受阻于ECMAScript的發(fā)展速度,整體上Nodejs向企業(yè)級(jí)應(yīng)用語法轉(zhuǎn)型還暫時(shí)較慢。Nodejs主打的異步IO事件回調(diào)使其更適合服務(wù)器的編程,其單進(jìn)程單線程的特質(zhì)使得開發(fā)變得簡(jiǎn)單。得意與社區(qū)的活躍語言處于高速發(fā)展、SDK不斷地發(fā)展穩(wěn)定豐富。
相比之下,Java是面向?qū)ο蟮木邆淞嗣嫦驅(qū)ο蟮娜刻卣?,?jīng)歷了20年的發(fā)展沉淀越發(fā)的強(qiáng)大、穩(wěn)健。與Nodejs相比Java是個(gè)在各個(gè)領(lǐng)域作精作深的技術(shù)巨人,然而也正因如此,學(xué)習(xí)Java的成本要比Nodejs高很大一個(gè)臺(tái)階,每一個(gè)小的技術(shù)方面都能找到很厚的一本書來。面對(duì)異步IO事件回調(diào)的新技術(shù)Java也在其新的SDK中提供支持與時(shí)俱進(jìn),相關(guān)Java的開源項(xiàng)目也及時(shí)跟進(jìn)。

三方開源框架選型:
語言選型后面即框架選型,好的框架可以去除很多不必要的重復(fù)工作使項(xiàng)目輕松獲取強(qiáng)大的功能。當(dāng)然三方開源框架的引入也帶來的相應(yīng)的學(xué)習(xí)成本,同樣的,Nodejs框架由于發(fā)展時(shí)間相對(duì)較短學(xué)習(xí)成本相對(duì)較低,開發(fā)人員更容易了解到更多底層的實(shí)現(xiàn)源碼,但相對(duì)的部分框架容易出現(xiàn)穩(wěn)定性兼容性問題,加之NPM開發(fā)人員水平不一而又沒有很好的審核機(jī)制,選擇一些模塊(尤其是C/C++模塊)時(shí)需要慎重。Java三方開源框架大都已被大量企業(yè)大量使用、成熟穩(wěn)定,提供強(qiáng)大能力的同時(shí)作了很好的封裝分層,開發(fā)人員付出較高的學(xué)習(xí)成本后更多的是“傻瓜“式的使用。就WEB開發(fā)體系而言,兩者都可以找到很多可服用引入的開源框架。

產(chǎn)品化分析:
就產(chǎn)品化而言,Nodejs雖然在各個(gè)方面都有建設(shè),但相對(duì)Java還有很多需要繼續(xù)完善發(fā)展的地方,如系統(tǒng)監(jiān)控和性能分析領(lǐng)域還不如Java體系那么完善,受限于單進(jìn)程單線程模式穩(wěn)定性部署方面還不如Java那么靈活,靈活的腳本語言加上Nodejs發(fā)展時(shí)間相對(duì)較短使得系統(tǒng)的安全性還需要經(jīng)受更多的考驗(yàn)。同時(shí),前后端代碼都可以使用到j(luò)s并同時(shí)保存在一個(gè)開發(fā)分支時(shí),單純的依賴目錄去區(qū)分前后端代碼,容易造成前后端代碼的混淆,相對(duì)不夠清晰。但相信爭(zhēng)議和問題都是暫時(shí)的,高速發(fā)展的Nodejs會(huì)逐步完善完美。

執(zhí)行引擎分析:
在瀏覽器方面V8引擎大名鼎鼎贊不絕口,這也是Nodejs選型V8這個(gè)最快的Javascript執(zhí)行引擎的原因。然而另一方面,V8引擎專門針對(duì)瀏覽器的設(shè)計(jì)也嚴(yán)重限制了Nodejs在服務(wù)器領(lǐng)域的大有作為,仿佛帶著手鏈腳鏈在高速奔跑。因V8引擎的創(chuàng)始人和技術(shù)都是來自Java虛擬機(jī),使用了部分Java虛擬機(jī)技術(shù)適配瀏覽器業(yè)務(wù)實(shí)現(xiàn),所有相比之下Java虛擬機(jī)更加的成熟完善,也必然相對(duì)的復(fù)雜沉重。

其他一些對(duì)比:
其他一些簡(jiǎn)單對(duì)比如下:

結(jié)束:
Nodejs的異步IO、事件回調(diào)雖是殺手锏能力,但其他程序開發(fā)語言也都有相應(yīng)的跟進(jìn)支持,但Node成功將前后端統(tǒng)一一門語言開發(fā),這絕對(duì)是無人能及,吸引了大批的開發(fā)者加入。得益但又受限于V8引擎,其發(fā)展還帶著包袱,但Nodejs還年輕還處在高速發(fā)展中,相信隨著IO.js與Node.js合并、越來越多的開發(fā)者進(jìn)行共建,Node會(huì)越來越穩(wěn)定成熟。
相比之下Java是編程領(lǐng)域的巨人,20年的發(fā)展,越發(fā)的成熟穩(wěn)定,形成完善的體系完善的生態(tài),Android的流程再次將這門語言推到了巔峰,架構(gòu)選型永遠(yuǎn)是個(gè)重點(diǎn)選項(xiàng)。





























