【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 h
上一篇:
OllyDebug名词解释
下一篇:
行走梵净山之(三)一世一遇,即是懂得