express_spout——expressjs框架二次开发

虽然node.js作为数据中间件被一些企业应用,但是node.js建立中小型网站想必是大家最想做的事情。

虽然node.js作为数据中间件被一些企业应用,但是node.js建立中小型网站想必是大家最想做的事情。

目前node.js框架最出名的也就是expressjs了,这两天我对expressjs做了一个简单的二次开发,增加了一些功能:

1、加强路由功能

2、加强日志功能

3、增加multi-node多进程,并且根据他提供的API写了进程间通信的模块

4、增加常用系统模块:如:连接池模块、formidable上传系统模块等

5、增加了一些常用的数据库模块,比如mysql,redis,mongodb等

6、加强了jade的缓存功能,提供页面缓存提高性能,可以根据需要对部分页面缓存或不缓存。

先不多说,上性能测试:

测试环境同之前的博客

1
2
3
4
5
6
com	 1000/30	 1000/30	1000/30 	3000/30     3000/30 	3000/30 
type 裸奔 输出html 输出jade 裸奔 输出html 输出jade
rps 3875 2041 1046 3795 1889 907
tpq 0.26 0.49 0.93 0.26 0.53 0.98
80%req 172 975 1028 347 2458 4131
fail 0 0 0 0 0 0

说明:

裸奔:直接res.end(‘hello world’);

输出html:输出一篇无样式无脚本的简单的网易新闻,大约4kb(经过jade文件缓存的);

输出jade:不文件缓存,直接输出jade,内容同上,会传递正文内容,标题等信息进行编译(jade自带 memory caching);

3000/30:代表命令./ab -c 3000 -t 30 http://10.1.10.150:8888/

rps:代表每秒处理请求数,并发的主要指标

tpq:每个请求处理的时间,单位毫秒。

fail:代表平均处理失败请求个数

80%req:代表80%的请求在多少毫秒内返回。

jade的效率还是挺高的,在1000并发的时候还能有1000+的rps,大多数情况下我们都不能缓存页面,所以这个数据可以供参考是否压力过大而需要添置服务器。

下面简单介绍下文件分布:

controller:控制器

logs:日志文件夹

modules:自定义模块

node_modules:系统模块,系统插件

view:模版,CSS,JS等前端用的

app.js:启动服务文件

简单介绍下各个功能:

1、加强路由功能

增加重新拼接URL去找控制器功能,如果控制器没找到,会尝试着输出对应url的jade模版,否则输出404。

举个例子:

例如用户输入:http://10.1.10.224:3000/user/face

1、会先去require加载”./routes/user”,执行里面的 face 方法,并将req和res两个参数传递进去,如果是3级菜单,以此类推;

2、如果1失败,则会自动去 view/jade/user/face.jade 去输出页面(这里假设没开启file_cache);

3、如果2失败,则会输出404页面,记录错误日志(404页面在view目录下,404.jade)。

2、加强日志功能

加载了系统模块log4js.js,然后做了简单的封装。

日志的的等级分为:

_logger.trace(‘Entering cheese testing’);

_logger.debug(‘Got cheese.’);

_logger.info(‘Cheese is Gouda.’);

_logger.warn(‘Cheese is quite smelly.’);

_logger.error(‘Cheese is too ripe!’);

_logger.fatal(‘Cheese was breeding ground for listeria.’);

可以根据需要设置日志记录和显示的等级。

比如设置了error等级,则只有error和fatal的日志会被记录到日志文件中去。日志文件也可以配置,每个日志文件的大小和备份数量。

3、增加multi-node多进程

利用multi-node模块多进程启动多个,然后封装了一个comm自定义模块。

利用_comm.send(data [, callback]);回调里面可以做一些事情,比如同步更新一些数据等。

举个例子:

1
2
3
4
_comm.send('add_visit_num', function(d, pid){
_visite_num++
_logger.info('发送数据为:'+d+'当前执行进程为:'+pid+'访问数为:'+_visite_num);
});

这样就发送了一条‘add_visit_num’的信息,并且在其他进程接收到这个信息后,执行了callback,pid是当前接收信息的进程id,格式为:master、child-0、child-1、child-2 ……以此类推。

4、5:增加系统模块

增加了系统模块,具体使用说明系统模块内都有

6、加强了jade的缓存功能

jade的官方说明上有:optional memory caching,类似smarty的内存缓存机制。

不过内存缓存毕竟还是要重新拼接一些变量和对jade的模版的编译,不如直接输出html来的快。

可以在controller/config.js里设置全局的页面缓存开启或关闭还有缓存更新时间

也可以在每次输出的时候带上参数true或者false来进行单独设置。单独设置会覆盖全局设置。

注意:如果要开启页面缓存,可能需要做以下几步:

1、node_modules\jade\bin\jade 权限设置为777

2、view\temp 权限设置为777

3、将 “node安装目录/bin/node” 用 ln 命令连接到 ‘/sbin/‘ 或 ‘/bin/’ 或 ‘/etc/init.d/’ 下,保证可以直接输入 node -h 不报错。

ln 命令用法:软连接

ln –s(-n) 源文件 目标文件

框架代码放在我的gtihub上:https://github.com/DoubleSpout/express_spout

内含详细说明文档,本框架还未经过严格测试,只供学习参考。