"Node.js 是服務器端的 JavaScript 運行環境,它具備無阻塞(non-blocking)和事件驅動(event-driven)等的特點,Node.js 採用 V8 引擎,一樣,Node.js 實現了相似 Apache 和 nginx 的web服務,讓你能夠經過它來搭建基於 JavaScript 的 Web App。" php
你們要是用過python的tornado,會發覺node.js和tornado真的有不少地方是相像的。。。 他的route,他的rule,他的模板。。。node
node.js的發展太猛啦~ 看看他包的更新。python
不扯淡了,直接實例:linux
源地址http://rfyiamcool.blog.51cto.com/1030776/1297043nginx
這段代碼使用了node.js的異步利器 onRequest web
var http = require("http"); function onRequest(request, response) { console.log("Request received."); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started."); ~
測試服務器:redis
測試結果:sql
而後我們來用用node.js的web框架。。。express
express.js是nodejs的一個MVC開發框架,而且支持jade等多種模板。
他的模塊好全~
源地址http://rfyiamcool.blog.51cto.com/1030776/1297043
hello-world@0.0.1 /private/tmp
└─┬ express@3.0.0beta7
├── commander@0.6.1
├─┬ connect@2.3.9
│ ├── bytes@0.1.0
│ ├── cookie@0.0.4
│ ├── crc@0.2.0
│ ├── formidable@1.0.11
│ └── qs@0.4.2
├── cookie@0.0.3
├── debug@0.7.0
├── fresh@0.1.0
├── methods@0.0.1
├── mkdirp@0.3.3
├── range-parser@0.0.4
├─┬ response-send@0.0.1
│ └── crc@0.2.0
└─┬ send@0.0.3
└── mime@1.2.6
安裝express模塊
一段簡單的使用代碼,你懂的
var app=require('express').createServer(); app.get("/",function(req,res){ res.send("hello world"); }); app.get("/xiaorui",function(req,res){ res.send("xiaorui.cc"); }); app.get('/user/:id', function(req, res){ res.send('hello' + req.params.id); console.log('有人來訪問了'); }); app.get(/\/user\/([^\/]+)\/?/, function(req, res){ res.send(req.params); }); app.listen(3000);
服務端的日誌打印:
咱們用下模板
npm install ejs
運行代碼:
app.set("view engine","ejs"); app.get("/moban",function(req,res){ res.render("index",{"title":"test"}); });
客戶端顯示
咱們在用node.js實現一個socket !
var net = require('net'); var server = net.createServer(function (socket) { socket.write('Echo server\r\n'); socket.pipe(socket); }); server.listen(1337, '127.0.0.1');
客戶端的顯示:
我們再用node.js寫個小功能,做爲運維能用到的小功能,經過node.js調用linu命令。
在nodejs的child_process模塊中,有兩個相似的方法spawn和exec,都是經過生成一個子進程,去執行指定的命令,不過他們的用法稍有不一樣,在命令的指定上,exec相對靈活,等於一個shell的命令行,如'ps -ef | grep node'此類的管道操做也能一次性實現。
var cp = require('child_process'); //這裏寫你要執行的命令 var ls = cp.spawn('ls'/*command*/, ['-lh', '/usr']/*args*/, {}/*options, [optional]*/); ls.stdout.on('data', function (data) { console.log('stdout: ' + data); }); ls.stderr.on('data', function (data) { console.log('stderr: ' + data); }); ls.on('exit', function (code) { console.log('child process exited with code ' + code); });
經過url輸出調用。你們經過spawn能夠在頁面調用linux命令了。
curl http://127.0.0.1:3000/xiaorui
咱們在搞一個對於實時系統經常使用的nosql在node.js裏面的運用:
看官方的文檔吧,裏面demo仍是很多的:
裏面的實例仍是很多的!!!
var redis = require("redis"), client = redis.createClient(); client.on("error", function (err) { console.log("Error " + err); }); client.set("a", "xiaorui.cc", redis.print); client.hset("hash key", "hashtest 1", "some value", redis.print); client.hset(["hash key", "hashtest 2", "some other value"], redis.print); client.hkeys("hash key", function (err, replies) { console.log(replies.length + " replies:"); replies.forEach(function (reply, i) { console.log(" " + i + ": " + reply); }); client.quit(); });
過兩天給你們出一個 node.js websocket的實時監控~
兩套方案: redis node.js 和webscoket node.js
源地址http://rfyiamcool.blog.51cto.com/1030776/1297043
在開始聊此次的主題 web 框架
node.js最牛的框架【之一】 express自己就是一個很好的mvc 模型 ~~~
看着樣子,又有點django的樣子了哈~
var express = require('express'); var routes = require('./routes'); var user = require('./routes/user'); var http = require('http'); var path = require('path'); var app = express(); // all environments app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(express.cookieParser('your secret here')); app.use(express.session()); app.use(app.router); app.use(require('stylus').middleware(__dirname + '/public')); app.use(express.static(path.join(__dirname, 'public'))); // development only if ('development' == app.get('env')) { app.use(express.errorHandler()); } app.get('/', routes.index); app.get('/users', user.list); app.all('/jieshou', function(req, res) { console.log(req.body.user); res.send('11'); }); http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); });
文件目錄
public 主要是靜態的文件
route 是route路由表
views 是視圖模板
node_modules 是功能模塊
已經能夠簡單實現 基於node.js express框架接口的寫法了
咱們開始測試他作接口和自帶模塊的承載能力~
接受get請求
處理url
源地址http://rfyiamcool.blog.51cto.com/1030776/1297043
而後我們就結合nginx作負載均衡再來一次~
我這裏的nginx.conf 沒有作優化,直接就上。
upstream nima { server 127.0.0.1:8880 ; server 127.0.0.1:8881 ; server 127.0.0.1:8882 ; server 127.0.0.1:8883 ; }
看看流量和io狀況
這是本機 !!!
[root@102 node]# time ab -n 100000 -c 1000 "http://127.0.0.1:8888/test?name=111&tel=222" >1 Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests real 0m15.212s user 0m2.975s sys 0m6.661s
這是在另外一個服務器作壓力測試 !!!
root@localhost:~# time ab -n 100000 -c 1000 "http://192.168.0.102:8888/test?name=111&tel=222" >1 Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests real 0m15.296s user 0m3.712s sys 0m4.993s
rps:表明每秒處理請求數,併發的主要指標
tpq:每一個請求處理的時間,單位毫秒。
fail:表明平均處理失敗請求個數
50%req:表明50%的請求在多少毫秒內返回。
我這裏就給你們入個門,你們要是有php,python的基礎的話,看官網的文檔,一看就懂的~
要是沒有基礎的話。。。。那就。。。使勁看吧~
總結:
快:這個快有兩方面,第一是V8引擎快,在V8引擎背後操刀的是Lars Bak大神,他創造太高性能SmallTalk引擎和Java Hotspot引擎(如今Java的默認VM),他帶領下的V8引擎讓Javascript速度達到了一個新的階段。第二是異步執行,Node.js功能上是一個基於V8引擎的異步網絡和IO Library,和Python的Twisted很像,不一樣的是Node.js的event loop是很底層的深刻在語言中的,能夠想象成整個文件在執行的時候就在一個很大的event loop裏。
npm:npm能夠說是用起來最順手的package management了,npm做爲Node.js的官方package management,聚集了整個社區最集中的資源。不像Python經歷過easy_install和pip,還有2to3的問題。