本文共 5941 字,大约阅读时间需要 19 分钟。
"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的发展太猛啦~ 看看他包的更新。
不扯淡了,直接实例:
源地址
这段代码使用了node.js的异步利器 onRequest
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是的一个MVC开发框架,并且支持jade等多种模板。
他的模块好全~
源地址
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
源地址
在开始聊这次的主题 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 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
源地址
然后咱们就结合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" >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
这是在另一个服务器做压力测试 !!!
root@localhost:~# 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的问题。
转载地址:http://pzcmo.baihongyu.com/