博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于node.js的web框架的应用及并发性能测试
阅读量:6719 次
发布时间:2019-06-25

本文共 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/

你可能感兴趣的文章
ExtJS2.2树的级联选择
查看>>
VMM2012应用指南之1-实验环境概述与准备
查看>>
awk 对满足条件的行求和
查看>>
远程上传图片,文件到另外一台服务器
查看>>
[转载]32位系统与64位系统的区别(整合三篇写的比较好的文章)
查看>>
游戏中水的渲染技术系列一
查看>>
Redhat/CentOS系统KVM虚拟机安装过程详解
查看>>
crc错误导致关闭端口
查看>>
[转载] 应急管理体系及其业务流程研究
查看>>
maven 依赖树查看
查看>>
Markdown基础语法之快速入门
查看>>
linux shell 处理带空格的文字
查看>>
Adempiere 在Ubuntu下的安装方法(三)
查看>>
树莓派开机启动
查看>>
腾讯云搭建多终端《你画我猜》Socket服务器
查看>>
Oracle将 yyyy-mm-dd转yyyy年mm月dd日
查看>>
我的友情链接
查看>>
Cobbler自动装机配置
查看>>
TypeScript基础入门之迭代器和生成器
查看>>
基于 Jenkins 快速搭建持续集成环境(转)
查看>>