node新人一枚,之前看到node v7.8 stable 决定本地环境从6.6切到7.8版本。于是乎决定本地尝试一下koa2
项目背景
项目整体要做的工作就是通过koa2实现ajax调用的中间层,合并多个ajax请求并返回给前端。
项目分析
1.目录结构
入口文件为index.js,主要逻辑都在app中,bin 目录下是脚本文件,config目录主要是log的配置以及test
2.入口分析
入口文件index主要对koa2的中间件进行注册操作,端口绑定,以及监听操作。中间件方面,我第一个引进的是日志中间件,这样之后所有中间件中的报错都会冒泡到日志的中间件中进行处理(uv_timer中相关错误除外,所以尽量少用settimeout、setinterval以及 setimmediate)。
3.log实现
log底层用log4js进行实现的,相关的源码请查看git链接,主要就是通过继承eventemitter来实现的,日志的输出格式是从网上扒的,具体哪里的真的忘了-_-|||~在这里需要注意的是,首先直接next,在冒泡返回之后再抓取加工后的ctx 来分析res进行记录
4.请求合并逻辑
$.ajax({
url:'http://127.0.0.1:8086',
type:'post',
data:{
0:{
url:'http://url',
type:'get',
data:'uId=1&pid:2'
},
1:{
url:'http://url',
type:'post',
data:{uid:1}
}
},
success:function(data){
console.log(JSON.parse(data))
}
})
上面是一个前端发起ajax请求到node,要求返回data[0].url和data[1].url合并后接口内容的demo,koa2在接收到这个请求之后,会根据不同的参数通过http.request来实现对后端接口的请求和拼接操作,之后返回给前端用户。这里有一个需要注意的坑就是http.request的promise化,我选择的是用bluebird自己搞而没有采用现成的request包来做的。
5.性能分析
性能分析我用的是v8-profile来做的,还在demo中,并没有真正的做接口的分析。现在看来感觉有问题的地方是: generator这个地方我记得在之前node的issue中是进行过优化,好像是说性能提升15%,但是在v8-profile中展示出来的结论是 async/await 并不能享用v8的内部优化,所以说是不是之前所说的15%性能提升,仅仅是提升,而非v8支持对generator函数进行优化,generator底层的实现也是对handleScope和contextScope进行了保存,使用的时候加入到进行中的Isolate的context中。不知道我这种理解对不对。。。
6.项目部署
pm2坑爹的设计,我使用ecosystem.config.js 无论如何都无法把端口号传进去,不知道是我的问题还是真的没办法传进去,后来就直接强行pm2 start了
num=$1;
for((i=0;i<$num;i++)){
port=$(($i+8031));
name="interface${i}";
pm2 start index.js -n $name -o $outlog -e $errlog -- $port
}
exit 0;
通过 sh start.sh +启动的服务个数 来实现pm2 node多进程启动
7.结语
整体项目放在github上,欢迎大神进行批评指正,有什么问题也请尽管提出来,有时间的话我一定进行解答和回复。