Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方案,传统的架构是多线程模型,也就是为每个业务逻辑提供一个系统线程,通过系统线程切 换来弥补同步式 I/O 调用时的时间开销。Node.js 使用的是单线程模型,对于所有 I/O 都采用异步式的请求方式,避免了频繁的上下文切换。Node.js 在执行的过程中会维护一个事件队 列,程序在执行时进入事件循环等待下一个事件到来,每个异步式 I/O 请求完成后会被推送到事件队列,等待程序进程进行处理。
对于高并发的访问,一方面线程长期阻塞等待,另一方面为了应付新请求而不断增加线程,因此 会浪费大量系统资源,同时线程的增多也会占用大量的 CPU 时间来处理内存上下文切换, 而且还容易遭受低速连接攻击。
Node.js是如何读取数据库数据的:
db.query('SELECT * from some_table', function(res) {
res.output();
});
这段代码中 db.query 的第二个参数是一个函数,我们称为回调函数。进程在执行到 db.query 的时候,不会等待结果返回,而是直接继续执行后面的语句,直到进入事件循环。 当数据库查询结果返回时,会将事件发送到事件队列,等到线程进入事件循环以后,才会调用之前的回调函数继续执行后面的逻辑。
Node.js 的异步机制是基于事件的,所有的磁盘 I/O、网络通信、数据库查询都以非阻塞的方式请求,返回的结果由事件循环来处理。
这种异步事件模式的弊端也是显而易见的,因为它不符合开发者的常规线性思路,往往 需要把一个完整的逻辑拆分为一个个事件,增加了开发和调试难度。针对这个问题,Node.js 第三方模块提出了很多解决方案。
Microsoft Windows系统上安装Node.js
在 Windows 上安装 Node.js 十分方便,你只需要访问nodejs.org,点击Download链 接,然后选择Windows Installer,下载安装包。下载完成后打开安装包(如图所示),点击 Next即可自动完成安装。
在 Windows 上安装 Node.js 安装程序不会询问你安装路径,Node.js 会被自动安装到 C:\Program Files\nodejs 或 C:\Program Files (x86)\nodejs(64位系统)目录下,并且会在系统的 PATH 环境变量中增加该目录,因此我们可以在 Windows 的命令提示符中直接运行 node。 为了测试是否已经安装成功,我们在运行中输入 cmd,打开命令提示符,然后输入 node, 将会进入 Node.js 的交互模式,如图所示。
Windows 命令提示符下的 Node.js 通过这种方式安装的 Node.js 还自动附带了 npm,我们可以在命令提示符中直接输入npm 来使用它。
Mac OS X上安装Node.js
Node.js 官方专门提供了 Mac OS X 的安装包,你可以在 nodejs.org 找到Download 链接,然后选择Macintosh Installer,下载安装包。下载完成后运行安装包(如图所示), 根据提示完成安装。
Node.js 和 npm 会被安装到 /usr/local/bin 目录下,安装过程中需要系统管理员权限。安装成功后你可以在终端机中运行 node 命令进入了 Node.js 的交互模式。如果出现 -bash: node: command not found,说明没有正确安装,需要重新运行安装包或者采取其他形式安装 Node.js。
如果你使用 Mac OS X,还可以尝试使用 homebrew 编译安装 Node.js。首先在 http://mxcl. github.com/homebrew/获取 homebrew,然后通过以下命令即可自动解析编译依赖并安装Node.js:
brew install node
安装 Node 包管理器
Node 包管理器(npm)是一个由 Node.js 官方提供的第三方包管理工具,就像 PHP 的 Pear、Python 的 PyPI 一样。npm 是一个完全由 JavaScript 实现的命令行工具,通过 Node.js 执 行,因此严格来讲它不属于 Node.js 的一部分。在最初的版本中,我们需要在安装完 Node.js 以后手动安装npm。但从 Node.js 0.6 开始,npm 已包含在发行包中了,我们在 Windows、 Mac 上安装包和源代码包时会自动同时安装 npm。 如果你是在 Windows 下手动编译的,或是在 POSIX 系统中编译时指定了 --without-npm 参数,那就需要手动安装 npm 了。npmjs.org/提供了 npm 几种不同的安装方法,通常你只需要执行以下命令:
curl http://npmjs.org/install.sh | sh
如果安装过程中出现了权限问题,那么需要在 root 权限下执行上面的语句,或者使用sudo。
curl http://npmjs.org/install.sh | sudo sh
其他安装方法,譬如从 git 中获取 npm 的最新分支,可以参考 npmjs.org/doc/ README.html上的说明。
安装nvm
不推荐的安装方法:
如果使用homebrew来安装的,安装命令如下:
brew install nvm
安装完后,为了让你可以直接在shell使用nvm指令,必须在你的 .bash_profile 加入以下这行(习惯把设定放在.bashrc的人可以把以下的.bash_profile改成.bashrc)(注:如果没有这个文件,可以touch创建)
source $(brew --prefix nvm)/nvm.sh
或者直接输入以下这行来加入
$ echo "source $(brew --prefix nvm)/nvm.sh" >> .bash_profile
记得重新source你的 .bash_profile 来让设定生效
$ . ~/.bash_profile
以上就完成了nvm的安裝。
我们来装一下 node v5.12.0
nvm install 5
安装成功后,使用nvm use 来切换版本
nvm use v5.12.0
切换版本
nvm use v4.6.2
也是如此:
nvm is not compatible with the npm config "prefix" option: currently set to "/Users/fabian/.nvm/versions/node/v0.12.7"
Run `nvm use --delete-prefix v4.6.2` to unset it.
所以只能安装提示,使用
nvm use --delete-prefix v4.6.2
成功切换。
至于为什么用homebrew安装会出现上面的问题,可参考Github上的一个issue。
查看nvm文档发现:文档中Installation 那一小节倒数第二行有一句Homebrew installation is not supported。
推荐的安装方法:
一、卸载已安装到全局的 node/npm
如果之前是在官网下载的 node 安装包,运行后会自动安装在全局目录,其中
node 命令在 /usr/local/bin/node ,npm 命令在全局 node_modules 目录中,具体路径为 /usr/local/lib/node_modules/npm
安装 nvm 之前最好先删除下已安装的 node 和全局 node 模块:
npm ls -g --depth=0 #查看已经安装在全局的模块,以便删除这些全局模块后再按照不同的 node 版本重新进行全局安装
sudo rm -rf /usr/local/lib/node_modules #删除全局 node_modules 目录
sudo rm /usr/local/bin/node #删除 node
cd /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm #删除全局 node 模块注册的软链
二、安装 nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
安装完成后请重新打开终端环境,Mac 下推荐使用 oh-my-zsh 代替默认的 bash shell。
安装完成后,发现使用nvm install stable 安装node速度很慢,原因嘛,大家都懂得。
接下来介绍如何使用国内镜像快速安装node:
建议你把环境变量 NVM_NODEJS_ORG_MIRROR加入到 .bash_profile 文件中:
# nvm
export NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node
然后你可以继续非常方便地安装各个版本的 node 了, 你可以查看一下你当前已经安装的版本。