Part 1:为什么选用 Node.js ?

已经7岁的 Node.js,你还熟悉么?

以前?现在?

回顾一下2015年 Node.js 的发展历史

http://i5ting.github.io/history-of-node-js/

Q1(1季度)

  • IO.js 1.0.0 发布
  • Joyent 推进建立 Node.js 基金会
    • Joyent, IBM, Microsoft, PayPal, Fidelity, SAP and The Linux Foundation Join Forces to Support Node.js Community With Neutral and Open Governance
  • IO.js 和 Node.js 和解提案

Q2(2季度)

  • npm 支持私有模块
  • Node 项目领导人 TJ Fontaine 逐步解除核心身份并离开 Joyent 公司
    • A changing of the guard in Nodeland.
  • Node.js 和 io.js 在 Node 基金会下合并情况

Q3(3季度)

  • 4.0 版本发布,即新的 1.0 版本

Q4(4季度)

  • Node v4.2.0,首个长期支持版本(LTS)
  • Apigee,RisingStack 和 Yahoo 加入 Node.js 基金会
  • Node Interactive
    • The first annual Node.js conference by the Node.js Foundation

版本帝?

去年

  • 从v0.10.35 开始
  • 2015-01-14发布了v1.0.0版本(io.js)
  • 2.x(io.js)
  • 3.x(io.js)
  • 2015年09月 Node.js 基金会已发布 Node.js V4.0版 与 io.js 合并后的第一个版本
  • 2015年10月 Node.js v4.2.0将是首个lts长期支持版本
  • 年底发布到 4.2.4 && 5.4.0

目前(2016年3月20日)的2个版本

  • v4.4.0 LTS(长期支持版本)
  • v5.9.0 Stable(稳定版本)

schedule.png

整体来说趋于稳定

  • 成立了 Nodejs 基金会,能够让 Nodejs 在未来有更好的开源社区支持
  • 发布了LTS版本,意味着api稳定
  • 快速发版本,很多人吐槽这个,其实换个角度看,这也是社区活跃的一个体现,但如果大家真的看 CHANGELOG,其实都是小改进,而且是边边角角的改进,也就是说Nodejs 的 core(核心)已经非常稳定了,可以大规模使用

以前我们总是喜欢拿异步说事儿

Node.js 与生俱来的2个特性

  • event-driven
  • non-blocking I/O

结果,今天。。。各种【异步】。。。烂大街了

异步已经不是明显优势了

除了性能,其他都是病?

  • 第一、callback hell 问题,目前已经很好的解决了,promise/generator/async 后面会讲
  • 第二、npm 已经是开源世界里最大的包管理器了,模块非常丰富(25.6万+)

官方说

  1. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

以前我们总是喜欢拿异步说事儿,现在我们拿 Node.js 的强大的生态来炫耀

大事儿记

下面介绍点 Node.js 的大事儿记

企业级

Node.js 基金会的创始成员包括 Joyent、IBM、Paypal、微软、Fidelity 和 Linux 基金会

Part 1:为什么选用 Node.js ? - 图2

更多参见
https://nodejs.org/en/foundation/members/

对于企业级开发,Node.js 是足够的,无论从性能、安全、稳定性等都是非常棒的。

空弦科技做的是基于云仓储的 SaaS 服务,给中小卖家提供服务,核心系统是进销存 + 订单池 + WMS。目前来看不存在任何问题,稍后会讲我们为啥选择 Node.js

es && babel

  • 2015年 Ecma 国际大会宣布正式批准 ECMA-262 第6版,亦即 ECMAScript 2015(曾用名:ECMAScript 6、ES6)的语言规范

http://babeljs.io/

babel 作为 es 编译器,已经大量开始使用了,模块做的非常棒,还有人用 babel 写其他语言编译器

Node.js 里在0.12之后才增加 es6 特性,es7 的目前还不支持。

所以在 Node.js 里使用 es 里比较高级的特性,是需要 babel 去编译处理的。

这是 Node 追逐的事实标准

微软请求 Node.js 支持 ChakraCore

未来 Node.js 不只是基于 chrome v8 引擎,它还可以支持更多其他 js 引擎,对生态、效率提升等非常有好处

蔡伟小兄弟的查克拉 benchmark 的对比

  1. 基本结论是 V8 ES5 >> 查克拉 ES6 > 查克拉 ES5 > V8 ES6

为什么我们选择 Node.js ?

先看一下我们的瓶颈在哪里 ?

  • 1)人(天津不好招人)

Node.js 招不到,好多都是从 java 转的,前端也不好找,好多也是从 java 转的,我们相当于从0开始组建团队

  • 2)开发速度

创业公司,5分钟要造火箭。。。大家都懂

所以让开发快速进入状态,提高开发速度,对我们来说至关重要

  • 3)稳定

在没有专业运维人员的情况下,如何保证系统可用、稳定

于是就引出了我认为的 Node.js 的好处

  • 1)即同样不优化,性能比大部分语言好(天生被黑的优越感,没办法)
  • 2)即使优化,也比其他语言简单,比如 java
  • 3)有足够多的选择和架构的平衡
  • 4)如实在不够,java 补

黑一下 go 语言吧

go 的缺点是很难够(go)着

  • 没有好的包管理,目前生态还不是特别好,选择的可能不多
  • 没有好的调试工具,tdd/bdd 新手难掌握(vscode-go 还凑合)
  • 语法不习惯,强c背景的人不多

