【VC++开源代码栏目提醒】:网学会员--在 VC++开源代码编辑为广大网友搜集整理了:深入浅出Node.js - 其它资料绩等信息,祝愿广大网友取得需要的信息,参考学习。
深入浅出 Node.js什么是 Node.js从名字说起有关 Node.js 的技术报道越来越多,Node.js 的写法也是五花八门,有写成 NodeJS 的,有写成Nodejs 的,到底哪一种写法最标准呢,我们不妨遵循官方的说法。
在 Node.js 的官方网站上,一直将其项目称之为”Node“或者”Node.js“,没有发现其他的说法,”Node“用的最多,考虑到 Node这个单词的意思和用途太广泛,容易让开发人员误解,我们采用了第二种称呼——”Node.js“,js的后缀点出了 Node 项目的本意,其他的名称五花八门,没有确切的出处,我们不推荐使用。
Node.js 不是 JS 应用、而是 JS 运行平台看到 Node.js 这个名字,初学者可能会误以为这是一个 Javascript 应用,事实上,Node.js 采用C语言编写而成,是一个 Javascript 的运行环境。
为什么采用 C语言呢?据 Node.js 创始人Ryan Dahl 回忆,他最初希望采用 Ruby 来写 Node.js,但是后来发现 Ruby 虚拟机的性能不能满足他的要求,后来他尝试采用 V8 引擎,所以选择了 C语言。
既然不是 Javascript 应用,为何叫.js 呢?因为 Node.js 是一个 Javascript 的运行环境。
提到 Javascript,大家首先想到的是日常使用的浏览器,现代浏览器包含了各种组件,包括渲染引擎、Javascript 引擎等,其中 Javascript引擎负责解释执行网页中的 Javascript
代码。
作为 Web 前端最重要的语言之一,Javascript 一直是前端工程师的专利。
不过,Node.js 是一个后端的 Javascript 运行环境(支持的系统包括nux、Windows),这意味着你可以编写系统级或者服务器端的 Javascript
代码,交给 Node.js 来解释执行,简单的命令类似于:node helloworld.jsNode.js 采用了 Google Chrome 浏览器的 V8 引擎,性能很好,同时还提供了很多系统级的 API,如文件操作、网络编程等。
浏览器端的 Javascript
代码在运行时会受到各种安全性的限制,对客户系统的操作有限。
相比之下,Node.js 则是一个全面的后台运行时,为 Javascript 提供了其他语言能够实现的许多功能。
Node.js 采用事件驱动、异步编程,为网络服务而设计事件驱动这个词并不陌生,在某些传统语言的网络编程中,我们会用到回调函数,比如当 socket资源达到某种状态时,注册的回调函数就会执行。
Node.js 的设计思想中以事件驱动为核心,它提供的绝大多数 API 都是基于事件的、异步的风格。
以 Net 模块为例,其中的 net.Socket 对象就有以下事件:connect、data、end、timeout、drain、error、close 等,使用 Node.js 的开发人员需要根据自己的业务逻辑注册相应的回调函数。
这些回调函数都是异步执行的,这意味着虽然在
代码结构中,这些函数看似是依次注册的,但是它们并不依赖于自身出现的顺序,而是等待相应的事件触发。
事件驱动、异步编程的设计(感兴趣的读者可以查阅笔者的另一篇文章《Node.js的异步编程风格》),重要的优势在于,充分利用了系统资源,执行
代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。
此类设计非常适合于后端的网络服务编程,Node.js 的目标也在于此。
在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。
通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。
从 Node.js 提供的支持模块中,我们可以看到包括文件操作在内的许多函数都是异步执行的,这和传统语言存在区别,而且为了方便服务器开发,Node.js 的网络模块特别多,包括 HTTP、DNS、NET、UDP、HTTPS、TLS 等,开发人员可以在此基础上快速构建 Web 服务器。
以简单的helloworld.js 为例:var http requirehttphttp.createServerfunction req res res.writeHead200 Content-Type: text/plain res.endHello Worldn.listen80 quot127.0.0.1quot上面的
代码搭建了一个简单的 http 服务器(运行示例部署在 http://helloworld.cnodejs.net/中,读者可以访问),在本地监听 80 端口,对于任意的 http 请求,服务器都返回一个头部状态码为200、Content-Type值为 text/plain的”Hello World“文字响应。
从这个小例子中,我们可以看出几点: Node.js 的网络编程比较便利,提供的模块(在这里是 http)开放了容易上手的 API 接 口,短短几行
代码就可以构建服务器。
体现了事件驱动、异步编程,在 createServer 函数的参数中指定了一个回调函数(采用 Javascript 的匿名函数实现),当有 http 请求发送过来时,Node.js 就会调用该回调函数 来处理请求并响应。
当然,这个例子相对简单,没有太多的事件注册,在以后的文章中 读者会看到更多的实际例子。
Node.js 的特点下面我们来说说 Node.js 的特点。
事件驱动、异步编程的特点刚才已经详细说过了,这里不再重复。
Node.js 的性能不错。
按照创始人 Ryan Dahl 的说法,性能是 Node.js 考虑的重要因素,选择 C和 V8 而不是 Ruby 或者其他的虚拟机也是基于性能的目的。
Node.js 在设计上也是比较大胆,它以单进程、单线程模式运行(很吃惊,对吧?这和 Javascript 的运行方式一致),事件驱动机制是 Node.js 通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换,这意味着面对大规模的 http 请求,Node.js 凭借事件驱动搞定一切,习惯了传统语言的网络服务开发人员可能对多线程并发和协作非常熟悉,但是面对 Node.js,我们需要接受和理解它的特点。
由此我们是否可以推测出这样的设计会导致负载的压力集中在 CPU (事件循环处理?)而不是内存(还记得 Java 虚拟机抛出 OutOfMemory 异常的日子吗?),眼见为实,不如来看看淘宝共享数据平台团队对 Node.js 的性能测试: 物理机配置:RHEL 5.2、CPU 2.2GHz、内存 4G Node.js 应用场景:MemCache 代理,每次取 100 字节数据 连接池大小:50 并发用户数:100 测试结果(socket 模式) 、QPS(16700) :内存(30M) 、CPU(95)从上面的结果,我们可以看到在这样的测试场景下,qps 能够达到 16700 次,内存仅占用 30M(其中 V8 堆占用 22M),CPU 则达到 95,可能成为瓶颈。
此外,还有不少实践者对 Node.js做了性能分析,总的来说,它的性能让人信服,也是受欢迎的重要原因。
既然 Node.js 采用单进程、单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的 Node.js 如何利用多核CPU 呢?创始人 Ryan Dahl 建议,运行多个 Node.js 进程,利用某些通信机制来协调各项任务。
目前,已经有不少第三方的 Node.js 多进程支持模块发布,专栏后面的文章会详细讲述 Node.js在多核 CPU 下的编程。
Node.js 的另一个特点是它支持的编程语言是 Javascript。
关于动态语言和静态语言的优缺点比较在这里不再展开讨论。
只说三点: 1. Javascript 作为前端工程师的主力语言,在技术社区中有相当的号召力。
而且,随着 Web 技术的不断发展,特别是前端的重要性增加,不少前端工程师开始试水”后台应用“,在 许多采用 Node.js 的企业中,工程师都表示因为习惯了 Javascript,所以选择 Node.js。
2. Javascript 的匿名函数和闭包特性非常适合事件驱动、异步编程,从 helloworld 例子中 我们可以看到回调函数采用了匿名函数的形式来实现,很方便。
闭包的作用则更大,看 下面的
代码示例: var hostRequest http.requestrequestOptionsfunctionresponse var responseHTML response.ondata function chunk responseHTML responseHTML chunk response.onendfunction console.logresponseHTML // do something useful 在上面的
代码中,我们需要在 end 事件中处理 responseHTML 变量,由于 Javascript 的 闭包特性,我们可以在两个回调函数之外定义 responseHTML 变量,然后在 data 事件对 应的回调函数中不断修改其值,并最终在 end 事件中访问处理。
3. Javascript 在动态语言中性能较好,有开发人员对 Javacript、Python、Ruby 等动态语言 做了性能分析,发现 Javascript 的性能要好于其他语言,再加上 V8 引擎也是同类的佼 佼者,所以 Node.js 的性能也受益其中。
Node.js 发展简史2009 年 2 月,Ryan Dahl 在博客上宣布准备基于 V8 创建一个轻量级的 Web 服务器并提供一套库。
2009 年 5 月,Ryan Dahl 在 GitHub 上发布了最初版本的部分 Node.js 包,随后几个月里,有人开始使用 Node.js 开发应用。
2009 年 11 月和 2010 年 4 月,两届 JSConf 大会都安排了 Node.js 的讲座。
2010 年年底,Node.js 获得云计算服务商 Joyent 资助,创始人 Ryan Dahl 加入 Joyent 全职负责Node.js 的发展。
2011 年 7 月,Node.js 在微软的支持下发布 Windows 版本。
Node.js 应用案例虽然 Node.js 诞生刚刚两年多,但是其发展势头逐渐赶超 Ruby/Rails,我们在这里列举了部分企业应用 Node.js 的案例,听听来自客户的声音。
在社交网站 LinkedIn 最新发布的移动应用中,NodeJS 是该移动应用的后台基础。
LinkedIn 移动开发主管 Kiran Prasad 对媒体表示,其整个移动软件平台都由 NodeJS 构建而成:LinkedIn 内部使用了大量的技术,但是在移动服务器这一块,我们完全基于 Node。
(使用它的原因)第一,是因为其灵活性。
第二,如果你了解 Node,就会发现它最擅长的事情是与其他服务通信。
移动应用必须与我们的平台 API 和数据库交互。
我们没有做太多数据分析。
相比之前采用的 Ruby on Rails 技术,开发团队发现 Node 在性能方面提高很多。
他们在每台物理机上跑了 15 个虚拟服务器(15 个实例),其中 4 个实例即可处理双倍流量。
容量评估基于负载测试的结果。
企业社会化服务网站 Yammer 则利用 Node 创建了针对其自身平台的跨域代理服务器,第三方的开发人员可以通过该服务器实现从自身域托管的 Javascript
代码与 Yammer 平台 API 的 AJAX 通信。
Yammer 平台技术主管 Jim Patterson 对 Node 的优点和缺点提出了自己的看法:(优点)因为 Node 是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在 Node上的代理服务器相比其他技术实现(如 Ruby)的服务器表现要好得多。
此外,与 Node 代理服务器交互的客户端
代码是由 javascript 语言编写的, 因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。
(缺点)Node 是一个相对新的
开源项目,所以不太稳定,它总是一直在变,而且缺少足够多的第三方库支持。
看起来,就像是 Ruby/Rails 当年的样子。
知名项目托管网站 GitHub 也尝试了 Node 应用。
该 Node 应用称为 NodeLoad,是一个存档下载服务器(每当你下载某个存储分支的 tarball 或者 zip 文件时就会用到它)。
GitHub 之前的存档下载服务器采用 Ruby 编写。
在旧系统中,下载存档的请求会创建一个 Resque 任务。
该任务实际上在存档服务器上运行一个 git archive 命令,从某个文件服务器中取出数据。
然后,初始的请求分配给你一个小型 Ruby Sinatra 应用等待该任务。
它其实只是在检查 memcache flag 是否存在,然后再重定向到最终的下载地址上。
旧系统运行大约 3 个 Sinatra 实例和 3 个 Resqueworker。
GitHub 的开发人员觉得这是 Node 应用的好机会。
Node 基于事件驱动,相比 Ruby 的阻塞模型,Node 能够更好地处理 git 存档。
在编写新下载服务器过程中,开发人员觉得 Node非常适合该功能,此外,他们还里利用了 Node 库 socket.io 来监控下载状态。
不仅在国外,Node 的优点也同样吸引了国内开发人员的注意,淘宝就实际应用了 Node 技术:MyFOX 是一个数据处理中间件,负责从一个 MySQL 集群中提取数据、计算并输出统计结果。
用户提交一段 SQL 语句,MyFOX 根据该 SQL 命令的语义,生成各个数据库分片所需要执行的查询语句,并发送至各个分片,再将结果进行汇总和计算。
MyFOX 的特点是 CPU 密集,无文件IO,并只处理只读数据。
起初 MyFOX 使用 PHP 编写,但遇到许多问题。
例如 PHP 是单线程的,MySQL 又需要阻塞查询,因此很难并发请求数据,后来的解决方案是使用 nginx 和 dirzzle,并基于 HTTP 协议实现接口,并通过 curl_multi_get 命 令进行请求。
不过 MyFOX 项目组最终还是决定使用 Node.js 来实现 MyFOX。
选择 Node.js 有许多方面的原因,比如考虑了兴趣及社区发展,同时也希望可以提高并发能力,榨干 CPU。
例如,频繁地打开和关闭连接会让大量端口处于等待状态,当并发数量上去之后,时常会因为端口不够用(处于 TIME_WAIT 状态)而导致连接失败。
之前往往是通过修改系统设置来减少等待时间以绕开这个错误,然而使用连接池便可以很好地解决这个问题。
此外,以前MyFOX 会在某些缓存失效的情况下出现十分密集的访问压力,使用 Node.js 便可以共享查询状态,让某些请求“等待片刻”,以便系统重新填充缓存内容。
Node.jsampNPM 的安装与配置Node.js 安装与配置Node.js 已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对 0.4.x 版本而言的,并非适合最新的 0.6.x 的版本情况了,对此,我们将在 0.6.x 的版本上介绍 Node.js 的安装和配置。
(本文一律以 0.6.1 为例,0.6 的其余版本,只需替换版本号即可。
从 http://nodejs.org/download 可以查看到最新的二进制版本和源
代码)。
Windows 平台下的Node.js 安装在过去,Node.js 一直不支持在 Windows 平台下原生编译,需要借助 Cygwin 或 MinGW 来模拟 POSIX 系统,才能编译安装。
幸运的是 2011 年 6 月微软开始与 Joyent 合作移植 Node.js 到 Windows 平台上(http://www.infoq.com/cn/news/2011/06/node-exe ),这次合作的成果最终呈现在 0.6.x 的稳定版的发布上。
这次的版本发布使得 Node.js 在 Windows 平台上的性能大幅度提高,使用方面也更容易和轻巧,完全摆脱掉 Cygwin 或 MinGW 等实验室式的环境,并且在某些细节方面,表现出比 Linux 下更高的性能,细节参见 http://www.infoq.com/news/2011/11/Nodejs-Windows。
在 Windows(Windows7)平台下,我将介绍二种安装 Node.js 的方法,即普通和文艺安装方法。
普通的安装方法普通安装方法其实就是最简单的方法了,对于大多 Windows 用户而言,都是不太喜欢折腾的人,你可以从这里(http://nodejs.org/dist/v0.6.1/node-v0.6.1.msi )直接下载到 Node.js 编译好的 msi 文件。
然后双击即可在程序的引导下完成安装。
在命令行中直接运行:node -v命令行将打印出:v0.6.1该引导步骤会将 node.exe 文件安装到 C:Program Files x86nodejs目录下,并将该目录添加进 PATH 环境变量。
文艺的安装方法Windows 平台下的文艺安装方法主要提供给那些热爱折腾,喜欢编译的同学们。
在编译源码之前需要注意 Node.js 的源码主要由 C
代码和 JavaScript
代码构成,的是你的 Windows 系统是否包含编译源码的工具。
但是却用 gyp 工具(http://code.google.com/p/gyp/ )来做源码的项目管理,该工具采用 Python 语言写成的。
在 Windows 平台上,Node.js 采用 gyp 来生成 Visual Studio Solution 文件,最终通过
VC的编译器将其编译为二进制文件。
所以,你需要满足以下两个条件: 1. Python(Node.js 建议使用 2.6 或更高版本,不推荐 3.0),可以从这里(http://python.org/)获 取。
2.
VC 编译器,包含在 Visual Studio 2010 中(
VC 2010 Express 亦可),VS2010 可以从这里 (http://msdn.microsoft.com/en-us/vstudio/hh388567)找到。
下载 Node.js 的 0.6.1 版本的源码压缩包(http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gz )并解压之。
通过命令行进入解压的源码目录,执行 vcbuild.bat release 命令,然后经历了漫长的等待后,编译完成后,在 Release 目录下可以找到编译好的 node.exe 文件。
通过命令行执行 node -v。
命令行返回结果为:v0.6.1事实上,如果你的编译环境中存在 WiX 工具集(http://wix.sourceforge.net/ ) 执行 vcbuild.bat msi release ,命令,你将会在 Relase 目录下找到 node.msi。
是的,我们回到了一开始的普通安装方法。
所谓文艺就是多走一些路,多看一些风景罢了。
Unix/Linux 平台下的Node.js 安装由于 Node.js 尚处于 v0.x.x 的版本的快速发展中,Unix/Linux 平台的发行版都不会预置 Node 的二进制文件,通过源码进行编译安装是目前最好的选择。
而且用 Unix/Linux 系统的同学们多数都是文艺程序员,本节只介绍如何通过源码进行编译和安装。
安装条件如同在 Windows 平台下一样,Node.js 依然是采用 gyp 工具管理生成项目的,不同的是通过 make 工具进行最终的编译。
所以 Unix/Linux 平台下你需要以下几个必备条件,才能确保编译完成: 1. Python。
用于 gyp,可以通过在 shell 下执行 python 命令,查看是否已安装 python,并确认版本 是否符合需求(2.6 或更高版本,但不推荐 3.0)。
2. 源
代码编译器,通常 Unix/Linux 平台都自带了 C的编译器(GCC/G)。
如果没有,请通过当 前发行版的软件包安装工具安装 make,g这些编译工具。
a. Debian/Ubuntu 下的工具是 apt-get b. RedHat/centOS 下通过 yum 命令 c. Mac OS X 下你可能需要安装 xcode 来获得编译器 相关厂商内容 Scala,让Java平台上的编程重现生机 3. 其次,如果你计划在 Node.js 中启用网络加密,OpenSSL 的加密库也是必须的。
该加密库是 libssl-dev,可以通过 apt-get install libssl-dev 等命令安装。
检查环境并安装完成以上预备条件后,我们获取源码并进行环境检查吧:wget http://nodejs.org/dist/v0.6.1/node-v0.6.1.tar.gztar zxvf node-v0.6.1.tar.gzcd node-v0.6.1./configure上面几行命令是通过 wget 命令下载最新版本的
代码,并解压之。
./configure 命令将会检查环境是否符合 Nodejs的编译需要。
Checking for program g or c : /usr/bin/gChecking for program cpp : /usr/bin/cppChecking for program ar : /usr/bin/arChecking for program ranlib : /usr/bin/ranlibChecking for g : okChecking for program gcc or cc : /usr/bin/gccChecking for program ar : /usr/bin/arChecking for program ranlib : /usr/bin/ranlibChecking for gcc : okChecking for library dl : yesChecking for openssl : yesChecking for library util : yesChecking for library rt : yesChecking for fdatasync2 with c : yesconfigure finished successfully 7.350s如果检查没有通过,请确认上面提到的三个条件是否满足。
如果 configure 命令执行成功,就可以进行编译了:makemake installNodejs 通过 make 工具进行编译和安装(如果 make install 不成功,请使用 sudo 以确保拥有权限)。
完成以上两步后,检查一下是否安装成功:node -v检查是否返回:v0.6.1至此,Nodejs 已经编译并安装完成。
如需卸载,可以执行 make uninstall 进行卸载。
小结以上介绍了nix 和 Windows 平台下 Nodejs 的安装,之后可以如同 Nodejs 官方网站上介绍的那样,编写example.js 文件。
var http requirehttphttp.createServerfunction req res res.writeHead200 Content-Type: text/plain res.endHello Worldn.listen1337 quot127.0.0.1quotconsole.logServer running at http://127.0.0.1:1337/在命令行中执行它:node example.js你就可以通过浏览器访问 http://127.0.0.1:1337 得到 Hello World 的响应。
安装 NPMNPM 的全称是 Node Package Manager,如果你熟悉 ruby 的 gem,Python 的 PyPL、setuptools,PHP 的pear,那么你就知道 NPM 的作用是什么了。
没错,它就是 Nodejs 的包管理器。
Nodejs 自身提供了基本的模块。
但是在这些基本模块上开发实际应用需要较多的工作。
所幸的是笔者执笔此文的时候 NPM 上已经有了 5112 个 Nodejs 库或框架,这些库从各个方面可以帮助 Nodejs 的开发者完成较为复杂的应用。
这些库的数量和活跃也从侧面反映出 Nodejs 社区的发展是十分神速和活跃的。
下面我将介绍安装 NPM 和通过 NPM安装 Nodejs 的第三方库,以及在大陆的网络环境下,如何更好的利用 NPM。
Unix/Linux 下安装NPM就像 NPM 的官网(http://npmjs.org/)上介绍的那样,安装 NPM 仅仅是一行命令的.
上一篇:
struts+hibernate
下一篇:
关于大学英语教学