Saving Private ES

思想斗争


上一篇文章提到要拯救年迈的伙伴ES,但是如果只是搭建开发环境的话貌似并没有救活,只是保留了生的希望,要想让他重新焕发青春还得从基础入手——更新技术栈!这话说起来容易,可是仔细想想,更新技术栈都需要做什么呢?运行环境Node.js和Redis更新到最新版本,项目所有的依赖库更新到最新版本,保证更新后的程序正确运行。哎妈,这么多事情,还不能出错,没有两周估计做不完,然后就有点退缩了,脑子里反复盘算着两周做这事值不值?自己做事情往往就是这样,开始先习惯性的考虑一堆不利因素,然后把自己吓到了,再然后就没有然后了 。其实在想要做一件事的时候,先考虑不利因素不是问题,但是仅仅考虑不利因素而不考虑解决办法才是问题,而且有些问题并不像看上去那么困难。

及时跳出思维怪圈之后,开始冷静分析。首先是升级运行环境,好像在之前研究的基础上用Docker很容易。然后是升级依赖库,大概扫了一眼依赖库的更新履历,貌似变化不大。最后是保证程序的正确性,之前研究Node.js单元测试时,用ES做的实验,已经写了完整并且正确的测试代码。恩,第一印象确实不靠谱,差不多可以开始动手了。

先跑起来再说


用敏捷的思维来做这件事,先设定一个比较低的目标——跑起来,尽快验证其可行性,后面的事情顺水推舟逐步完善就可以了。于是选择了我认为最快的方式,在机器(Windows)上安装最新的Node.js 0.12.2,在Boot2Docker中启动最新的Redis 2.8.19容器,修改package.json如下。
before:

  "dependencies" : {
    "express" : "3.1.0",
    "redis" : "0.8.2",
    "underscore" : "1.4.4",
    "log4js" : "0.5.6"
  },
  "engines" : {
    "node" : "0.6.19"
  }

after:

  "dependencies" : {
    "express" : "4.12.0",
    "redis" : "0.12.1",
    "underscore" : "1.8.2",
    "log4js" : "0.6.22"
  },
  "engines" : {
    "node" : "0.12.2"
  },

由于各依赖库的接口变更很小,代码只是稍作了修改。然后抱着先跑跑试试有错再改的心态运行了程序,启动居然没有报错,简单试了几个接口竟然也都运行正常,幸福来得太快,万里长征一个跟头翻过了一大半。

鸟枪换炮


单元测试
2013年3月折腾Node.js单元测试,当时ES的测试依赖如下,另外用jscoverage做覆盖率统计,再写个Makefile把相关命令封装一下,这样算是当时比较主流的做法。

  "devDependencies" : {
    "mocha" : "*",
    "sandboxed-module" : "*",
    "should" : "*",
    "supertest" : "*",
    "sinon" : "*"
  },

但是这种做法还是有一些问题的:首先对require的mock做的不好,当时没有特别合适的第三方库,sandboxed-module也是无奈之选,额外还需要写一些代码对其进行弥补。其次jscoverage不是Node.js的模块,需要单独安装,只能在linux下运行,需要Makefile封装其复杂的命令。于是我又在Github上翻了翻,惊喜的发现了mockeryistanbul可以完美解决之前的问题,而且改动非常小,于是修改依赖如下。

  "devDependencies" : {
    "mocha" : "2.1.0",
    "mockery" : "1.4.0",
    "should" : "3.3.2",
    "supertest" : "0.15.0",
    "sinon" : "1.12.2",
    "istanbul" : "0.3.6"
  },

在命令行下运行

set NODE_ENV=test
node_modules\.bin\istanbul cover node_modules\mocha\bin\_mocha

覆盖率信息生成在coverage目录下,通过coverage\lcov-report\index.html文件可直观查看。注意在Windows下istanbul和mocha联合使用的时候,用node_modules\.bin\_mocha是会报错的,必须用node_modules\mocha\bin\_mocha,路径有少许差异,结果完全不同,因为粗心在这上浪费了些时间。单元测试和覆盖率都有了,但是运行方式很不舒服,要打那么长的命令,肯定有更好的方法。印象里好像npm命令能做点什么似的,于是翻阅了一下官方文档,在package.json中加入如下代码。

  "scripts": {
    "test" : "istanbul cover node_modules/mocha/bin/_mocha"
  }

冗长的命令立刻简化为

npm test

运行部署
ES的运行部署方式一直是个问题,当时一直也没有比较好的方式,代码复制4份,用forever分别启动做进程管理,前端用Nginx做反向代理,请求由Nginx平均分配给四个进程处理。这样做在部署的时候会非常麻烦,4份代码就意味着所有的工作都要做4次,每次项目升级都做得异常痛苦。Node.js有原生的Cluster模块,但是一直不是很成熟,所以一直还是用Nginx凑合着。Node.js v0.12对Cluster的调度算法做了修改,说是不会像以前那样出现非常不均衡的现象,应该可以一试了。PM2早就有所了解,功能上是forever的超集,既能做进程管理又能实现Cluster,监控界面也非常漂亮,关键是不用复制4份代码了,Nginx也可以去掉了,必须试一下,修改package.json如下。

  "scripts": {
    "start" : "pm2 start app.js -i 4",
    "test" : "istanbul cover node_modules/mocha/bin/_mocha"
  }

启动程序只需

npm start

当初还专门为了简化forever操作写了一个shell,封装各种命令,着实费了一番功夫,现在看来还是NPM大法好!

程序运行起来之后想看看监控情况,于是pm2 monit,发现启动的4个进程在PM2的监控界面只显示一个,任务管理器里面也没有多个进程在运行的迹象,看文档也没找到相关的配置,百思不得其解。难道是Windows的问题,用Linux来试试吧,这时候再一次被Docker拯救于危难之中,直接下载Node.js的官方镜像运行就好了。结果在Linux下4个进程显示正常,哎,Windows果然不是亲生的……

蓦然回首


回顾之前的工作,预期的目标全部达成,还改进了运行部署方式,整个过程只用了2天时间,比最开始预计的两周时间快了很多。除了之前充分的单元测试做了很好的铺垫之外,最主要的还是Docker节省了大量环境搭建的时间,虽然本文对Docker只是一带而过,但确实功不可没,赞!想想这次拯救行动的前因后果,用到的东西都是零零散散学习的,但相互之间又有着种种联系,如果不学Docker就不会去研究搭建开发环境,如果不研究搭建开发环境就不会想起拯救ES,如果之前没有用ES来研究单元测就不会这么顺利的完成试验证工作,如果没有一直关注Node.js就不会想到用NPM和PM2来改善程序的运行部署方式,冥冥之中好像必然会导致今天的结果,真是有趣!

这个故事告诉我们,新东西得学啊,没准哪天就用上了,没准用上了就会改变世界,至少这次把工作方式给改变了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容