1.什么是Node.js?
Node.js,或者 Node,是一个可让 JavaScript 运行在服务器端的平台。它可让 JavaScript 脱离浏览器的束缚运行在通常的服务器环境下,就像运行 Python、 Perl、 PHP、 Ruby 程序同样。你能够用 Node.js 轻松地进行服务器端应用开发,Python、Perl、PHP、Ruby 能 作的事情 Node.js 几乎都能作,并且能够作得更好。
Node.js 是一个为实时Web(Real-time Web)应用开发而诞生的平台,它从诞生之初就充分 考虑了在实时响应、超大规模数据要求下架构的可扩展性。这使得它摒弃了传统平台依靠多线 程来实现高并发的设计思路,而采用了单线程、异步式I/O、事件驱动式的程序设计模型。
Node.js 是一个让 JavaScript 运行在服务 端的开发平台,它让 JavaScript 成为脚本语言世界的一等公民。
Node.js 中所谓的 JavaScript 只是 Core JavaScript,或者说是 ECMAScript 的一个 实现,不包含 DOM、BOM 或者 Client JavaScript。这是由于 Node.js 不运行在浏览器中,所 以不须要使用浏览器中的许多特性。
Node.js 的 JavaScript 引擎是 V8,它的 JIT(Just-in-time Compilation,即时编译) 执行速度已经快到了接近本地代码的执行速度。Node.js 不运行在浏览器中,因此也就不存 在 JavaScript 的浏览器兼容性问题,你能够放心地使用 JavaScript 语言的全部特性。
2.Node.js能作什么?
- 具备复杂逻辑的网站;
- 基于社交网络的大规模 Web 应用;
- Web Socket 服务器;
- TCP/UDP 套接字应用程序;
- 命令行工具;
- 交互式终端程序;
- 带有图形用户界面的本地应用程序;
- 单元测试工具;
- 客户端 JavaScript 编译器。
Node.js 内建了 HTTP 服务器支持,也就是说你能够垂手可得地实现一个网站和服务器 的组合。而当你使用 Node.js 时,不用额外搭建一个 HTTP 服务器,由于 Node.js 自己 就内建了一个。这个服务器不只能够用来调试代码,并且它自己就能够部署到产品环境,它 的性能足以知足要求。
Node.js 还能够部署到非网络应用的环境下,好比一个命令行工具。
3.异步式 I/O 与事件驱动
Node.js 最大的特色就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方 案,传统的架构是多线程模型,也就是为每一个业务逻辑提供一个系统线程,经过系统线程切 换来弥补同步式 I/O 调用时的时间开销。Node.js 使用的是单线程模型,对于全部 I/O 都采用 异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程当中会维护一个事件队 列,程序在执行时进入事件循环等待下一个事件到来,每一个异步式 I/O 请求完成后会被推送 到事件队列,等待程序进程进行处理。
例如,对于简单而常见的数据库查询操做,按照传统方式实现的代码以下:
res = db.query('SELECT * from some_table');
res.output();
以上代码在执行到第一行的时候,线程会阻塞,等待数据库返回查询结果,而后再继续 处理。然而,因为数据库查询可能涉及磁盘读写和网络通讯,其延时可能至关大(长达几个 到几百毫秒,相比CPU的时钟差了好几个数量级),线程会在这里阻塞等待结果返回。对于高并发的访问,一方面线程长期阻塞等待,另外一方面为了应付新请求而不断增长线程,所以 会浪费大量系统资源,同时线程的增多也会占用大量的 CPU 时间来处理内存上下文切换, 并且还容易遭受低速链接攻击。 看看Node.js是如何解决这个问题的:
db.query('SELECT * from some_table', function(res) {
res.output();
});
这段代码中 db.query 的第二个参数是一个函数,咱们称为回调函数。进程在执行到 db.query 的时候,不会等待结果返回,而是直接继续执行后面的语句,直到进入事件循环。 当数据库查询结果返回时,会将事件发送到事件队列,等到线程进入事件循环之后,才会调 用以前的回调函数继续执行后面的逻辑。
Node.js 的异步机制是基于事件的,全部的磁盘 I/O、网络通讯、数据库查询都以非阻塞的方式请求,返回的结果由事件循环来处理。图1-1 描述了这个机制。Node.js 进程在同一时 刻只会处理一个事件,完成后当即进入事件循环检查并处理后面的事件。这样作的好处是, CPU 和内存在同一时间集中处理一件事,同时尽量让耗时的 I/O 操做并行执行。对于低速 链接攻击,Node.js 只是在事件队列中增长请求,等待操做系统的回应,于是不会有任何多 线程开销,很大程度上能够提升 Web 应用的健壮性,防止恶意攻击。