关于node.js的web框架的微信h5牌九平台开发及并发性能测试论坛:aqiulian.com,更多node.js的web框架的开发咨询Q:212303635。"Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用 V8 引擎,同样,Node.js 实现了类似 Apache 和 nginx 的web服务,让你可以通过它来搭建基于 JavaScript 的 Web App。"
大家要是用过python的tornado,会发觉node.js和tornado真的有很多地方是相像的。。。 他的route,他的rule,他的模板。。。
node.js的发展太猛啦~ 看看他包的更新。
不扯淡了,直接实例:
源地址http://rfyiamcool.blog.51cto.com/1030776/1297043
这段代码使用了node.js的异步利器 onRequest
|
1
2
3
4
5
6
7
8
9
10
|
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.");~ |
测试服务器:
测试结果:
然后咱们来用用node.js的web框架。。。
express.js是nodejs的一个MVC开发框架,并且支持jade等多种模板。
他的模块好全~
源地址http://rfyiamcool.blog.51cto.com/1030776/1297043
[email protected] /private/tmp
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ └── [email protected]
│ └── [email protected]
安装express模块
一段简单的使用代码,你懂的
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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); |
服务端的日志打印:
我们用下模板
1 |
npm install ejs |
运行代码:
|
1
2
3
4
|
app.set("view engine","ejs");app.get("/moban",function(req,res){ res.render("index",{"title":"test"});}); |
客户端显示
我们在用node.js实现一个socket !
|
1
2
3
4
5
6
|
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'此类的管道操作也能一次性实现。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
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命令了。
1 |
curl http://127.0.0.1:3000/xiaorui |
我们在搞一个对于实时系统常用的nosql在node.js里面的运用:
看官方的文档吧,里面demo还是不少的:
里面的实例还是不少的!!!
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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的样子了哈~
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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 environmentsapp.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 onlyif ('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 没有做优化,直接就上。
|
1
2
3
4
5
6
|
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情况
这是本机 !!!
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[[email protected]102 node]# time ab -n 100000 -c 1000 "http://127.0.0.1:8888/test?name=111&tel=222" >1Completed 10000 requestsCompleted 20000 requestsCompleted 30000 requestsCompleted 40000 requestsCompleted 50000 requestsCompleted 60000 requestsCompleted 70000 requestsCompleted 80000 requestsCompleted 90000 requestsCompleted 100000 requestsFinished 100000 requestsreal 0m15.212suser 0m2.975ssys 0m6.661s |
这是在另一个服务器做压力测试 !!!
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[email protected]:~# time ab -n 100000 -c 1000 "http://192.168.0.102:8888/test?name=111&tel=222" >1 Completed 10000 requestsCompleted 20000 requestsCompleted 30000 requestsCompleted 40000 requestsCompleted 50000 requestsCompleted 60000 requestsCompleted 70000 requestsCompleted 80000 requestsCompleted 90000 requestsCompleted 100000 requestsFinished 100000 requestsreal 0m15.296suser 0m3.712ssys 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的问题。