Node.js综述

前言

本综述文章旨在帮助读者深入理解下Node.js的本质,不去关注应用的细节,我认为真正的技术问题只有在动手写代码的时候才会遇到,那个阶段解决问题才是真正有意义的。

发展史

Node.js是Ryan Dahl 2009年对外发布的开源醒目,后来该项目被Joyent公司注意到并于2010年成为Joyent公司的一个子项目。2016年微软与Joyent公司合作,Node.js在windows上得到支持。

目前Node.js的版本为V6.11,周围已经形成了一个庞大的生态系统。

特性分析

Node.js is a JavaScript runtime built on Chrome‘s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js‘ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

上面是Node.js的官方描述,其中包含了Node.js最突出的特点。

1、Javascript runtime

这个描述解答了Node.js是什么的问题。它是一个Javascript 运行环境,类似于JVM之于Java,Node.js负责将Javascript转化为计算机可以识别的机器语言,同时对外提供API。传统上javascript依附于浏览器运行:

Node.js舍弃了浏览器,直接与js引擎对接,通过js引擎提供的API,Node.js可以完成其他后端语言(java)所能完成的一切功能,例如文件操作、网络通信、设备管理等等。

下面说下Node.js所采用的js引擎——V8,这是目前世界上最快的js引擎,来自于Google Chrome项目,用C++语言编写,凭借Goole强大的技术支持,它的执行速度已经接近本地代码的执行速度。

除了V8以外,Node.js的还是用了libev和libio库支持事件驱动和异步IO,如图所示,libuv是在libev和libeio的基础上抽象出的一层,对于POSIX系统,libuv利用epoll或者kqueue,而在Windows系统中,libuv使用了IOCP机制,以在不同的平台下实现统一的高性能。

2、non-blocking IO and event-driven

先说说非阻塞IO,假设一个请求要读取数据库,db.query(select * from table),这个过程涉及磁盘读取与网络通信,耗时很长,下面是几种服务器处理方式。

(1)如果是单线程+阻塞处理,前端会等待数据读取完毕才接受到消息,同时后续的请求也得等待,这样的系统是不能忍受的。

(2)好在现在的后端容器都是支持多线程+阻塞的,其解决思路如下:

等待数据的现场继续等待,如果有新请求就重新创建一个线程,把cpu让给新的线程,待原线程得到数据后再把cpu切换给原线程。这样做有什么缺点么?

一是大量请求的情况下线程数目不断增加,浪费大量系统资源。

二是CPU在处理上下文切换的时候也浪费了不少时间。

(3)Node.js的解决思路则完全不一样。它被设计成单线程+非阻塞的。

所有的请求都在一个线程处理,一旦遇到耗时的请求,cpu不等待数据返回,而是接着处理后续的请求。那么问题来了,前面请求的数据到达后,如何返回给前端呢?这就要牵扯到Node.js的另外一个特性——事件驱动。

在上面的简化模型中,所有的请求会依次进入线程的处理循环中,每个请求自带回调函数,当耗时请求接受完数据后,回调函数自动被调用,重新进去循环处理,直到数据被返回给前端。

这样能让单个CPU充分运行起来,没有丝毫等待,同时避免了在不同的线程中频繁切换引起的浪费。根据统计,Node.js相对传统的PHP+Nginx,在性能上有明显提升。

这种设计思路就是为微服务web系统而生的,因为web服务的特点就是请求密集、计算量小、要求快速响应。

Node.js的缺点

1、对于长期占据CPU的请求,后续的请求不能得到及时处理,产生较大延时,所以Node.js不适合计算密集型应用。

2、Node.js专注单线程处理,在多核环境中,必须总多进城才能充分利用多核,因此增加了设计难度。

3、Node.js的异步式编程模式不太符合一般的程序控制思路,给编码和调试带来不少困难。

常用辅助框架

1、npm(Node Package Manager)

Node.js本身提供的API比较底层,完全依靠Node.js实现一个系统对技术人员要求比较高。不过现在已经有大量的第三方支持供开发者使用。为了更好地使用和管理这些第三方提供的包,Node.js官方提供了一个基于命令行的包管理工具——npm.

npm完全由javascript实现,不属于Node.js的一部分。不过在Node.js0.6开始,npm会自动包含在发行版中。

2、Express

