五個最佳案例帶你解讀 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

轉載于:https://www.cnblogs.com/wangxishan/p/6369996.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284740.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284740.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284740.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ArcGIS風暴】根據海拔范圍分級統計GIMMS 3g NDVI平均值案例教程——以甘肅省為例

在論文寫作時,通常要根據區域進行統計柵格數據。本文以甘肅省dem、NDVI數據為例,講解根據海拔范圍分級統計NDVI平均值、最大值、最小值和面積等。 1. 海拔分類 dem是本案例的最基本數據,打開ArcMap,加載dem數據,如下圖所示: 首先要對dem進行分級,所使用的到的工具是重分…

【轉】知道這20個正則表達式,能讓你少寫1,000行代碼

正則表達式,一個十分古老而又強大的文本處理工具,僅僅用一段非常簡短的表達式語句,便能夠快速實現一個非常復雜的業務邏輯。熟練地掌握正則表達式的話,能夠使你的開發效率得到極大的提升。下面是技匠整理的,在前端開發…

Lintcode165 Merge Two Sorted Lists solution 題解

【題目描述】Merge two sorted (ascending) linked lists and return it as a new sorted list. The new sorted list should be made by splicing together the nodes of the two lists and sorted in ascending order.將兩個排序鏈表合并為一個新的排序鏈表.【題目鏈接】www.…

Dapr中國社區網站(預覽版)發布!

點擊藍字關注我們社區介紹Dapr 是一個可移植的、事件驅動的運行時,它使任何開發人員能夠輕松構建出彈性的、無狀態和有狀態的應用程序,并可運行在云平臺或邊緣計算中。Dapr 中國社區是一個以 Dapr 為中心的中立而開放的技術社區,為 Dapr 用戶…

【ArcGIS風暴】ArcGIS自動生成標識碼(BSM)的兩種方法案例教程

1. 標識碼編制規則 按照每個圖層要素的標識碼應具有唯一代碼的基本要求,根據《GB/T 7027-2002 信息分類和編碼的基本原則與方法》規定的信息分類原則和方法,要素標識碼采用二層 20 位層次碼結構,由村級行政區劃代碼、要素標識碼順序號構成。具體如下: (1)第一層為村級行…

數據分析入門_char01

數據分析入門_char01 轉載于:https://www.cnblogs.com/zsr0401/p/6370697.html

ubuntu kvm 部署安裝 ? 快照

cat /proc/cpuinfo | egrep vmx|svmapt-get install qemu-kvm libvirt-bin virt-managerbridge-utilslsmod | grep kvmvirsh -c qemu:///system list這個是安裝kvm 然后添加虛擬機qemu-img info aa.img 查看虛擬機現在的事什么格式qemu-img convert -f raw -O qcow2 aa.img…

將excel多個工作表(表結構相同)合并后生成csv文件

import csv import openpyxl as xls import pandas as pd import codecswb xls.load_workbook(rE:\xlsxFile.xlsx) # 獲取workbook中所有的表格 sheets wb.get_sheet_names() dataRows [] # 循環遍歷所有sheet for t in range(len(sheets)):sheet wb.get_sheet_by_name(she…

【BIM入門實戰】Revit2018項目模板、族庫圖文安裝教程

【擴展閱讀】:【MIB】Win11平臺上Revit 2018_x64簡體中文版圖文安裝與卸載完整教程 一、Revit 族庫、項目樣板缺失的產生原因 1、斷網或者網絡不穩定環境下安裝Revit。 2、Revit配置安裝界面中取消勾選“Autodesk Revit Content Librabries”。 3、下載了沒有自帶族庫的軟件…

一臺服務部署多個tomcat注意事項

第一步 添加tomcat環境變量 # vim /etc/profile加入下代碼 # TOMCAT ATALINA_BASE/usr/local/tomcat8CATALINA_HOME/usr/local/tomcat8TOMCAT_HOME/usr/local/tomcat8export ATALINA_BASE CATALINA_HOME TOMCAT_HOME 修改應用環境變量,是配置生效# source /etc/pro…

