你尚未登录,仅允许查看本站部分内容。请登录使用邀请码注册
xtx1130

koa2+node v7.8.0 从开发到日志到部署 4个回复 专栏 @ Nodejs

xtx1130 发布于 5 月前

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上,欢迎大神进行批评指正,有什么问题也请尽管提出来,有时间的话我一定进行解答和回复。

  • Sigma

    pm2 start index.js -n $name -o $outlog -e $errlog -- -p $port
    这样呢?

    #1
  • xtx1130

    是的,只能这样。你看我最后那段shell,就是通过你这种方式启动的,感觉pm2更适合和docekr搭伙使用

    #2
  • zhengdai

    pm2可以写个配置文件吧,json格式的

    #3
  • xtx1130

    可以写配置文件,json或者js的都可以,但是prot参数只能传到json或者js文件这一层,没办法传到node这一层

    #4
登录后回复,如无账号,请使用邀请码注册