注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

高性能http/https的nodejs路由模块iroute  

2013-06-05 00:58:28|  分类: node |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近打算开工flat.js,于是为flat.js框架编写了一个轻量级的路由模块.
irtoue具体功能可以根据http的请求方法归类路由,根据请求地址和url参数路由到不同的action中去,目前支持,get,post,put、delete、options、head这6种,其他http的method都归于other。
不同于普通的正则匹配,iroute模块采用c++的字符串验证,速度更快,跨平台支持,windows, linux和mac都经过了测试。
适用人群:不想用expressjs框架,只想用一个简单的路由给自己的应用或者站点,或者对性能要求比较高的用户。
安装方法:

npm install iroute

或者直接去github上下载源码然后执行

node-gyp rebuild


1、iroute模块的性能和传统正则匹配对比:
A、注册100个路由,进行匹配1000次

regexp: 11ms
cb1 run times :1000
iroute: 3ms
cb2 run times :1000

B、注册1000个路由,进行匹配10000次

regexp: 1107ms
cb1 run times :10000
iroute: 251ms
cb2 run times :10000

iroute模块在普通2cpu的linux机器上性能差不多是原生的js正则的4倍。

2、iroute模块的api
iroute模块api很简单,只有2个,1个用作注册路由规则,另外一个负责路由匹配。
A、iroute.add(routearray [,not_match_function]);
一个简单的代码示例,很容易就看明白了:

iroute.add([
["get:/test1/",function(req,res){res.end('test1')}],
["get:/test2/test2/test2/test2/",function(req,res){res.end('test2')}],
["get:/test3/test3/test3/test3?key1&key2&key3",function(req,res){res.end('test3')}],
["post:/test4",function(req,res){res.end('test4')}],
["post:/test5/test5/test5/test5",function(req,res){res.end('test5')}],
["post:/test6/test6/test6/test6?key1&key2&key3",function(req,res){res.end('test6')}],
["put:/test7",function(req,res){res.end('test7')}],
["put:/test8/test8/test8/test8",function(req,res){res.end('test8')}],
["put:/test9/test9/test9/test9?key1",function(req,res){res.end('test9')}],
["delete:/test10",function(req,res){res.end('test10')}],
["delete:/test11/test11/test11/test11",function(req,res){res.end('test11')}],
["delete:/test12/test12/test12/test12?key1&key2&key3&key4&key5&key6&key7&key8&key9&key10",function(req,res){res.end('test12')}],
["head:/test6/test6/test6/test6?key1&key2&key3",function(req,res){res.end('')}],
["options:/test6/test6/test6/test6?key1&key2&key3",function(req,res){res.end('test14')}],
["other:/test6/test6/test6/test6?key1&key2&key3",function(req,res){res.end('test15')}],
],function(req,res){
res.statusCode = 404;
res.end('404')
})

not_match_function接受2个参数,req和res,当所有路由匹配不成功会调用这个函数

B、iroute.route(req,res); 
这个方法用来进行路由匹配,放在入口处即可,比如下面这个代码就是一个简单的应用

var http = require('http');
http.createServer(function (req, res) {

var buf_list = [];
var len=0;
req.on("data",function(chunk){
buf_list.push(chunk);
len += chunk.length;
})
req.on("end", function(){
req.body = Buffer.concat(buf_list, len).toString();
if(req.url != '/favicon.ico') {
iroute.route(req,res);
})
}).listen(8124);

欢迎广大node爱好者试用~

最后附上expressjs使用简单代码:
var express = require('express');
var app = express();
var iroute = require("iroute");

var route_array = [
["get:/hello/world",function(req,res){res.end('hello world')}],
]

app.use(iroute.connect(route_array));

app.listen(3000);

这样在浏览器输入/hello/world就可以看到 hello world,输入其他路劲则是404

  评论这张
 
阅读(3139)| 评论(4)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016