Node.js

简介

简单的说 Node.js 就是运行在服务端的 JavaScript,它不是一种独立的语言,而是一个运行环境或者说开发平台(SDK,Software Development Kit),类似javad的JRE(java runtime enviroment)和JDK(java development kit)。

JavaScript是一门脚本语言,它的运行需要一个运行环境。就好像PHP需要Apache,JSP需要Tomcat等等。Node.js跳过了Apache、Naginx、IIS等HTTP服务器,因为Node本身就是个web容器(服务器),所以无需要 Apache、IIS等。。Node.js的许多设计理念与经典架构(LAMP)有着很大的不同,可以提供强大的伸缩能力。


js运行的环境是浏览器,现而node.js是基于Google的V8引擎而开发出来的,相当于一个浏览器环境,所以Nodejs可以让javascript运行在服务端。



在 Java、PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。 而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时 连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器 的数量,而 Web 应用程序的硬件成本当然就上升了。



Node.js的创建是为了花最小的硬件成本,追去求更高的并发、更高的处理性能,并且致力于提高web服务器的性能,所以开发者在不使用线程的情况下开发出了一个能够承载高并发的服务器。



Node.js 不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了, 就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。



Node.js 几乎每一个 API 都是支持回调函数的。

Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。

Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数.

非阻塞异步I/O



Node.js与其他语言最大的不同之处在于,PHP等语言是阻塞的(只有前一条命令执行完毕才会执行后面的命令)。


而Node.js是非阻塞的(多条命令可以同时被运行,通过回调函数得知命令已结束运行)。



阻塞:在i/o未返回数据时,线程休眠,直到数据返回。如果在单线程中,所有操作停止等待I/O进行。


线程在执行中如果遇到磁盘读写或网络通信(统称为 I/O 操作), 通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为——阻塞。当 I/O 操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种 I/O 模式就是通 常的同步式 I/O(Synchronous I/O)或阻塞式 I/O (Blocking I/O)。



非阻塞:在i/o未返回数据时,线程仍然继续,返回没有数据返回的结果。在此期间可以进行其他操作,直到I/O数据返回。


异步式 I/O (Asynchronous I/O)或非阻塞式 I/O (Non-blocking I/O)则针对所有 I/O 操作不采用阻塞的策略。当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个事件。为了处理异步 I/O,线程必须有事件循环,不断地检查有没有未处理的事件,依次予以处理。

事件驱动

Node.js 程序由事件循环开始,到事件循环结束,所有的逻辑都是事件的回调函数,所以 Node.js 始终在事件循环中

程序入口就是事件循环第一个事件的回调函数。

事件的回调函数在执行的过程中,可能会发出 I/O 请求,网络通信,数据库查询或直接发射(emit)事件,执行完毕后再返回事件循环,

事件循环会检查事件队列中有没有未处理的事件,直到程序结束。

nodejs java 对比java 的优点 java nodejs区别_node


事件驱动的实例过程:

1,你用浏览器访问nodejs服务器上的"/about.html"

2,nodejs服务器接收到你的请求,调用一个函数从磁盘上读取这个文件。

3,这段时间,nodejs webserver在服务后续的web请求。

4,当文件读取完毕,有一个回调函数被插入到nodejs的服务队列中。

5,nodejs webserver运行这个函数,实际上就是渲染(render)了about.html页面返回给你的浏览器。

参考

后面会有具体的例子来展现。