首页 存档 技术 查看内容

一名全栈工程师Node.js之路

2018-3-30 13:00 |来自: 互联网 449 0

摘要: 编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由桑世龙在高可用架构群分享。转载请注明来自高可用架构公众号「 ArchNotes 」。 桑世龙,天津空弦科技 CTO,开源项目 Moajs 作者,Node.js 技术 ...

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由桑世龙在高可用架构群分享。转载请注明来自高可用架构公众号「 ArchNotes 」。


桑世龙,天津空弦科技 CTO,开源项目 Moajs 作者,Node.js 技术传道者。曾就职在新浪、网秦,曾做过前端、后端、数据分析、移动端负责人、做过首席架构师、技术总监,全栈技术实践者。目前主要关注技术架构和团队梯队建设方向。


“JavaScript 是世界上使用最广泛的语言,没有之一,包括后端开发工程师也更爱使用 JavaScript。” stackoverflow


Node.js 全球现状


虽然 Node.js 在国内没有盛行,但据 StackOverflow 2016 年开发者调查,其中 Node.js 、全栈、JavaScript 相关的技术在多个领域(包括全栈、后端)都有排名领先。



http://stackoverflow.com/research/developer-survey-2016)

后端分布


http://stackoverflow.com/research/developer-survey-2016)


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


  • event-driven

  • non-blocking I/O

以前总强调的异步特性,到今天异步已经不是明显优势。因此除了性能,其他都是病(不足)?


1、Callback hell 问题


目前已经很好的解决了。promise / generator / async 后面会讲。


2、包管理


npm 已经是开源世界里最大的包管理器了,模块非常丰富(25.6万 )。

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

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

为什么选择 Node.js?

空弦科技做的是基于云仓储的 SaaS 服务,给中小卖家提供服务,核心系统是进销存、订单池、WMS。

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


  • 人(天津不好招人)。Node.js 招不到,好多都是从 Java 转的,前端也不好找,好多也是从 Java 转的,我们相当于从 0 开始组建团队

  • 开发速度。创业公司 5 分钟要造火箭,大家都懂。所以让开发快速进入状态,提高开发速度,对我们来说至关重要。

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

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


  • 同样不优化,性能比大部分语言好即使优化,也比其他语言简单,比如Java。

  • 有足够多的选择和架构的平衡。

  • 如实在不够,Java 补。

Node.js 给了我们足够的选择工具

  • 可以采用面向过程

  • 可以面向对象

  • 可以函数式


甚至可以用各种编译器 coffee、typescript、babel(es)等。对于从 0 开始的团队来讲,可以先面向过程、然后随着团队的成熟度,一点一点增加难度。

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

  • 测试相关 tdd / bdd 测试覆盖率

  • 规范化 standard、各种 lint、hint

  • 构建相关 gulp、grunt、webpack,大量插件

  • 生成器 yo 等

  • 包管理工具 npm 足够简单易用

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

特定场景的快速


很多人把 MEAN 组合(比如 mean.io)起来,这样做的好处是如果熟悉,开发速度确实会非常快,但是难度太大,很少有人能搞的定。metetor 模糊了服务端和客户端,是同构的典型应用,对于实时场景是非常高效的。这种东西都算特定场景的快速,一般不敢轻易上,调优难度非常大,如果有人能 cover 的住,在初期是非常高效的。


总结需求:可以简单,可以难;可以快、也可以慢;可以开发大型软件

如果以上不满足咋办?这时就需要架构平衡了。

架构平衡

在架构中各自做各自合适的事儿就好,我们很坦然的面对 Node.js 的优点和缺点,做好架构平衡。



1、在语言层面可以做,那语言层面做


  • 已有大量 npm 上的模块 ( 目前在 25.6 万个以上 )

  • 自己造轮子 ( 站在海量包上 简单语法 npm = 快速 )

  • 使用 Node.js 里的 (nan https://github.com/nodejs/nan)自己包装 C/C 轮子

从上面看,绝大部分需求都可以满足了

2、如果语言层面搞不定,那就架构层面做


  • 业务边界、模块拆分、面向服务

  • MQ、RPC、cache

  • 运维、监控、自动化

稍微解释一下,首先,架构与 Node.js 没直接关系。其次,架构师常用的东东有足够的 Node.js 模块支持,比如 MQ,像 Rabbitmq 有比较好的 Node 模块支持,RPC 里 Thrift、Grpc、Tchannel 支持的都不错,我们使用的 senecajs,Redis,ioredis 等软件,后面做 HA 都是一样的。


3、如果架构层面也解决不了……

合适的场景用合适的东西。有很多东西是 Node.js 不擅长,又不在架构范畴里的,咋办?如实在不够,Java 补(严格点,应该叫其他语言补)


  • 比如复杂 excel 生成

  • 比如 apns 推送(Go 做其实也很好,不过除了我,没人能维护)

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

4、Node.js 优劣分析


  • 执行效率,同样不优化,性能比大部分语言好。

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

  • 缺少 Rails 一样的大杀器,scaffold 脚手架,ORM 太弱。


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

团队 Node.js 使用现状

选择 Node.js 我们需要做的包括:固化项目结构;限定 ORM;自定义脚手架。

由于 Node.js 已经提供以下特性,因此你可以在 30 分钟完成一个脚手架。

  • cli 命令模块,编写非常容易

  • 基于 JavaScript的模板引擎(知名的 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

  • consul 做服务发现和配置

  • 上 elk 作为日志分析处理

  • 使用 docker compose 作为本地开发环境

  • 线上 docker

打算进行技术栈更新,包括Nodejs 4.x(预计今年 6 月份;Koa(generator/co);es6/es7 ( babel )。

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


目前的做法是小步快走,一次只上一样新技术;另外形成梯队,即可准备上新东西;善用 npm,实现 3 化:模块化、最小化、服务化

为什么选择 MEAN 架构

MEAN 架构


MEAN 是目前最潮的全栈 JavaScript架构。MEAN 是一个 JavaScript平台的现代 Web 开发框架总称,它是 MongoDB Express AngularJS Node.js 四个框架的第一个字母组合。它与传统 LAMP 一样是一种全套开发工具的简称。

从我的角度看


路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部