cntchen.github.io
cntchen.github.io copied to clipboard
Node.js 应用场景预研
背景
公司大前端团队准备上 Node 了,激动人心.所以首先需要预研一下 Node 的应用场景和能力范围,探索 Node 生态跟业务需求结合起来的方式.
Node.js
Node 是基于 V8 JavaScript 引擎的 JavaScript 执行器. Node 采用事件驱动和非阻塞 I/O 模型达到轻量和高效,并拥有庞大的模块包生态 -- npm.
技术特点
- 单线程 JS 执行器
- 事件驱动
- 非阻塞的异步 I/O IO操作: 数据库操作(连接数,机器性能等)、缓存服务、网络IO、文件读写等
应用特点
- 轻量高效
- 强大的生态
- 可伸缩
业界观点
-
Node 在高并发轻 CPU 场景性能比 Java 和 PHP 好.
-
一门编程语言的特性和性能会趋向一致,剩下的就看选择.
-
阿里的很多 Node 服务,并不是不能用 Java 做,而是前端工程师在自己能力范围内把事情做了,而且做得蛮好的. -- Winter 在 TFC 致词,我听到的大意
-
使用 Node 技术栈,小团队可以更快把事情做成.
-
需要一名 Node工程师时,在2年 PHPer 和 2年 FE 间会毫不犹豫选择 PHPer. -- 说明写 Node 服务端, JS 语言不是重点,服务端开发的经验和能力才是
应用场景
基本功能: Web 服务器
Node 作为 Web 服务器,连接后台数据库/文件系统,接受网络请求,处理业务逻辑,提供静态资源和业务接口.
- 适用于 IO 使用率较重,CPU 使用率较轻的场景
- 可以快速开发出可用服务器
前后端分离
概念
在服务器(Java/PHP)与浏览器(JS)的中间架一个 Node 中间层.Node 中间层提供直出,接口转发,静态资源等,属于前端范畴,由前端维护.
特点
- 不止是前后端物理层的分离,而是前后端职能的分离.MVC 模型中,由前端来接管 VC,后端专注于 M,职责更加分明,关注点分离.
- 解决性能问题: 前端可以根据业务场景使用服务端直出和接口聚合等技术,减少客户端白屏时间.
- 将前端公用业务和逻辑后移,减少多端的重复开发.
- 复用前端模板,逻辑,路由.
注意区分
- 许多公司有历史包袱,使用 Java 或 PHP 做了页面直出,所以他们的前后端分离,指的是借助 Node 隔离前后端的边界,分离前后端项目的源码/开发流程/部署方式
- 对于没有直出的公司,后台 Java 接口 + 前端异步调用,已经算前后端分离,但是没有直出能力
- 前后端分离后还要直出,需要 Node
直出
概念
在前后端接口分离(前后端解耦)情况下,在客户端访问页面时,服务器拉取接口数据,并将数据嵌入页面返回,称为直出.如果返回的是数据和模板,在前端渲染,称为数据直出;如果后端根据数据渲染出页面,直接返回页面,称为页面直出.
直出优点
- 直接展示带数据的页面,减少首屏加载时间
- 直出服务器与后台数据服务器传输高效,有效减少客户网络不稳定带来的等待
- 有利于搜索引擎爬取 (SEO)
- 静态页面生成
Node 直出优点
- 完全的前后端分离 这点前文已经有阐述.
- 复杂页面直出 对于复杂的页面,通常需要代码模块化和功能组件化,前端 MVVM 框架适合组件化直出的场景.
- 同构 借助前端 MVVM 框架,前端工程可以实现同构,同时支持服务端渲染和客户端加载.
接口聚合
Node 中间层代理后台接口,后台接口提供原子 RESTful 接口,前端根据需要组合使用.Node 调用内部接口使用 HTTPS/RPC 等. 参考: 接口聚合的简单研究
微服务
关注点在于 Node 的开发和部署方式
- 应用程序分解为更小、完全独立的组件,具有可伸缩性和可用性
- 基于 Docker 等技术自动化 Node 的持续集成和部署
数据持久化
关注 Node 层数据的落地,作为其他 Node 层功能的基础支撑.
业界实践
阿里
- 超大规模超高性能业务开发
- 页面渲染直出,天猫首页等
- 内部运营平台生成活动页面(页面搭建平台), H5 和 RN 两个版本的模板
- Node Web 框架 -- egg.js,阿里后端首选底层框架
- alinode 提供 Node 日志和监控
- 数据
- 2015年双十一,1000+个活动页面配置生成 -- 大规模 Node.js 应用
- 相比PHP, 20倍每秒请求数, 20倍响应时间 -- 大规模 Node.js 应用(续)
腾讯
- qzone 使用 Node 做 http 接入层 -- node.js在qzone的演进
- 立体监控、实时日志、染色、安全、httpdns
- 2015年微云全站 php 退 Node.js 进
- 2015年相册直出域名过亿PV,手Q离线包域名过40亿PV
-
玄武直出框架, Allow Team,未开源
- 进程管理,RPC远程调用 -- 亿万页面直出架构
- 手Q家校群直出效果: 首屏时间 650ms 的优化,提升约 35% 的性能 -- Node直出理论与实践总结
- 手Q群成员分布直出效果: 首屏时间 400ms 的优化,提升约28.6%的性能 -- Node直出让你的网页秒开
百度
- 百度地图瓦片直出 将地图数据渲染成图片,返回客户端 -- node-canvas实现百度地图个性化底图绘制
- Nginx + Node + Server实现前后端分离和 SEO -- 前后端分离实践
美团
- 2015 前端承载的所有业务和线上服务都是基于 Node,生产环境已经有近 60 台服务器 -- 美团酒店Node全栈开发实践
- 亮点:前端独立完成微信 SDK 的接入
- PM2.5 监控 Node
- 美团外卖前端可视化界面组装平台 —— 乐高
其他公司
- 饿了么/知乎/大搜车等都在用
国外
What companies are using Node.js in production node.js能开发大型网站吗 -- 国外使用情况
我司的实践点
现有条件
-
我司没有历史包袱 我们没有直出服务,没有 Node 服务,所以在提升性能,提升用户体验,降低开发成本上,基本可以无痛选择 Node 技术栈.
-
我司没有积累
- Node 服务器开发和运维并不简单,无线团队和运维团队并没有较好的技术积累.
- 我司的业务场景需要考虑更多安全问题.
- Node 服务层提供接口中转时,对后台接口的配置有一些要求.
为什么是 Node
- 提升用户体验和服务器能力 -- 公司对外业务的需要
- 人人都会配置前端页面 -- 公司运营/开发提升效率的需要
- 这个事情后端没人管,前端来管;这个事情前端应该管,不需要动用后端 -- 团队间协作的需要
- 提升前端开发效率,减少重复性劳动 -- 无线开发团队内部的需要
可实践工程
Node 服务层的能力是非常强大的,结合我司业务,可以实践的工程还是很多的.以下为头脑风暴结果,具体开展需要做可行性分析,需求评审,架构规划,功能划分,开发计划等等工作.
页面配置平台
- 活动链接配置 如: 对一个活动页面,生成一个 url 入口,外部服务统一调用该入口.配置平台设置映射规则:起止时间,省市区域,渠道等.活动的上下线和切换不需要开发改动发版本.
- 活动页面生成 简单可组合的页面搭建平台,生成活动页面.
- 静态页面配置 如:我们的帮助中心,每次文本改动需要前端开发,使用静态页面配置平台,可以有产品人员进行文本修改,然后由直接生成.
接口中间层
客户端对接口的访问,先经过 Node 接口中间层,由中间层代理接口服务.
- 接口聚合 如: 对于用户状态获取/商城等展示前需要请求多个接口的页面,可以使用接口聚合.后端只需要提供原子接口,而聚合由前端根据业务场景开发.
- 大文件上传 如: 用户申请验证,目前的趋势是使用拍照或活体,可能会上传视频,在不好的网络条件下,需要分片和断点续传,在 Node 层可以制定接口获取大文件,再内网提交给后端.甚至可以考虑使用 Web Socket.
服务端直出
微信商城和 App 的手机专区已经使用了服务端直出,可以保持关注和迭代.
其他场景
- 图片服务,在不同的客户端环境中返回不同大小/格式的图片
- 合同服务,在合同模板嵌入用户信息,渲染成图片返回前端
技术选型
服务端部署
- 部署和运维
- 云主机
- 如何负载均衡和伸缩
- nginx
- cdn
- Node 版本 Node v6.11.1 LTS / alinode(收费)
- JavaScript ES6
- 服务器框架 egg.js
- 数据落地 mongoDB / mySQL / redis
- 模板引擎 Jade 等,这里不是前端框架
开发注意点
- 技术架构:各个服务的边界和交互方式
- 理解异步
- 多进程 cluster
- 异常处理和重启
- 数据库操作
- 调试
- 性能/GC/内存
- 服务器开发的各技术点
- 渐进式开发部署,灰度
Node 入门
- Node 开发基于 JavaScript,所以需要了解 JS 语法.
- 犀牛书
- Node 进阶 + 后台基础
- Node Guides 官方进阶文档,介绍 Node 的核心概念
- 饿了么大前端 Node.js 进阶教程
- 发布和管理 大搜车 Nodejs 线上服务稳定性保障体系
- 社区
- 中文社区 cnode
References
-
创业团队撸 Node (科普贴,非常有意思)
-
PayPal 的 Node.js 实践 (Java 和 Node 并行,渐进)
-
Node.js 在广发证券(介绍架构和微服务)
-
淘宝前后端分离实践(定义前后端边界)