關於node.js的web框架的應用及併發性能測試


"Node.js 是服務器端的 JavaScript 運行環境,它具備無阻塞(non-blocking)和事件驅動(event-driven)等的特點,Node.js 採用 V8 引擎,一樣,Node.js 實現了相似 Apache 和 nginx 的web服務,讓你能夠經過它來搭建基於 JavaScript 的 Web App。" php

181222951.png



你們要是用過python的tornado,會發覺node.js和tornado真的有不少地方是相像的。。。 他的route,他的rule,他的模板。。。node

node.js的發展太猛啦~ 看看他包的更新。python

183340388.jpg


不扯淡了,直接實例: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

142942160.jpg


測試結果:sql


142552659.jpg

142630404.jpg

給你們搞的動畫的流程
142646317.gifshell


而後我們來用用node.js的web框架。。。express


express.jsnodejs的一個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模塊


141104976.jpg


一段簡單的使用代碼,你懂的

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);


服務端的日誌打印:

175512689.jpg


咱們用下模板


npm install ejs


運行代碼:

app.set("view engine","ejs");
app.get("/moban",function(req,res){
    res.render("index",{"title":"test"});
});


客戶端顯示

181616603.jpg


咱們在用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');


客戶端的顯示:

182304753.jpg


我們再用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);
  });


233923273.jpg

經過url輸出調用。你們經過spawn能夠在頁面調用linux命令了。


curl http://127.0.0.1:3000/xiaorui


005733358.jpg


咱們在搞一個對於實時系統經常使用的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 是功能模塊

200458486.jpg


已經能夠簡單實現 基於node.js express框架接口的寫法了

咱們開始測試他作接口和自帶模塊的承載能力~

接受get請求

204225668.jpg

處理url

204117974.jpg

源地址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 ;
}


205856298.jpg

看看流量和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


210055887.jpg

這是在另外一個服務器作壓力測試 !!!

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%的請求在多少毫秒內返回。


211116735.jpg


210328893.jpg


我這裏就給你們入個門,你們要是有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的問題。

相關文章
相關標籤/搜索