总结:适合高端人群,但对团队开发是有门槛的,不适用国内大部分大团队,当然如果你的团队足够牛逼,选go是非常好的选择。

羊和骆驼的故事告诉我们:够得着你牛逼,够不着,累死你也够不着

选择

Node.js 给了我们足够的选择空间

1)可难可易

  • 可以采用面向过程
  • 可以面向对象
  • 可以函数式

甚至可以用各种编译器 coffee、typescript、babel(es)等

对于从0开始的团队来讲,可以先面向过程、然后随着团队的成熟度,一点一点增加难度

2)提供好的基础和包管理工具

  • 测试相关 tdd/bdd/测试覆盖率
  • 规范化 standard、各种 lint、hint
  • 构建相关 gulp、grunt、webpack,大量插件
  • 生成器 yo 等
  • 包管理工具 npm 足够简单易用

以上这些都做大型软件的基础,Node.js 在这方面做得非常好

3)特定场景的快速

很多人把 MEAN 组合(比如 mean.io)起来,这样做的好处是如果熟悉,开发速度确实会非常快,但确定是难度太大,很少有人能搞的定

metetor 模糊了服务端和客户端,是同构的典型应用,对于实时场景是非常高效的。

这种东西都算特定场景的快速,一般不敢轻易上,调优难度非常大,如果有人能 cover 的住,在初期是非常高效的。

4)总结

  • 可以简单,可以难
  • 可以快、也可以慢
  • 可以开发大型软件

还有一个问题就是如果以上不满足咋办?这时就需要架构平衡了

架构平衡

先说技术选型的3个思考点

  • 在语言层面可以做,那语言层面做
  • 如果语言层面搞不定,那就架构层面做
  • 如果架构层面也搞不定,这东西就不能用了

Part 1:为什么选用 Node.js ? - 图3

各自做各自合适的事儿就好,下面分别举例看看

我们很坦然的面对Node.js的优点和缺点

  • 1)语言层面能解决的
    • 已有大量 npm 上的模块(目前在25.6万个以上)
    • 自己造轮子(站在海量包上 + 简单语法 + npm = 快速)
    • 使用 Node.js 里的nan自己包装 c/c++ 轮子

绝大部分需求都可以满足了

  • 2)架构层面能解决的
    • 业务边界、模块拆分、面向服务
    • mq、rpc、cache
    • 运维、监控、自动化

稍微解释一下

  • 首先,架构和是不是 Node.js 写的没关系,是独立的
  • 其次,架构师常用的东东有足够的 Node.js 模块支持,比如mq,像 rabbitmq 有比较好的 node 模块支持,像 rpc 里 thrift、grpc、tchannel 支持的都不错,我们使用的 senecajs,比如 redis,我们使用的 ioredis,后面做 ha 都是一样的。
  • 合适的场景用合适的东西

有很多东西是 Node.js 不擅长,又不在架构范畴里的,咋办?

3)如实在不够,java 补(严格点,应该叫其他语言补)

  • 比如复杂 excel 生成
  • 比如 apns 推送(go 做其实也很好,不过除了我,没人能维护。。。)

但凡是 java 或其他语言里比较成熟的库,可以作为独立服务使用的,都可以做 Node.js 的支持。避免过多的时间用在早轮子上,影响开发进度

效率问题?

执行效率:

  • 同样不优化,性能比大部分语言好

开发效率:

  • Node.js 本身比较简单,开发效率还是比较高的
  • 完善的生态,比如测试、工具、npm 大量模块

缺少 rails 一样的大杀器

  • scaffold 脚手架
  • orm 太弱

Node.js 的 WEB 开发框架 express、koa 等,简单,小巧,精致,缺点是集成度不够,目前已有的 MEAN / yo / sails 等总有某种方面的不满意

所以我们需要做的

  • 固化项目结构
  • 限定 orm
  • 自定义脚手架

偏偏 Node.js 提供了2点,可以让你30分钟写一个脚手架

  • cli 命令模块,编写非常容易
  • 基于js的模板引擎(知名的30+)

我们用Node.js做什么?

  • API 服务
  • 前端(moa-frontend)
  • SDK(OAuth Provider)
  • 辅助开发 cli 工具

目前进度

  • 使用0.10.38,开发 moajs 框架
    • express/mongodb
    • pm2 部署
    • 阿里云的 slb 负载
    • alinode 监控
  • 前后端分离
    • moa-api
    • moa-frontend
    • moa-h5(未能用)
  • 上 redis 缓存
  • 上 rabbitmq
  • 上 senaca 作为 rpc
  • 上 kong 作为 api gateway(todo)
  • 上 consul 做服务发现和配置(todo)
  • 上 elk 作为日志分析处理(todo)
  • 使用 docker compose 作为本地开发环境(todo)
  • 线上 docker(todo)

技术栈更新

  • nodejs 4.x(预计今年6月份)
  • koa(generator/co)
  • es6/es7(babel)

4.x在内存和性能上都有非常大的提升,新的语言特性上,异步流程和语法上都需要学习,故不急于升级,待人才梯队完善

目前的做法是小步快走

  • 一次只上一样新技术
  • 形成梯队,即可准备上新东西
  • 善用 npm,实现3化
    • 模块化
    • 最小化
    • 服务化