Node模塊的使用方法-創(chuàng)新互聯(lián)
這篇文章主要講解了Node模塊的使用方法,內(nèi)容清晰明了,對(duì)此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會(huì)有幫助。
簡(jiǎn)介
V8引擎本身就是用于Chrome瀏覽器的JS解釋部分,但是Ryan Dahl,把V8搬到服務(wù)器,用于做服務(wù)器的軟件。
Node是一個(gè)專注于實(shí)現(xiàn)高性能Web服務(wù)器優(yōu)化的專家,在遇到V8而誕生的項(xiàng)目
- 沒有歷史包袱,沒有同步I/O。不會(huì)出現(xiàn)一個(gè)同步I/O導(dǎo)致事件循環(huán)性能急劇降低的情況。
- V8性能足夠好,遠(yuǎn)遠(yuǎn)比Python,Ruby等其它腳本語(yǔ)言的引擎快。
- JavaScript語(yǔ)言的閉包特性非常方便,比C中的回調(diào)函數(shù)好用。
Node可以讓JavaScript運(yùn)行在服務(wù)器端的平臺(tái)開發(fā),它讓JavaScript的觸角延伸到了服務(wù)器端,可以與PHP,JSP,Python,Ruby等語(yǔ)言實(shí)現(xiàn)后端開發(fā)。
但Node似乎有點(diǎn)不同:
- Node不是一種獨(dú)立的語(yǔ)言,與PHP,JSP,Python,Perl,Ruby的“即使語(yǔ)言,也是平臺(tái)”不同,Node使用的是JavaScript進(jìn)行編程,運(yùn)行在JavaScript引擎上(V8)
- 與PHP,JSP等相比(PHP,JSP,.net都需要運(yùn)行在服務(wù)器程序上,Apache,Naginx,Tomcat,IIS),Node跳過了Apcahe,Naginx,IIS等HTTP服務(wù)器,它自己不用建設(shè)在任何服務(wù)器任何之上。Node的設(shè)計(jì)理念與經(jīng)典架構(gòu)(LAMP = Linux + Apache + MySQL + PHP) 有著很大的不同,可以提供強(qiáng)大的伸縮能力。
- Node沒有Web容器。
- Node是花最小的硬件成本,追求更高的并發(fā),更高的處理性能。
Node特點(diǎn)
所謂特點(diǎn),就是Node如果解決服務(wù)器高性能瓶頸問題。
JavaScript有什么特點(diǎn)的時(shí)候,會(huì)立即想到 單線程
,事件驅(qū)動(dòng)
, 面向?qū)ο?/code>。但是JavaScript精髓 覺得是
this
, 閉包
,作用域鏈
, 函數(shù)
。才使得這門語(yǔ)言魅力無窮。
單線程
在Java,PHP,或者.net 等服務(wù)器端語(yǔ)言中,會(huì)為每一個(gè)用戶端連接創(chuàng)建一個(gè)新的線程。而每個(gè)線程需要耗費(fèi)大約2MB內(nèi)存。理論上,一個(gè)8GB內(nèi)存的服務(wù)器可以同時(shí)連接的大用戶數(shù)4000個(gè)左右。要讓W(xué)eb應(yīng)用程序支持更多的用戶,就需要增加服務(wù)器的數(shù)量,而Web應(yīng)用程序的硬件成本就上升了。
Node不為每個(gè)用戶連接創(chuàng)建一個(gè)新的線程,而僅僅使用一個(gè)線程。當(dāng)有用戶連接了,就觸發(fā)一個(gè)內(nèi)部事件,并通過非阻塞I/O,事件驅(qū)動(dòng)機(jī)制,讓Node程序宏觀上也是并行的。Node中,一個(gè)8GB內(nèi)存的服務(wù)器,可以同時(shí)處理超過4萬(wàn)用戶的連接。
單線程好處:操作系統(tǒng)完全不再有線程創(chuàng)建,銷毀的時(shí)間開銷。
單線程壞處:就是一個(gè)用戶造成了線程的奔潰,整個(gè)服務(wù)都奔潰了,其它人的服務(wù)也就奔潰了。
單線程也能夠造成宏觀上的“并發(fā)”。
非阻塞I/O
非阻塞I/O non-blocking I/O
例子:訪問數(shù)據(jù)庫(kù)取得數(shù)據(jù)的時(shí)候,需要一段時(shí)間。
在傳統(tǒng)的單線程處理機(jī)制中,在執(zhí)行了訪問數(shù)據(jù)庫(kù)代碼之后,整個(gè)線程都將暫停下來,等待數(shù)據(jù)庫(kù)返回結(jié)果,才能執(zhí)行后面的代碼。也就是說I/O阻塞了代碼的執(zhí)行,極大降低了程序執(zhí)行的效率。
Node采用了非阻塞型I/O機(jī)制,因此在執(zhí)行了訪問數(shù)據(jù)庫(kù)的代碼之后,將立即轉(zhuǎn)而執(zhí)行后面的代碼,把數(shù)據(jù)庫(kù)返回的結(jié)果的處理代碼放在回調(diào)函數(shù)中,從而提高了程序的執(zhí)行效率。
當(dāng)某個(gè)I/O執(zhí)行完畢時(shí),將以時(shí)間的形式通知執(zhí)行I/O操作的線程,線程執(zhí)行了這個(gè)事件的回調(diào)函數(shù)。為了處理異步I/O,線程必須有事件循環(huán),不斷的檢查是否有未處理的時(shí)間。依次予以處理。
阻塞模式下,一個(gè)線程只能處理一項(xiàng)任務(wù),要想提高吞吐量必須通過多線程。而非阻塞模式下,一個(gè)線程永遠(yuǎn)在執(zhí)行計(jì)算操作,這個(gè)線程的CPU核心利用率永遠(yuǎn)是100%。 有一種類似 : 與其多人工作,但是好多人閑著,倒不如一個(gè)人工作,往死里干活。
事件驅(qū)動(dòng)
事件驅(qū)動(dòng) event-driven
在Node中,客戶端請(qǐng)求建立連接,提交數(shù)據(jù)等行為,會(huì)觸發(fā)相應(yīng)的時(shí)間。在Node中,在一個(gè)ie時(shí)時(shí)刻,只能執(zhí)行一個(gè)事件回調(diào)函數(shù),但是在執(zhí)行一個(gè)事件回調(diào)函數(shù)的中途,可以轉(zhuǎn)而處理其它事件(比如:有新用戶連接),然后返回繼續(xù)執(zhí)行原事件的回調(diào)函數(shù)。這種處理機(jī)制,稱為:"事件環(huán)"機(jī)制。
Node底層是C++(V8也是C++) 編寫。底層代碼中,近半數(shù)都用戶事件隊(duì)列,回調(diào)函數(shù)隊(duì)列的構(gòu)建。用事件驅(qū)動(dòng)來完成服務(wù)器的任務(wù)調(diào)度。用一個(gè)線程,擔(dān)負(fù)起了處理非常多的任務(wù)。
單線程,減少內(nèi)存開銷,操作系統(tǒng)的內(nèi)存換頁(yè)。
如某一個(gè)任務(wù),執(zhí)行了,但是被I/O阻塞了,所以這個(gè)縣城就阻塞了。非阻塞I/O,不會(huì)傻等I/O語(yǔ)句結(jié)束,而會(huì)執(zhí)行后面的語(yǔ)句。利用事件驅(qū)動(dòng),不管是新用戶的請(qǐng)求,還是老用戶的I/O完成,都將以事件方式加入事件環(huán)中,等待調(diào)度。
Node所有的I/O都是異步的,回調(diào)函數(shù)嵌套回調(diào)函數(shù)。
Node是單進(jìn)程單線程應(yīng)用程序,但是通過事件和回調(diào)支持并發(fā),所以性能非常高。
Node的每個(gè)API都是異步的,并作為一個(gè)獨(dú)立線程運(yùn)行,使用異步函數(shù)調(diào)用,并處理并發(fā)。
Node基本上所有的事件機(jī)制都是用設(shè)計(jì)模式中的觀察者模式實(shí)現(xiàn)的。
Node單線程類似進(jìn)入一個(gè)while(true)的事件循環(huán),直到?jīng)]有事件觀察者退出,每個(gè)異步事件都生成一個(gè)事件觀察者,如果有事件發(fā)生就調(diào)用該回調(diào)函數(shù)。
模塊
moduel
Node中,以模塊為單位劃分所有功能,并且提供一個(gè)完整的模塊加載機(jī)制,可以將應(yīng)用程序話費(fèi)為各個(gè)不同的部分。
Node中,一個(gè)JavaScript文件中定義的變量,函數(shù),都只在這個(gè)文件內(nèi)部有效果。
俠義的說,每一個(gè)JavaScript文件都是一個(gè)模塊,而多個(gè)JavaScript文件之間可以相互require,共同實(shí)現(xiàn)一個(gè)功能,整體外對(duì),又稱之為廣義上的模塊
好處:
減少重復(fù)代碼量,增加可讀性。
方便進(jìn)行代碼規(guī)劃。
方面使用第三方模塊。
當(dāng)需要從JS文件外部引用到這些變量,函數(shù)時(shí),必須使用exprots對(duì)象,或者module.exprots進(jìn)行暴露。使用者需要使用require(); 函數(shù)引入這個(gè)JS文件。
function People( name,sex,age ){
this.name = name;
this.sex = sex;
this.age = age;
}
People.prototype = {
sayHello: function(){
console.log(this.name+this.sex+this.age);
}
};
// 暴露
module.exports = People;
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文名稱:Node模塊的使用方法-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)URL:http://www.xueling.net.cn/article/djdego.html