Node.js——前世今生

Posted Eric的前端那些事

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js——前世今生相关的知识,希望对你有一定的参考价值。



还没有关注Eric君的小伙伴



NO.1 【前言】


1.1.Node.js之父


Node.js之父是一个叫做Ryan Dahl(瑞安·达尔)的数学系博士,Web服务器专家。就是下面这哥们。

Node.js(一)——前世今生

他在2009年推出Node.js,但是2012年退出了Node.js小组,转战GO语言。原因可能是在于:
  • Node适合小型,实时事务型服务器网站;

  • GO更适合构建大型服务器网站;


1.2.Node.js出现的背景


目的:为了解决Web服务器的高并发性能问题。


我们来看一下web服务器究竟有什么性能问题?看下图

Node.js(一)——前世今生

图1 请求/响应示意图

我们知道,每次用户在客户端交互的时候都会发送请求,响应请求,去服务器上获取资源,服务器还可能和数据库进行I/O操作,这势必需要一点时间,当用户多的时候,网络请求延迟将会更长。

因此,我们需要缩短发送请求到响应请求的时长。


为此,我们可以从以下几个方面考虑优化:
  • 让发送请求快一点(不能控制,由客户端网速决定);

  • 让响应快一点(可以控制,将服务器带宽提高, 通过CDN加速等,但考虑到成本,不可能无限的提高带宽);

  • 让服务器处理请求任务快一点(优秀的程序员可以控制,小编这种菜鸟不行);

  • 让服务器从磁盘读取/写入数据到数据库快一点(不能控制,磁盘的读取速度有上限)


为了解决高并发的问题,传统服务器都是通过“多线程”解决,即发送一个请求就开启一条线程。

我们的Ryan Dahl(瑞安·达尔)尝试过用Ruby,c,Lua去解决,但都因为语言自身的各种限制而一一失败。直到V8引擎的出现。

1.3.V8引擎


那么,什么是V8引擎呢?
V8引擎是一款专门对javascript语言进行解释和执行的流程虚拟机。比如把V8引擎嵌入到浏览器中,那么我们写的JavaScript代码就会被浏览器所执行;那么如果把V8引擎嵌入到服务器环境下,那么我们写的JavaScript代码就会被服务器所执行。
总之,一句话, V8引擎嵌入到不同的宿主环境中时,可以把JavaScript语言应用到不同的多领域中。

我们的Ryan Dahl(瑞安·达尔)修改了V8引擎的内核,  把它用在了服务器开发,  经过修改后的这样一套东西就被称为Node.js。

NO.2 【Node.js简介】


2.1.什么是Node.js


Node.js是一个让JavaScript运行在 服务器端的 开发平台,Node之前, js代码只能运行在客户端, Node之后, js代码可以和操作系统(Mac OS,  windows, Linux...)交互,  从浏览器延伸到了服务器。


Node.js一开始叫Web.js, 目的就是用于写高性能Web服务器的,后来越写越大, 形成了一个生态(服务器开发,  各种框架的依赖...), 改名为Node.js。

Node.js(一)——前世今生



Node.js和其它后端语言有什么区别呢?
  • Node.js不是一种独立的语言

    • php, JSP,.... 既是语言, 也是平台

    • Node.js用JavaScript进行编程, 运行平台是包装后的js引擎(V8)

  • Node.js是一种轻量级架构

    • java,php,.net都需要运行在服务器上,apache,tomat,naginx,IIS;

    • Node.js不用架设在任何服务器软件之上;

    • 用最小的硬件成本,达到更高的并发,更优的处理性能


2.2.Node.js特点


Node.js的特点如下:
  • 单线程

    • 优势:减少了内存开销(操作系统完全不再有线程创建、销毁的时间开销)【在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存,相当于有一个人就要分配一个线程,就要占用空间大小】

    • 劣势:如果某一个事件被I/O阻塞了,整个线程就阻塞了

  • 非阻塞I/O

    • 当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率。

    • 而Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。

    • 当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。

    • 因此,阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。

    • 所以,这是一种特别有哲理的解决方案:与其人多,但是好多人闲着;还不如一个人玩命,往死里干活儿。

  • 事件驱动

    • 概念:不管是新用户的请求,还是老用户的I/O完成,都将以事件方式加入事件环,等待调度

    • 运作流程:在Node中,在一个时刻,只能执行一个事件回调函数,  但是在执行一个事件回调函数的中途,可以转而处理其他事件比如,有新用户连接了),然后返回继续执行原事件的回调函数,这种处理机制,称为“事件环”机制。



NO.3 【Node.js应用方向】


3.1.特点


Node.js善于I/O,不善于计算。因此,如果你的业务有很多的CPU计算,实际上也相当于这个计算阻塞了这个单线程,就不适合Node开发。
而当应用程序需要处理大量并发的I/O,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,Node.js非常适合。Node.js也非常适合与webSocket配合,开发长连接的实时交互应用程序。


适用场景:

  • 网站开发(如express/koa等)

  • im即时聊天(socket.io)

  • api(移动端,pc,h5)

  • HTTP Proxy(淘宝、Qunar、腾讯、百度都有)

  • 前端构建工具(grunt/gulp/bower/webpack/fis3…)

  • 跨平台打包工具

  • 写操作系统(NodeOS)

  • 命令行工具(比如cordova、shell.js)

  • 反向代理(比如anyproxy,node-http-proxy)

  • 编辑器Atom、VSCode等等


企业中使用的场景

图2 企业中使用Node.js的情况


多一个点在看

多一条小鱼干

Created with Sketch.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             您的支持,是我写作的最大动力 一台电脑、一杯水、一只傻狗、一个我 生命中出现的任何人,都值得被感恩、铭记

以上是关于Node.js——前世今生的主要内容,如果未能解决你的问题,请参考以下文章

docker4dotnet #1 – 前世今生 & 世界你好

云计算的前世今生

原创 | 函数 scanf 的前世今生

GIT前世今生

Lambda的前世今生

.Net Core001.NetCore前世今生