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