Node架构与优化入门篇

了解一下NodeJS的架构

Posted by wang chong on February 2, 2019

简单了解前端项目架构的四个方向

SPA(single page application)

SPA的架构模式是最简单的,通过借助各种各样的脚手架来完成(比如:vue-cl、React-app、最传统的HTML+CSS+JS等)。这种架构模式属于CSR(Client Side Render:客户端渲染)的方式。

如图所示:SPA架构模式通过各种脚手架来完成项目构建,最终打包成dist项目包,如果项目存在跨域,通过nginx反向代理服务器来解决。当然也有优点也有缺点。

优点

简单,借助各种各样的脚手架就可以完成(例如:vue-cli、React-App、HTML+CSS+JS),项目打包成dist就可以调用后端API,出现跨域的问题也同样可以搭建一层nginx,一方放后端,一方放前端就可以很好的解决跨域问题。

缺点

如果前端项目一旦做成路由,前端的路由都是假路由,不能控制更好的API,不能做SSR,在性能优化方面的指标都控制不了。

基于BFF的架构模式 Node + SPA

Node + SPA模式中,SPA还是正常的导出dist项目包,为了减少跨域,中间加了一层Node配合,结合起来发布出去。Node是没有路由的,NodeJS只是帮助渲染index.html。因为前端是有假路由的,需要使用这样的一个插件(connect-history-api-fallback),把所有的前端的路由都转回到前端的index.html中,最后使用Node和Java进行通信,解决了跨域的问题。这种方式是Node + CSR的模式。

MPA(multi page application)

MPA是一种多页面应用,通过Node直出渲染页面,也就是所谓的SSR(Server Side Rebder:服务端渲染)。

这种单独的使用Node,用Node去渲染模板引擎(swig),实现SSR。Node和后端交互也良好的解决跨域的问题。

同构化应用

同构是指同开大一个可以泡在不同平台上的程序。例如开发一段 js 代码可以同时被基于 node.js 开发的 web server 和浏览器使用。同构化可以参考这篇文章,因为自己也不懂这个东西聊一聊前端同构

Node前端存在的意义

有很多人都说Node是玩具,很多人玩不转这个东西。NodeJS为我们前端到底带来了什么?

  1. 有了NodeJS加入可以让我们为项目的性能指标负责。
  2. 后端,比如说Java等,它们所做的接口是围绕这整个大系统的。后端吐出的json数据,有可能我们前端只是用到了一小部分,有了NodeJS可以做一层中间层,削减Java的API,提供我们前端需要的东西。
  3. 有了NodeJS可以让我们前端更好的做到前后端分离。

NodeJS异步IO的原理浅析及优化方案

对异步IO的理解

前端通过异步IO可以消除UI的阻塞

我们都知道JavaScript是单线程的,如果当请求是同步的话,后面所有的任务需要等待这个同步任务执行完毕才可以进行,那么大大的浪费了时间。如果是异步的话,当执行到异步函数的时候,这个函数会先把函数的执行权交给外界,让外界继续执行其他任务,等到请求任务完成之后,外界再返回执行权。执行结果。

异步与同步的差异

假如请求资源A的事件为M,请求资源B的事件为N,那么同步的请求耗时就是M + N;如果使用异步方法的话请求耗时就是Max(M,N)。让随着业务的增加,引入分布式系统,请求事件会线性的增加。同步和异步的差异就会更加的明显。

  1. 同步:M + N + N1 + N2 + N3…..
  2. 异步:Max(M,N,N1,N2,N3);
I/O是昂贵的,分布式I/O是更昂贵的

这是关于本机电脑的一些知识。首先什么是CPU时钟周期:1/(cpu主频) 所运算出的值。

在IO操作过程中,I是input(输入)、O是output(输出)。对于输入输出就是CPU对内存的访问。 从上面图我们可以看到从上到下所花费的CPU时钟周期越来越大。懂得计算机原理的话应该知道,从下到上是CPU访问越来越块,性能越来越好,当然也越来越贵。这就是I/O昂贵的原因。

为什么说分布式IO是更加昂贵的呢? 因为分布式系统一般都在远程服务器上,在本机上访问必须要通过网络(CPU访问最慢),到达远程服务器,然后在远程服务器上还需要对远程服务器的内存进行IO操作。

关于上面这个问题,在一篇学术论文上有了这个定律:并不是说都是同步的好,也并不都是异步的好,还是按照系统任务的比例来的。

Node对异步IO的实现

NodeJS的事件循环和浏览器中的是不一样的,NodeJS的事件循环是LIBUV来管理的。Node是单线程的,LIBUV辅助NodeJS进行事件的轮询。

应用程序首先通过V8,然后NOdeJSAPI绑定底层的操作系统,进入LIBUV的事件队列,进入Event Loop进行事件轮询,通过轮询进入worker threads 执行异步操作。执行完操作回到Event Loop进行轮询,通过轮询回到异步队列,通过操作系统和V8再返回给应用。

函数式编程在Node中的应用

  1. 高阶函数:可以将函数作为输入或者返回值,形成一种后续传递风格的程序将函数业务重点从返回值传递到函数中。 在node 中的应用,例如中间件,注册事件等等。

  2. 偏函数:指定部分参数产生一个新的定制函数的形式就是偏函数。Node中异步编程非常常用,我们通过哨兵变量会很容易造成业务的轮换。 underscode、after变量等。 不用哨兵变量了,使用偏函数闭包保存变量

服务器集群管理与Node集群的应用

预备上线

  1. 前端工程化的搭载动态文件的MAP分析压缩打包合并至CDN
  2. 单测、压测 性能分析工具发现Bug
  3. 编写nginx-conf实现均衡和反向代理
  4. PM2启动应用程序小流量灰度上线,修复BUG