天天看点

Node.js介绍一、Node.js简介二、Node.js的结构分层三、支撑Node.js运行的基础构建包括的部分四、Node.js的特点

一、Node.js简介

Node.js使用高效且轻量级的事件驱动、非阻塞I/O模型,是一个基于Chrome V8引擎的JavaScript运行环境和平台。Node.js实质上是对Chrome V8引擎进行了封装,V8引擎执行JavaScript的速度非常快,性能非常好,非常适合在分布式设备上运行密集型数据的实时应用,用于方便地搭建响应速度快、易于扩展的网络应用。

注:Node.js不是一个JavaScript应用,而是一个JavaScript的运行环境,由C++语言编写而成。

二、Node.js的结构分层

  • Node.js标准库。这部分是由JavaScript编写的,即我们使用过程中直接能调用的API。在源码中的lib目录下可以看到。
  • Node bindings。这一层是JavaScript与底层C/C++能够沟通的关键,前者通过bindings调用后者,相互交换数据。
  • 支撑Node.js运行的基础构建。它是由C/C++实现的。

三、支撑Node.js运行的基础构建包括的部分

  • V8:Google推出的JavaScript VM,也是Node.js为什么用JavaScript的关键,它为JavaScript提供了非浏览器端运行的环境,它的高效是Node.js之所以高效的原因之一。
  • libuv:为Node.js提供了跨平台、线程池、事件池、异步I/O等能力,是Node.js如此强大的关键。
  • C-ares:提供了异步处理DNS相关的能力。
  • http-parser、OpenSSL、zlib等:提供包括HTTP解析、SSL、数据压缩等能力。

四、Node.js的特点

1、事件驱动

Node.js的设计思想中以事件驱动为核心,它提供的绝大多数API都是基于事件的、异步的风格。

事件驱动的优势在于充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他任务。在服务器开发中,并发的请求处理是一个大问题,阻塞式的函数会导致资源浪费和事件延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。

2、异步、非阻塞I/O

在Node.js提供的支持模块中,包括文件操作在内的许多函数都是异步执行的。同时为了方便服务器开发,Node.js的网络模块特别多,包括HTTP、DNS、NET、UDP、HTTPS、TLS等。开发人员可以在此基础上快速构建Web服务器。

异步I/O的大致流程为:

(1)发起I/O调用

  • 用户通过JavaScript代码调用Node核心模块,将参数和回调函数传入核心模块。
  • Node核心模块会将传入的参数和回调函数封装成一个请求对象。
  • 将这个请求对象推入I/O线程池等待执行。
  • JavaScript发起的异步调用结束,JavaScript线程继续执行后续操作。

(2)执行回调

  • I/o操作完成后会将结果存储到请求对象的result属性上,并发出操作完成的通知。
  • 每次事件循环时会检查是否有完成的I/O操作,如果有就将请求对象加入I/O观察者队列中,之后当作事件处理。
  • 处理I/O观察者事件时会取出之前封装在请求对象中的回调函数,执行这个回调函数,并将result当作参数,以完成JavaScript回调的目的。

3、性能出众

Node.js在设计上以单进程、单线程模式运行。事件驱动机制是Node.js通过内部单线程高效地维护事件循环队列来完成的,没有多线程的资源占用和上下文切换。这意味着面对大规模的HTTP请求,Node.js是凭借事件驱动来完成的。

4、单线程

Node.js和Nginx一样,都是以单线程为基础的。这正是Node.js保持轻量级和高性能的关键。这里的单线程是指主线程为“单线程”,所有阻塞的部分交给一个线程池处理,然后这个主线程通过一个队列跟线程池协作。我们写的js代码部分不用再关心线程问题,代码也主要由一堆callback回调构成,然后主线程在循环过程中适时调用这些代码。

单线程除了保证Node.js高性能之外,还保证了绝对的线程安全,使开发者不用担心同一变量同时被多个线程读写而造成的程序崩溃。

5、Node.js的应用场景

  • JSON APIs——构建一个Rest/JSON API服务,Node.js可以充分发挥其非阻塞IO模型以及JavaScript对JSON的功能支持(如JSON.stringfy函数)。
  • 单页面、多Ajax请求应用——如Rmail,前端有大量的异步请求,需要服务后端有极高的响应速度。
  • 基于Node.js开发UNIX命令行工具——Node.js可以大量生产子进程,并以流的方式输出,这使得它非常适合做UNIX命令行工具。
  • 流式数据——传统的Web应用,通常会将HTTP请求和响应看成原子事件,而Node.js会充分利用流式数据这个特点,构建非常酷的应用,如实时文件上传系统transloadit。
  • 准实时应用系统——如聊天系统、微博系统,但JavaScript是有垃圾回收机制的,这意味着系统的响应事件是不平滑的(GC垃圾回收会导致系统这一时刻停止工作)。如果想要构建硬实时应用系统,Erlang是一个不错的选择。

Node能处理万条入站tweet。它能快速而又轻松地将它们写入一个内存排队机制(如memcached),另一个单独进程可以从那里将它们写入数据库。Node能处理每个连接而不会阻塞通道,从而能够捕获尽可能多的tweets。

Node.js的软肋:CPU密集型的应用、模板渲染、压缩/解压缩、加/解密等操作。

继续阅读