北京3月26日NodeParty分享会总结(Node.js全栈、探针监控、Docker node)

2016-04-07
7 min read

上周参加了北京的NodeParty,收获还是有的。先将学到的总结,并补充一些node.js的内容。


#1. 全栈工程师之路

首先ppt奉上。演讲者为moajs的作者,moajs为其开发的web框架。moajs从原始的express框架中抽象出config、controller、model、middleware等业务、配置相关的东西。并有如下功能:

  • 使用mongoosedao把mongoose的crud、分页等封装成dao(data access object)操作
  • 使用mount-routes自动挂载路由
  • 使用res.api约定api返回数据
  • 前端使用moa-frontend和moa-h5构建前端。

这个框架没有用过,因为目前没有用的痛点,而这里只是简单了解一下演讲者做的工作。分享的主题还是node全栈,分为5个部分。

##1.1 为什么选择Node.js

演讲者的工作主要从事SaaS服务,其更多的是与中小型公司打交道。他们从线上的编程语言趋势分析看到JS的大热。细细分析node的现状,callback hell 通过promise方法来控制代码的编写,而node强大的生态才是其最值得炫耀的地方。

而创业公司在开发过程中最重要的因素有:人员、开发速度、稳定性。演讲者列举了如下几点来分析为什么选择node:

  • node在同样不优化的前提下,性能比大部分语言好。即使优化,也比其他语言简单。(但我觉得这里限定的是node的事务处理的速度,毕竟是一个原生支持异步的语言。)
  • 有足够多的选择和平衡。(但是选择过程又是一个问题,别的语言在没有太多选择的情况下是不是能够提供编写效率呢?)
  • 实在不够,Java补。(这里应该指的是计算性能这类node天生的缺陷吧,演讲者选择Java来补也是因为从Java转过来的比较多。)

当然,node的好处还有JS语言自身的好处,这点在杂乱无章的编写过程中更加明显,可以在面向过程、面向对象、函数式编程中进行斡旋。

在开发大型软件中,我们可能更需要考虑效率外的问题,比如测试、规范化、构建工具、生成器。

或许我们只要遵循:在语言层面(node)可以做,就在语言层面上做。在具体操作层面上,就是npm包、自己造轮子(node自身或者c/c++包装)。如果语言层面搞不定,那就架构层面做。模块查分、缓存、运维方面下功夫。如果架构层面也解决不了,就其他语言来补救。

随后,演讲者介绍了团队目前所做的工作方法。

##1.2 Node.js核心

这一部分主要谈及node.js的核心。node遵从Unix设计哲学中的’Small is beautiful’。放到具体业务,比如web应用开发中,从LAMP or WAMP到MEAN架构。(lamp架构是我来实验室接触的第一个技术栈,虽然所学不深,但是还是引我入了软件开发的门,而mean架构是我师从迪总后第一次独立学习(踩坑))。我们可以看到下图架构中的workflow,不同的功能块只处理一个任务,但在整个架构中能完成客户端到数据库数据库的有效操作。

mean这几年来也更加稳定、成熟,使用mean最大的有点事前后端统一。但是在使用过程中不能孤注一掷,合理使用其他语言来解决node服务器无法解决的问题。node.js的其他特性还有异步流程控制、事件驱动。

演讲者再切回node.js的web开发,web框架何其多,相比老气横秋的express,koa是一种更轻量级的框架,restify更加关注RESTful api,hapi更适合大型项目。更多的框架比较可看文章比较3个框架(express、koa、hapi)

node的一个孪生兄弟npm大火的原因就是大量的模块开发结果,模块又分为普通模块来扩展node的功能,cli来实现命令行工具,脚手架来实现自动生成程序以及使用c/c++外包来进行高效运算。

##1.3 快速开发实践

这个部分演讲者描述了公司在使用node时的几个准则:业务边界优化、静态API、API约定、约定结构、npm化。

业务边界优化的难点在于保证业务系统的边界,一般还是遵循缩小业务范围。而静态API可以看下图。下图中将UI设计与应用开发并行来进行,保证双方开发接口就是通过静态API。

而API又可以遵循新浪微博的详细API或者github RESTful API的方式两种方法来约定。演讲者公司约定的结构主要将中间件和服务这种功能分离出来,而不是统一放在controller中。使用npm工具可以分为:private模块和本地模块或者npm私服,最快速当然还是本地模块开发。

