最近几年,Web 领域出现了一个全新的 JavaScript 开发框架——Node.js。该框架一经问世,便以其独特的优势得到了广大开发人员的关注。以下主要从什么是 Node.js 框架,使用 Node.js 框架能够解决什么问题,为什么要用 Node.js 框架,在哪些场合下应该考虑使用 Node.js 来展开概述。
官网介绍:“Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。”。
也就是说,Node.js 是一个基于 Chrome JavaScript 运行时建立的平台,用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动,非阻塞 I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
Node.js 的首要目标是提供一种简单的、用于创建高性能服务器及可在该服务器中运行的各种应用程序的开发工具。在 Java、php 或 ASP.NET 等服务器端语言中,为每一个客户端连接创建一个新的线程,而每一个线程需要耗费大约 2MB 的内存。也就是说,理论上,具有 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本也就随之增加了。不仅如此,在技术层面也会因此产生一些潜在的问题。例如,由于同一个用户的不同客户端请求可能会被不同的服务器处理,因此必须在所有的服务器之间共享所以的资源。由此可见,在一个 Web 应用程序中,一个主要的瓶颈是服务器所支持的最大同时连接用户量。
Node.js 修改了客户端到服务器端的连接方法,解决了这个问题。因为它并不为每个客户端连接创建一个新的线程,而是为每个客户端连接触发一个在 Node.js 内部进行处理的事件。因此,如果使用 Node.js,可以同时处理多达几万个用户的客户端连接。因此,当需要使 Web 应用程序能够支持大量用户的并发连接的时候,我们应该考虑使用 Node.js。
严格地说,Node.js 是一个开发各种 Web 服务器的开发工具。在 Node.js 服务器中,运行的是高性能 V8 JavaScript 脚本语言,该语言是一种可以运行在服务器端的 JavaScript 脚本语言。
V8 JavaScript 脚本语言是一种被 V8 JavaScript 引擎所解析并执行的脚本语言。V8 JavaScript 引擎由 Google 公司使用 C++ 语言开发的一种高性能 JavaScript 引擎,该引擎并不局限于在浏览器中运行。Node.js 将其转用在了服务器中,并且为其提供了许多附加的具有各种不同用途的 API。例如,在一个服务器中,经常需要处理各种二进制数据。在 JavaScript 脚本语言中,只具有非常有限的对二进制数据的处理能力,而 Node.js 所提供的 buffer 类则提供了丰富的对二进制数据的处理能力。
另外,在 V8 JavaScript 引擎内部使用一种全新的编译技术。这意味着开发者编写的高端的 JavaScript 脚本代码与开发者编写的低端的 C 语言具有非常相近的执行效率,这也是 Node.js 服务器可以提供的一个重要特性。
为了实现高性能,Node.js 中采用了以下两种机制:
JavaScript 脚本语言的一个特征是它只支持单线程。V8 JavaScript 脚本语言也是如此,因此不需要担心它会造成死锁现象。但是与客户端脚本语言不同的是,Node.js 中为 V8 JavaScript 脚本语言提供了非阻塞型 I/O 机制。例如,当在访问数据库取得搜索结果的时候,在开始访问数据库之后、数据库返回结果之前,存在一段等待时间。在传统的单线程处理机制中,在执行了访问数据库的代码之后,整个线程都将暂停下来,等待数据库返回查询结果之后才能继续执行其后面的代码。也就是说,I/O 操作阻塞了代码的执行,极大地降低了程序的执行效率。由于 Node.js 中采用了非阻塞型 I/O 机制,因此在执行了访问数据库的代码之后将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中执行,从而提高了程序的执行效率。
另外,在 Node.js 中,虽然不具有因为用户鼠标单击按钮或输入文字等操作而触发的事件,但是具有由于客户端请求建立连接、通过此连接而接收客户端提交数据、停止客户端提交数据的接收等行为而触发的事件。在 Node.js 中,在一个时刻只能执行一个事件回调函数,但是在执行一个事件回调函数的中途可以转而处理其他事件(包括触发新的事件、声明该事件的回调函数等),然后返回继续执行原事件回调函数,这种处理机制称为事件环机制。
当应用程序需要处理大量并发的输入/输出,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,我们应该考虑使用 Node.js 来进行改应用程序的开发。例如,我们可以开发聊天服务器、综合服务类网站或电子商务网站的服务器等。
在一个具有很高人气的聊天应用程序中,在同一时刻通常可能存在着大量用户与聊天服务器之间的并发连接,而服务器端本身并不存在非常复杂的处理。
在这类网站的服务器端,往往可能在每秒钟内接收到多达上千条数据并且需要将这些数据书写到数据库中,Node.js 是解决这类问题的关键。Node.js 将通过其队列机制将这些数据迅速书写在缓冲区中,然后再通过每一个单独的处理从缓冲区中取出这些数据并将其书写到数据库中。如果使用其他服务器(如 Apache 服务器或 tomcat 服务器)的话,由于这些服务器采用的均为阻塞型 I/O 机制,因此需要为每条数据(到数据库中)的写入等待一段时间。如果使用 Node.js 服务器,由于其采用的是非阻塞型 I/O 机制,因此可以同时实现这些数据到数据库中的写入,而不必再为每条数据的写入等待一段时间。