Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Node.js 应用场景预研 #7

Open
CntChen opened this issue Jul 13, 2017 · 0 comments
Open

Node.js 应用场景预研 #7

CntChen opened this issue Jul 13, 2017 · 0 comments

Comments

@CntChen
Copy link
Owner

CntChen commented Jul 13, 2017

背景

公司大前端团队准备上 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant