备战node v7.8 + koa2,从开发到日志到部署过程分享
发布于 6 个月前 作者 xtx1130 1227 次浏览 来自 分享

node新人一枚,之前看到node v7.8 stable 决定本地环境从6.6切到7.8版本。于是乎决定本地尝试一下koa2

项目背景

项目整体要做的工作就是通过koa2实现ajax调用的中间层,合并多个ajax请求并返回给前端。

项目分析

1.目录结构

整体目录结构 入口文件为index.js,主要逻辑都在app中,bin 目录下是脚本文件,config目录主要是log的配置以及test

2.入口分析

index.js 入口文件index主要对koa2的中间件进行注册操作,端口绑定,以及监听操作。中间件方面,我第一个引进的是日志中间件,这样之后所有中间件中的报错都会冒泡到日志的中间件中进行处理(uv_timer中相关错误除外,所以尽量少用settimeout、setinterval以及 setimmediate)。

3.log实现

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中,并没有真正的做接口的分析。现在看来感觉有问题的地方是: v8性能 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上,欢迎大神进行批评指正,有什么问题也请尽管提出来,有时间的话我一定进行解答和回复。

回到顶部