综合上节所说的模块化开发,可以使用项目框架的生成器来快速开发应用。至于前后端分离,也是由于创业公司同类功能经常重复,通过前后端分类来多样化的匹配前后端功能。

##1.4 全栈展望

想要实践全栈,通过node的一系列工具(gulp、npm、mocha)来完成自动化任务、模块管理、测试,此外还有越来愈近的ES6的工具babel。

而在前端开发经历了4个阶段,如下图(目前我也就第三个层级MVC框架比较熟悉)。

而hybird应用的开发,也是需要看具体需求来进行h5开发跨浏览器应用,以及跨平台应用开发。核心概念:Actions、Reducers 和 Store,简单点说就是状态控制,然后再结合打包加壳,变成 app 或可执行文件。iOS、Android 上用 Cordova,PC 上使用 Electron。

##1.5 如何全栈

如何全栈分为从后端和从前端开始。从后端开始就按照4个阶段开始,从前端开始就从Nginx涉入后端逻辑。从移动端也可以说从前端转,只要学会用好h5开发,之后就能慢慢往全栈靠拢。

#2. Node.JS 项目中的性能监控的原理 和 Docker 的使用

ppt奉上。演讲者是oneapmAPM公司的员工。他首先介绍了性能监控的方法:插桩和采样。

##2.1 插桩和采样

最早是由J.C. Huang 教授提出的,它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针(又称为“探测仪”),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。

探针为在被测程序指定位置抛出运行信息的语句。而在什么位置插入探针就需对目标代码进行必要的分析。这里以alert为例

var _original=window.alert;
window.alert=function(){
    console.log('in');
    var result=_original.apply(this,arguments);
    console.log('out');
    return result;
}

在这里例子中我们可以得到3个值:进入、退出和返回值。对于运行分析可能就需要从返回值中来获得。随后,演讲者又以setTimeout为一个例子,这里不再赘述。

演讲者拿出公司大杀器:oneapm模块,通过node命令的-r参数来预载模块。

接下来介绍了前端埋点。比如,在前端通过埋点来监控页面的访问和button点击次数。通过ES7的decorator来对目标函数做一些额外的操作,通过@decorator来执行wrapper封装器,我们就可以在封装器中获得性能指标。(我们首先看个decorator的例子,摘自hackll.com/

//声明一个Dog类
class Dog {
  bark () {
    return 'wang!wang!'
  }
}

然后我们定义一个 readonly 的 decorator,并作用到bark上

function readonly(target, key, descriptor) {
  descriptor.writable = false
  return descriptor
}
//把 readonly 作用到 bark 方法上
class Dog {
  @readonly
  bark () {
    return 'wang!wang!'
  }
}
let dog = new Dog()
dog.bark = 'bark!bark!'
//报错:Cannot assign to read only property 'bark' of [object Object]

回到刚才要求——监控页面的访问和button点击时间。只要创建两个decorator:pageview、event()就可以了。

在性能监控的最后一部分,演讲者分享了采样方法。在前端的通过调用console.profile,node调用v8-profiler来采样。输出火焰图(如下图,绿色为js,蓝色为内置模块、黄色为c++,红色为v8)

还有将v8内存使用堆也可视化为图。(使用heapdump来对内存进行快照)。

##2.2 Docker的应用

首先是兼容性测试,Docker对node.js大部分稳定版本都支持,并且还支持MySQL、MongoDB、Redis。基于Docker的前端自动化工作流,流程可看下图。

(很多细节对于我来说未知)

  • Dockerfile和gruntfile类似,包含创建镜像所需要的全部指令
  • Gitlab是实现自托管的Git项目仓库程序
  • Jenkins是持续集成工具
  • ESLint是JS的QA工具
  • Unit Test是单元测试
  • Build是软件开发过程中用于内部测试的功能和性能等不完善的软件版本
  • Tag 不知道是什么
  • Push是git的推送操作
  • Run 不知道是什么
  • A/B Testing也称为对比测试或分离测试(split-testing)。它是测试网站或在线服务的游戏中的两个变量,最后得出哪个变量更符合要求。

总的来说,这次收获还是很大的。

comments powered by Disqus