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(稳定版本)
整体来说趋于稳定
- 成立了 Nodejs 基金会,能够让 Nodejs 在未来有更好的开源社区支持
- 发布了LTS版本,意味着api稳定
- 快速发版本,很多人吐槽这个,其实换个角度看,这也是社区活跃的一个体现,但如果大家真的看 CHANGELOG,其实都是小改进,而且是边边角角的改进,也就是说Nodejs 的 core(核心)已经非常稳定了,可以大规模使用
以前我们总是喜欢拿异步说事儿
Node.js 与生俱来的2个特性
- event-driven
- non-blocking I/O
结果,今天。。。各种【异步】。。。烂大街了
异步已经不是明显优势了
除了性能,其他都是病?
- 第一、callback hell 问题,目前已经很好的解决了,promise/generator/async 后面会讲
- 第二、npm 已经是开源世界里最大的包管理器了,模块非常丰富(25.6万+)
官方说
Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
以前我们总是喜欢拿异步说事儿,现在我们拿 Node.js 的强大的生态来炫耀
大事儿记
下面介绍点 Node.js 的大事儿记
企业级
- 2014年 nearform NODE.JS 为什么会成为企业中的首选技术
- 2015年 IBM 收购 StrongLoop,拓展云服务业务
Node.js 基金会的创始成员包括 Joyent、IBM、Paypal、微软、Fidelity 和 Linux 基金会
更多参见
https://nodejs.org/en/foundation/members/
对于企业级开发,Node.js 是足够的,无论从性能、安全、稳定性等都是非常棒的。
空弦科技做的是基于云仓储的 SaaS 服务,给中小卖家提供服务,核心系统是进销存 + 订单池 + WMS。目前来看不存在任何问题,稍后会讲我们为啥选择 Node.js
es && babel
- 2015年 Ecma 国际大会宣布正式批准 ECMA-262 第6版,亦即 ECMAScript 2015(曾用名:ECMAScript 6、ES6)的语言规范
babel 作为 es 编译器,已经大量开始使用了,模块做的非常棒,还有人用 babel 写其他语言编译器
Node.js 里在0.12之后才增加 es6 特性,es7 的目前还不支持。
所以在 Node.js 里使用 es 里比较高级的特性,是需要 babel 去编译处理的。
这是 Node 追逐的事实标准
微软请求 Node.js 支持 ChakraCore
- 2016年01月22日,微软请求 Node.js 支持 ChakraCore
未来 Node.js 不只是基于 chrome v8 引擎,它还可以支持更多其他 js 引擎,对生态、效率提升等非常有好处
蔡伟小兄弟的查克拉 benchmark 的对比
基本结论是 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个思考点
- 在语言层面可以做,那语言层面做
- 如果语言层面搞不定,那就架构层面做
- 如果架构层面也搞不定,这东西就不能用了
各自做各自合适的事儿就好,下面分别举例看看
我们很坦然的面对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化
- 模块化
- 最小化
- 服务化