專刊內文

當前位置:首頁>專刊分享>內文

瀏覽次數 : 1795



 

EEP.JS邁向新紀元

訊光科技 / Andy Kao 

前言

1995年,訊光跟隨Borland/Delphi走了8個年頭,2004年,跟隨Microsoft/.Net走了12個年頭;這次又有了新的選擇,就是Node.JS,JS(Java Script)這種語言萬萬沒有想到會得到最後的勝利,跌破了多少軟體語言專家的眼鏡,但看來這是個大趨勢,至少未來10年還不一定會改變。

EEP平台3年前從JQuery開始(也是JS的一種),然後到去年推出的Cordova App(將HTML/JS/CSS轉成Hybrid App),2016年將有一個重大的研發計畫,就是將2005至今的.NET A/P Server框架轉移到紅透半邊天的Node.JS平台上,這樣就代表EEP的A/P Server將可真正跨平台(WindowsX、Linux、OSX等等),輕量化並效能更高來做為應用系統的伺服器,同時也取代IIS(網站服務器),讓服務效能與用戶連線數可以大幅提升。


甚麼是Node.JS

Node.js是一個開放原始碼、跨平台的、可用於伺服器端和網路應用的一個執行環境(Runtime environment)。在Node.js執行環境是以JavaScript語言來開發Server端的程式,透過Google的V8引擎來編譯並放在Node.js中高效執行,具有強大的跨平台能力,目前已知可以在WindowsX、Linux、FreeBSD、Mac OSX、NonStop、IBM Unix等不同平台上執行。

Node.js還提供事件驅動的架構和非阻塞I/O API,可以最佳化應用程式的吞吐量和規模,這些技術通常被用在即時的應用系統中,目的是要可以承受更多的服務需求與用戶連線數。Node.js並含有一系列內建核心模組及數千個第三方擴充模組,使得程式可以作為獨立伺服器執行,從而脫離Apache Server或IIS,讓Web Server與中間層的Application Server可以合併帶來更多的效應。



為何要用Node.JS

當然是為了解決效能的問題,尤其是大量的終端用戶湧進網站時,經常會使服務器處於癱瘓的狀態,NodeJS使用了事件驅動或回調(Callback)的特性,來解決大量用戶提出請求時無法回應的問題。另一方面不管是JAVA或.NET的服務器通常基礎核心架構就很大(當然較為嚴謹),光只是單純作為一個網站服務器來說,一個服務請求一個執行緒(Thread)方式耗費了太多的系統資源,包括CPU與記憶體,而NodeJS是一個非常輕量化的系統架構,多個服務請求只一個執行緒在處理,以事件驅動與非阻塞I/O分工委託處理,占用系統資源相對JAVA或.NET平台小非常多。當然還有一個重要因素,就是化繁為簡,利用NodeJS來大量瘦身,讓系統架構變得更為單純,Node.JS可以把N-Tier的Web Server與Application Server做個合併,更容易控制與維護,也可以降低營運成本,對資服業與IT部門來說,算是重要的訴求。


Node.JS的優劣


Node.js流行才短短幾年,因為開放原始碼的關係,發展迅速,光是第三方擴展的模塊已經高達上萬個,而且還在快速增長當中,成熟度當然不及JAVA或.NET,存在著相對的優缺點,整理如下:

Node.JS優點:

1.採用非同步(異步)程序:不像同步程序需要等待回應,非同步的回調(Callback)可有效利用CPU及I/O資源,即使單執行緒,也可以大量處理來自網路的大量委託服務,最適合巨量服務的網站架構。
2.採事件驅動模式:不需要像一般的IIS網站,需要分配一大塊記憶體來執行,Node.js只有在需要的時候(以事件觸發)才會分配記憶體與I/O處理,相對的可以節省更多的系統資源(CPU與記憶體),非常適合來作為網站服務器(Web Server)與中間層的應用服務器(Application Server)。
3.不錯的執行效率:很多人以為JS語言的執行速度遠遠不及正統Server端Java與C#等,其實Node.js使用Google的V8 Javascript引擎,執行效率並沒有差距過大,如果遇到高量的運算處理也可以整合C++或其他語言來處理。
4.高度的跨平台能力:如WindowX、Linux、Mac OSX等常用的OS,官方公布的還包括FreeBSD、NonStop、IBM Unix等等。
5.可以將網頁服務與中間層的服務合併在同一層的服務當中,簡化程序降低冗餘沒用的服務,提升效率。
6.低門檻高學習度:Node.JS採用JS的語言,與最流行的前端JS開發語言與習慣一致,讓開者可以前後端用一種語言開發與維護,對於新手來說,JS的學習門檻極低,很容易上手開發。
7.強大的社群力量:Node.JS有強大且活躍的開放原始碼社群,透過NPM(Node Package Manager)可以找到上萬個第三方的擴展模組(很多都是免費的),讓你可以透過社群來擴充架構與彈性應用。