参考

《Node.js开发指南》

时间: 2024-12-31 06:24:46

Node.js综述的相关文章

node.js从入门到菜鸟——资源无法载入?你需要学会地址解析

node.js是什么似乎已经不需要我多为赘述了,非阻塞的服务器语言.JS书写的后台代码,无数的文章已经很好的展示了node的魅力与展望.关于node.js的安装,大家不妨参考博客园聂微东的http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html (node.js初体验),这篇文章很好的综述了node.js的一个基础(从安装到体验到模块的一个入门,个人感觉是一篇很好的文章),相信通过东哥的这篇文章大家可以对node有一个初步

快速使用node.js进行web开发

首先关于node.js的学习,这里推荐一本比较好的教程,nodejs web开发指南,该书通俗易懂地将node.js语言特性讲解完之后,又从一个项目角度带领读者使用node.js学习web开发.相信这是一个比较好的学习模式和过程.由于这本书是2012年出的,书中的一个web教学项目是开发一个微博.从2012到现在,node.js及其生态环境发生了很大改变,所以关于该书的学习如果照着书本显然是过于陈旧的.到目前为止,node.js的web开发框架已经升级到了Express4.12.1,对于Mong

【转】Node.js到底是用来做什么的

Node.js的到底是用来做什么的 在阐述之前我想放一个链接,这是国外的一个大神,对于node.js非常好的一篇介绍的文章,英文比较好的朋友可以直接去阅读,本文也很大程度上参考了这篇文章,也同时感谢知乎用户厂长对于本文的翻译!原文题目为Node.js is the New Black Node.js的简介 根据维基百科对于Node.js的介绍,我们可以知道一些基本关于Node.js的情况.Node.js是瑞安·达尔(Ryan Dahl)在2009年发明出来的一种一个能够在服务器端运行JavaSc

node.js的安装及配置

一.安装 直接在浏览器搜索node.js,在官网上下载(一般旧版的更加稳定,比如下载4.4.7版本) 点击DOWNLOADS 往下翻,点击Previous Release Windows下载msi(64位/32位) 根据提示一步步安装,安装之后的文件夹如下: 在cmd命令行下输入node -v,如果出现如下,说明安装成功: 二.关于配置 在安装路径下新建两个文件夹: 创建完两个空文件夹之后,打开cmd命令窗口,输入 npm config set prefix "D:\Program Files

Node.js: Extend and Maintain Applications + large scale

https://blog.risingstack.com/node-js-mysql-example-handling-hundred-gigabytes-of-data/ My secondary goal with this article is to help you decide if Node.js + MySQL is a good fit for your needs, and to provide help with implementing such a solution. h

1.node.js windows环境搭建

作为服务端运行javascript的平台的NodeJs,把前台javascript移到了服务器端,Google V8引擎使其运行效率非常高,它可以异步,无任何阻塞运行程序.nodejs包含http服务器,可以为我们实现 web系统设计,客户端javascript编译器,等一系列的功能. 工具/原料 windows系统电脑 ,电脑可以上网 方法/步骤 下载windows平台nodejs环境安装包,百度一下nodejs官网,找到DOWNLOADS点击,找到Windows Installer 如果为6

在Node.js中使用RabbitMQ系列二 任务队列

在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心解决的问题是避免立即处理那些耗时的任务,也就是避免请求-响应的这种同步模式.取而代之的是我们通过调度算法,让这些耗时的任务之后再执行,也就是采用异步的模式.我们需要将一条消息封装成一个任务,并且将它添加到任务队列里面.后台会运行多个工作进程(worker process),通过调度算法,将队列里的任

node.js搭建代理服务器请求数据

1.引入node.js中的模块 1 var http = require("http"); 2 var url = require("url"); 3 var qs = require("querystring"); 2.创建服务器 //用node中的http创建服务器 并传入两个形参 http.createServer(function(req , res) { //设置请求头 允许所有域名访问 解决跨域 res.setHeader("

Node.JS 文件读写,把Sheet图集转换为龙骨动画图集

Node.JS 文件读写,把Sheet图集数据转换为龙骨动画图集数据 var fs = require("fs") var readline = require("readline"); var rl = readline.createInterface({ input:process.stdin, output:process.stdout }); var path = undefined; var dbName = undefined; rl.question(