之前一直聽說node.js在處理網站大規模並發上十分有用,所以有一定規模的公司都在使用node。我在工作中只用過jquery,屬於那種邊做功能邊學習的那一種。甚至連原生的js都不太會寫,只是知道語法差不多吧。於是誠惶誠恐的購買了一本《node.js權威指南》,先看再說吧,邊看邊學習語法和一些api,遇到不懂的就直接百度。從這兩天學習的進程來說,對於我這個將近兩年工作經驗的.net程序員來說還不算困難。
本文章將會總結我這兩天的學習心得,並在一些地方,比如語法等地方對比C#,使大家更容易去理解,給想學習node.js的人一點幫助,也可以共同學習。
node.js的優勢
在常規的后台語言搭建的服務器環境里面,客戶端每建立一個鏈接就得去創建一個新線程。一台8G內存服務器可以同時承擔的最大連接數也就4000。所以,當用戶數量上去的時候,一台服務器的資源就捉襟見肘了。重構又麻煩傷神,而且也不會有多大的改進,只能來堆硬件了,造成成本的增加。
node.js則修改了客戶端到服務器的連接方法,解決了高並發的問題。因為它不去為每個客戶端創建一個新的線程,而是為每個客戶端連接觸發一個在node.js內部進行處理的事件(使我想到了寫頁面jquery的時候各種事件)。如果使用node.js,可以同時處理多達幾萬個用戶的客戶端連接,優勢顯而易見。
node.js為何能搭建服務器
node.js使用的語言就是javascript,在我看來這個只是運行在瀏覽器的腳本語言而已,為什么會用它去做一些后台語言的事情?
node.js是一個用於開發各種Web服務器的開發工具。在node.js服務器中,運行的是高性能的V8 Javascript腳本語言,這是一個可以運行在服務器端的Javascript腳本語言。該語言是一種被V8 Javascript引擎所解釋並執行的腳本語言。V8 Javascript引擎是由Google使用C++開發的一種高性能Javascript引擎,這個引擎不限於在瀏覽器中運行。node.js將其用在了服務器中,並且為其添加了許多不同功能的API。最重要的是V8 Javascript引擎使用了一種全新的編譯技術,使其有非常高的執行效率,可以說跟C比較接近了。
node.js實現高性能所采用的機制
1.非阻塞型I/O
眾所周知,Javascript是單線程的,V8 Javascript也是如此,所以不用擔心其爭奪資源而造成死鎖現象。但與客戶端腳本語言不同的是,node.js中為V8 Javascript提供了非阻塞型I/O機制。在傳統的單線程處理機制中,在訪問數據庫的時候,整個線程都處於等待狀態,等待數據返回的結果,才能繼續執行后面的代碼。也就是說I/O操作阻塞了代碼的執行,極大的降低了運行效率。由於node.js采用了非阻塞行型I/O機制,因此在執行了訪問數據庫的代碼之后將立即轉而其后面的代碼,把數據庫返回的結果放在了回調函數中運行。
2.事件環
在node.js中,在一個時刻只能執行一個事件的回調函數,但是在執行一個事件回調函數的中途可以轉而去處理其他事件。包括觸發新的事件、聲明該事件的回調函數等。然后返回繼續執行原事件的回調函數,這種處理機制成為事件環機制。
node.js的使用背景
上面已經有涉及,當應用程序需要處理大量並發的輸入/輸出,而在向客戶端發出響應之前,應用程序內部並不需要進行非常復雜的處理的時候,我們就應該考慮使用node.js來進行該應用的開發,比如聊天服務器和服務類網站或電子商務網站。
node.js安裝
我在這兒就闡述windows下的安裝,安裝就很簡單了,直接上官網https://nodejs.org/下載(家里突然就打不開,就沒截圖了),基數版本是算是beta版本,偶數版本是穩定版本。下載下來就直接雙擊打開,點擊下一步安裝就行了。想看是否安裝成功或者是版本,打開cmd命令行工具,輸入node -v 就可以查看機器下的node.js版本了。如下圖:
node.js的簡單實例程序
我在D盤下建立了一個文件夾nodejs,然后在里面新建兩個js文件,function.js和entrance.js。
function.js代碼如下:
var add=function(a,b){ console.log("a+b=%s",a+b); } exports.add=add;
entrance.js代碼如下:
var object=require('./function'); object.add(3,4);
代碼很容易理解,在node.js中,文件相當於模塊。我的理解是,這一個單獨的文件相當於C#里面一個cs文件,一個cs文件里面可以寫一個類。然后供其他的類去調用。exports.add=add;的意思是將這個方法暴露給外面,然后entrance.js就可以調用function.js暴露的方法了。這個可以理解,相當於C#里面,public聲明的方法,其他沒有給exports對象的方法,相當於私有方法。var object=require('./function');相當於C#里面的引用吧。
node.js運行代碼
打開命令行工具,默認在C盤某個路徑。因為我的代碼放在D盤,所以我得先切換到D盤。輸入d: 切換到D盤。
執行entrance.js
總結