Node.JS缺點:

1.單程序單執行緒:只支援單一CPU,目前的Server隨便都是4核CPU,為人詬病。其實要看開發者的功力,Node.JS官方早在2012年就推出Cluster模組來解決多執行緒多CPU的問題,當然這個Cluster是要開發者自行去監聽端口事件,並妥善管理多個CPU的處理,也非一般人可以寫的。(EEP.JS會幫你架構好,不用擔心)。
2.採用非同步與調回的程式寫法:很多開發者都會不習慣這個開發方式,寫得很繞,甚至無法適應。需要花點時間去適應與規劃架構,畢竟Node.JS是一個全新的架構與觀念,不能再以傳統程序性程式思維來進行開發,需要花一點時間適應。
3.變數與記憶體管理鬆散:因為較容易開發與控制,容易不小心就寫出記憶體洩露的程式來,用戶大量使用時記憶體容易爆衝。
4.不適合耗用CPU過重、大量且高速運算的應用:如影像運算、複雜度很高的商業邏輯、人工智慧等程序;當然需要可靠且交易頻繁的資料庫存取也被列為缺點,但是,這些具有Transaction的大量交易其實有方法改用程序性的寫法來解決的,也可以使用多程序(Process)的方式來分散處理,提升效能。
5.太新且發展太快:Node.js發展沒幾年,版本變化的很快,開發中小型的網站或商業應用應該可以勝任,但如果要開發大型系統還是必須等待Node.js版本成熟與更多成功案例。



EEP.JS的架構



如上圖,為EEP.JS的架構圖,簡單說明如下:

1.User層,當然是使用Browser或Mobile的App都可以使用EEP.JS的Server架構。
2.User層是透過Node.JS的Express Module來實現Web Server的功能,讓系統變得更簡單與輕量。
3.在Express之後,EEP.JS提供了常用的前端組件,目前可以支援的有JQuery配合Eazyui組件及用在Mobile上的AngularJS和Ionic組件等,如果開發者有自己的JS組件可以透過EEP.JS整合進來。
4.除了前端組件,前端有很多共用的模組,如Login、Menu、Users、Group、使用權限、密碼設定等等功能。
5.整個EEP.JS是架構在Node.JS的Core核心上,中間層包括商業邏輯或存取資料庫等功能,可以透過EEP.JS的InfolightServer這個模組來封裝,這個模組就等於之前EEP的Server端DLL的架構(現在是.JSON與.JS)。
6.存取資料庫的部分,會透過Database這個模組按不同的資料庫來連接,目前已經實作MSSQL與Oracle這兩種資料,不同的資料庫都可以找到第三方NPM的模組來連結存取。
7.除外,為了能接上之前EEP.Net所開發的A/P Server與Workflow的程式,我們還會開發一個WCFModule來銜接之前已經成熟穩定的系統。


結語

當然EEP.Net我們還是會隨著Microsoft的V isual Studio系列持續發展版本,畢竟他是我們發展了10年成熟的框架,EEP.JS要等到2016年底才會正式發表上市,我們還需要1~2年時間花更多的力氣在Node.JS上發展更多的模組與應用。即使Node.JS在商業應用上還不夠普遍,尤其是資料庫交易方面的效益還受到一些質疑,但隨著Node.JS的社群活躍程度,與更多第三方的商業模組被開發出來,加上很多企業為了節省商業授權費用與開發成本,相信會有更多的企業與資服業嘗試以Node.JS來開發商業應用,進而享受便利、免費、輕量化、高量用戶的新一代Web系統。