cntchen.github.io icon indicating copy to clipboard operation
cntchen.github.io copied to clipboard

Node.js 应用场景预研

Open CntChen opened this issue 6 years ago • 0 comments

背景

公司大前端团队准备上 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 日志和监控
  • 数据

腾讯

百度

美团

其他公司

  • 饿了么/知乎/大搜车等都在用

国外

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 入门

References

EOF

CntChen avatar Jul 13 '17 14:07 CntChen