Node简介

22 2月

Node是一个基于Chrome V8引擎的JS运行环境,使用了事件驱动非阻塞式I/O模型。

Node基于chrome V8引擎,因此在Node中写JS代码和在浏览器中写JS代码90%都是一样的,几乎没有区别。区别:Node里没有浏览器API,例如window,document等,但多了Node特有的API。

Application代码传递给Chrome V8引擎解析。Chrome V8引擎会调用NodeJS的内置模块(如OS,Process,File System,Net等模块)访问操作系统。

NodeJS是非阻塞IO,阻塞IO和非阻塞IO的区别是:系统接收输入再到输出期间,能不能接收其他输入。LIBUV就是实现非阻塞IO的核心模块,左边NodeJS线程通过非阻塞IO的方式调用右边C++线程。

Node拓展了前端的技能领域,适用场景:

  • SEO优化:在对搜索引擎SEO优化需求较高的业务中,特别是内容类页面,适合用Node来做SSR
  • 性能优化:适合用Node来做SSR
  • BFF层:后台服务较多的业务中,可以用Node来做BFF层,整合这些后台服务。BFF层使用后端的RPC通信,并为前端提供HTTP服务

上述内容后端Java工程师也能做,但因为和页面展现相关所以前端做起来更得心应手。前端用Node做还有个优势是同构应用开发起来比较简单,因为Node是基于chrome V8引擎能在服务端运行JS,所以模板组件既能在浏览器渲染,也能在Node渲染。

用Node结合KOA等框架做个后台服务,甚至搭配前端React框架做个同构应用渲染页面不难。难的是真实线上应用要可靠性高,响应速度快。

  • 可靠性高:需要能抗住高并发性能压测
  • 响应速度快:除了代码层面优化外,需要在架构层面做动静分离的设计。

静态资源:response不会因request的参数变化而变化的资源,通常是资源文件。静态资源不会存在Node服务器上,通常是存放在Apache这样的专业的用C++底层技术做的服务器上作为源站,由CDN提供服务。用户request发到最近的CDN上,CDN会从源站拿到静态资源返回response。当然CDN会做缓存,从源站拿到的静态资源缓存在本地硬盘上,这样相同的request会直接返回本地缓存的资源。

动态资源:会因request的参数变化而变化的资源。参数变种很多不可控,所以不会堆大量的源站机器承载。

  • Nginx反向代理:例如http://xxxx.com/123,页面内容根据path里的id进行变化,可以在云服务器的Nginx上根据请求路径配置location的反向代理,规则转成 /xxx?id=123 打到Node服务器上,实时获取资源。
  • 负载均衡:Node服务器可以开多个端口,在Nginx配置中进行负载均衡。
  • Redis缓存:Node服务器获取到的实时资源,可以在Redis里进行缓存。相同request可以优先返回Redis缓存。

通过动静分离的架构设计可以最大化地提升响应速度。

发表评论

邮箱地址不会被公开。 必填项已用*标注