python 使用 sha256 函數對密碼進行加密

在 hashlib 庫中,可以使用 sha256 函數對密碼進行加密。下面是一個示例代碼: import hashlibdef hash_password(password):# 創建一個 sha256 對象sha256_hash hashlib.sha256()# 使用 update() 方法將密碼傳入 sha256 對象sha256_hash.update(passwor…

今天面試一個老程序員,號稱自帶資源,竟然是從所有前公司偷拷的源代碼!...

說到“自帶資源”,你會想到什么?一位程序員的“資源”令人震驚:竟然是從前公司偷的源代碼!一位網友說:今天面試一個老程序員,說自己有5年的開發經驗,離職原因是上家公司倒閉了。上機測試啥都不會…

第17課:RDD案例(join、cogroup等實戰)

本節課通過代碼實戰演示RDD中最重要的兩個算子,join和cogroupjoin算子代碼實戰://通過代碼演示join算子val conf new SparkConf().setAppName("RDDDemo").setMaster("local")val sc new SparkContext(conf)val arr1 Array(Tuple2…

【ArcGIS風暴】根據海拔(坡度)范圍分級統計土地覆蓋的類型和面積(蘭州市GlobeLand30m數據為例)

本文基于DEM和GlobeLand30m土地覆蓋數據,講解根據海拔范圍和坡度范圍分級逐級統計蘭州市土地覆蓋的類型和面積。 一、數據準備 1. DEM數據 海拔和坡度分級都要基于dem來實現。文中采用的DEM數據空間分辨率為30m,由甘肅省30mdem掩膜提取而來,加載如下所示: 2. 土地覆蓋數據…

html5 彈性布局

html5 彈性布局 一、移動開發常用技巧 Viewport基本知識 設置布局Viewport的各種信息1、widthdevice-width; 設置Viewport視口寬度等于設備寬度2、initial-scale1; 網頁默認縮放比為1(網頁在手持設備上,不會進行默認縮放3、minimum-scale1 網…

Excel 宏代碼實現按相同值分組設置背景顏色

AltF11,打開編輯器,按如下代碼編寫代碼: Sub SetGroupBg()Dim i, j, cColors Array("#CEFFCE", "#D7FFEE", "#D9FFFF", "#C4E1FF", "#DDDDFF", "#FFDAC8", "#FFE4CA&quo…

開源WPF控件庫-AdonisUI

原文:https://github.com/benruehl/adonis-ui翻譯:沙漠盡頭的狼(谷歌翻譯加持)用于 WPF 應用程序的輕量級 UI 工具包,提供經典和增強的 Windows 視覺效果:倉庫信息倉庫地址:https://github.com/benruehl/adonis-uiDemo&#xff1a…

Unity3D腳本的生命周期(執行順序)

Unity腳本中有許多固定的函數 例如Start();Update(); 而這些函數都有固定的執行順序 搞清楚這些函數的執行順序 對于我們理清代碼的邏輯就顯得尤為重要 舉個簡單的例子 //腳本A public static int a 1; void Start(){a 2; }//腳本B void Start(){Debug.Log(A.a); } 這時&…

【ArcGIS微課1000例】0023:ArcGIS將地理照片(無人機照片)轉為點(航跡)案例教程

本文演示在ArcGIS中,批量將無人機航測獲取的帶有地理坐標的照片轉為點,形成航線軌跡,并計算出三維坐標,為航測數據內業處理提供一定的基礎支持。 1. 效果展示 無人機正射照片: 地理坐標轉點(航跡): 2. 工具介紹 在ArcGIS中提供了批量將無人機多張照片自帶的地理坐標轉…

微信上傳圖文消息素材40007,invalid media_id hint

上傳圖文消息素材40007,invalid media_id hint,微信40007 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2016年5月16日 08:37:24 星期一 ht…