五個最佳案例帶你解讀 Node.js 的前后之道


Node.js 是什么? 

Node.js 采用 C++語言編寫而成,瀏覽器內核 V8 做為執行引擎; Node 不是 JS 應用、而是一個 Javascript 的運行環境。 Node 保留了前端瀏覽器 js 的接口,沒有改寫語言本身的任何特性,依舊基於作用域和原型鏈。 

Node.js 是一個為實時 Web ( Real-time Web )應用開發而誕生的平台,它從誕生之初就充分考慮了在實時響應、超大規模數據要求下架構的可擴展性。這使得它摒棄了傳統平台依靠多線程來實現高並發的設計思路,而采用了單線程、異步式 I/O 、事件驅動式的程序設計模型。這些特性不僅帶來了巨大的性能提升,還減少了多線程程序設計的復雜性,進而提高了開發效率。 

Node.js 的特點 

1 、一個 Javascript 運行環境 
2 、依賴於 Chrome V8 引擎進行代碼解釋 
3 、事件驅動 
4 、非阻塞 I/O 
5 、輕量、可伸縮,適於實時數據交互應用 
6 、單進程,單線程 

Node.js 能做什么? 

1 、具有復雜邏輯的網站 
2 、基於社交網絡的大規模 Web 應用; 
3 、 Web Socket 服務器(頁游, web IM ); 
4 、 TCP/UDP 套接字應用程序; 
5 、命令行工具; 
6 、交互式終端程序; 
7 、帶有圖形用戶界面的本地應用程序; 
8 、單元測試工具; 
9 、客戶端 JavaScript 編譯器 

Node.js 架構 



事件循環 



NodeJs 執行模型: 單線程 Event Loop 

當應用請求發生時,首先進入 V8 引擎,然后進入到事件隊列,可以理解為他們在不斷地在循環,看是否有任務,產生任務就去執行。上圖是單線程模型。 

NPM 

后端在開發其他語言時,都有一些模塊的概念或者第三方提供了很實用的小模塊。同樣, Node.js 當時出來的時候也有這樣一個倉庫。這個倉庫就是專門用來管理中國開發者的一個貢獻的模塊,而且發展非常的快。同樣,前端有一些腳手件,在服務器這邊運行的有 debug , express , express-session , thrift ,依托這個插件做 thrift 相關的事情, images 其他的一些你想的到的插件,都是可以從它找到。 

架構體系 




上圖是個推部分 WEB 平台的架構體系,個推有一套雲組進資源,通過 Nginx 作為一個分發, Node 可以有多個節點,通過 session 進入。每一個 Node 都有模式,相信大家在部署的時候肯定不可能部署一個節點,部署一個節點,否則這個節點掛了就是掛了。 

Thrift 使用 

1 、定義接口 




2 、編譯,生成對應的包,並上傳到相應的庫中 
3 、在 Node 中使用,如下: 



注意:這里有個坑 

thrift 中有個基本類型叫做 double ( 64 位浮點數)。當定義成這個類型時,數據從 java 過來到 Node 會變成全是 0 。 

解決方案 

定義成 string 類型,之后特事特辦,如必要則在 Node 處再轉成浮點數,或者直接由頁面端處理。 
IP 負載( IP Load Balance ) 

負載均衡 

分攤到多個操作單元上進行執行,例如 Web 服務器、 FTP 服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工作任務。 
原生中其並沒有負載均衡的機制,但我們可以采用動態代理的設計模式,基於 thrift client ,利用 JS 的原型鏈來實現。 
均衡的方式有很多種,我們使用輪詢機制來實現訪問多個 Java 節點。 

session 管理 

Node 本身並無 session 機制,我們可以使用 express-session 包來實現,同時通過 redis 來存儲 session 。 

連接池 

傳統讀取數據庫方式: 



連接池需要做什么? 

1 、連接預熱 (啟動時自動打開 n 個連接以供使用) 
2 、使用 例如 輪轉法 均勻分發 連接請求 
3 、當池中的連接即將耗盡得時候動態產生新的連接 
4 、當池中的連接一段時間沒有被調用的時候,自動釋放連接 
5 、自動丟棄 已經壞掉的 連接 
6 、系統關閉的時自動釋放所有連接 

基於此,我們也可以借助幾個插件包(如 generic-pool ( node-pool )、 node-thrift-pool ,當然,如果你直接 Node 連接的 DB ,基本上那個包里面也會支持連接池)在 Node 使用連接池。 

使用示例 




利用 Node 可以做的事情 

1 、做一些灰色地帶的事情 
利用 Node 可以做一些灰色地帶的事情,因為它擁有前端的優點,可以異步,發起異步請求。給開發者帶來很大的好處。不過,你需要管理好你的類型。如果說類型自己如果沒有管理好就是會出現一些問題。同時它也可以做后端的一些事情。比如說連接池等等。 
2 、模塊更加分明 
3 、可前可后便於分工 
從瀏覽器過來的數據,通過 Node 把這一層數據轉化成 java 需要的一種數據結構,就可以使得分工更加明晰。 
4 、共用表單輸入驗證 
如果你在寫系統的時候,出於安全考慮,無論瀏覽器這邊做了多少驗證,你都要做輸入驗證。傳統模式下是需要 java 同學寫一份,前端同學寫一份。因為 Node 跟 java 都是部署在服務器集群或者一個區域,你可以相信這兩邊之間一個數據。來自瀏覽器的驗證,就可以共用表單輸入驗證,達到節省成本的目的。 

以上內容來自個推 web 服務首席架構師姜季廷在 3 月 12 日 SegmentFault D-Day 北京:后端的演講整理而成。

本文來自https://www.v2ex.com/t/266827


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM