nodejs深入浅出.pdf
Info卷首语专栏序言这本迷你书的发布可以说是众望所归,笔者作为深入浅出Node.js”专栏的发起人倍感欣慰。如今已是2013年盛夏,距离专栏的第·篇文章发布已经快两年吋间,可是在每月noQ中文站的文章访问量Top10排行榜上,总有该专栏的某篇或者几篇文章位列其中,这足以说明,“深入浅岀Node」js"这个专题得到了大读者的背定和欢迎。门技术的发展历程类似于人生,总要经历孕育、诞生、成长、成熟、衰落等几个过程,作为技术人员,应该敏锐地观察和把握住所在领域的技术发展趋势,才不至于被技术的浪潮所淹没。专栏诞生之初,应该是Node.js技术的萌芽之后并在起步成长的关键阶段。InfoQ中文站适时地推出了这个专栏,从Node.js的基本概念、到模块管理、再到异步|○,按照循序渐进的思路向读者呈现∫Node.js的魅力。作者永强兄(朴灵)是一位非常地道的Node.js实践者和布道师,他对前后端的Javascript领域都有着多年的线经验,对Node」js技术的优缺点也有着独到的见解。虽然工作很忙,但永强还是积极地为tInfoS撰稿,从而成就了这个专栏和这本迷你书。在Qcon北京2013技术大会上,水强更是担任了“Node.js"专题的出品人,俨然已是国内Node」js社区的领袖。时至今日,Node.js技术已经进入了青年时期,不论你是否感觉到,它已经慢慢渗入到了很多公司、软件、技术者的心里。如果说在专栏诞生之初,开发者只是观望和评估,那么现在越米越多的领域已经把Node」js应用于生产环境当中并取得了预期的效果。如果你在互联网领域或者企业级Web领域,如果是前端JS或者后端Ⅶeb服务器开发者,那么Nodejs现在是一门必须要了解、最好能够掌握的好技术,一方面可以直接应用于自己的产品和解决方案中,另一方面Node.js的设计思想也能够开阔架构师和开发者的思维方式。这本迷你书正是你了解Nodes技术的最佳入口之一,除此之外,lnQ中文站还发布了许多Node.js相关的新闻、文章和讲座,读者可以边看书边阅读其他网上内容,相信会收获不少。在这个信息爆炸的年代,我们每天要面对成千上万的数据输入,大脑己经在超负荷运转了。有多少次我们曾经计划开始读一本好书、计划开始锻炼身体、计划开始写点日记,有多少次我们回首发现一切如故。“不积跬步无以至千里”,Info下载这本迷你书,设定个阅读计划,给自己一个丰富有用知识、改善自身习惯的机会吧:)本期主编:崔康PoweredbyInfoQcLub我们影响有影响力的人北京上海广州大连西安太原成都杭州武汉南京深圳Club邀请自由开放的业内知名专家讨论时下讨论氛围热点话题定期举办的线下活动】结识圈内技术好友InfoQ中文|英文|日文|葡文内容投稿editors@cn.infoq.com|商务合作saes@cn.infoq,com加入我们hr@cn.infoqconIntod促进软件开发领域知识与创新的传播新闻迷你书文章架构师视频info.com/cnQConTechUPICLub架构师峰会@InfoQ中文|英文|日文|葡文内容投稿editors@cn.infoq.com商务合作saes@cn.infoq,com|加入我们hr@cn.infoq.comInfoNode.js专栏深入浅出Node.js(一):什么是Nodeis作者崔康发布于十月13,2011【编者按】:Node.js从2009年诞生至今,已经发展了两年有余,其成长的速度有目共睹。从在github的访问量超过Ras,到去年底NodejsS创始人RyanDally加盟Joyent获得企业资助,再到今年发布Windows移植版本,Node.js的前景获得了技术社区的肯定。Infos直在关注Node.js的发展,在今年的两次Qcon大会(北京站和杭州站)都有专门的讲座。为了更好地促进Node.js在国内的技术推广,我们决定开设深入浅出Node.js"专栏,邀请来自Node.js领域的布道师开发人员、技术专家来讲述Node.js的各方面内容,让读者对Nodes有更深入的了解,并且能够积极投入到新技术的讨论和实践中。专栏的第一篇文章《什么是Noe」js》尝试从各个角度来阐述Node.js的基本概念、发展历史、优势等,对该领域不熟悉的开发人员可以通过本文了解Node」js的一些基础知识。从名字说起有关Node.js的技术报道越来越多,Nodejs的写法也是五花八门,有写成Nodes的,有写成Nodes的,到底哪一种写法最标准呢,我们不妨遵循官方的说法。在Node.jsl的官方网站上,一直将其项目称之为Node“或者"Node.js“,没有发现其他的说法,“Node“用的最多,考虑到Node这个单词的意思和用途太广泛,容易让开发人员误解,我们采用了第二种称呼—Node.js",js的后缀点出了Node项目的本意,其他的名称五花八门,没有确切的出处,我们不推荐使用。Node.js不是Js应用、而是JS运行平台看到Node.js这个名字,初学者可能会误以为这是一个Javascrip应用,事实上,Nodejs釆用C艹+语言编写而成,是一个Javascript的运行环境。为什么采Info用C++语言呢?据Nodejs创始人RyanDah回忆,他最初希望采用Ruby米写Node.js,但是后来发现Ruby虚拟机的性能不能满足他的要求,后来他尝试采用8引擎,所以选择了C++语言。既然不是Javascript应用,为何叫」s呢?因为Node.js是一个Javascript的运行环境。提到Javascript,大家首先想到的是日常使用的浏览器,现代浏览器包含了各种组件,包括渲染引擎、Javascript引擎等,其中Javascript引擎负责解释执行网页中的Javascript代码。作为eb前端最重要的语言之一,Javascript一直是前端工程师的专利。不过,Node.js是一个后端的Javascrip运行环境(支持的系统包括*nux、Windows),这意味着你可以编写系统级或者服务器端的Javascript代码,交给Node」js来解释执行,简单的命令类似于:#nodehelloworld.jsNode.js.用了GoogleChrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的AP,如文件操作、网络编程等。浏览器端的Javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限。相比之下,Nodejs则是一个全面的后台运行时,为Javascrip提供了其他语言能够实现的许多功能Nodejs采用事件驱动、异步编程,为网络服务而设计事件驱动这个词并不陌生,在某些传统语言的网络编程中,我们会用到回调函数,比如当socke资源达到某种状态时,注册的回调函数就会执行。Nodejs的设计思想中以事件驱动为核心,它提供的绝大多数AP都是基于事件的、异步的风格。以Ne模块为例,其中的netSocket对象就有以下事件:connect、data、end、timeout、drain、eror、close等,使用Nodes的开发人员需要根据自己的业务逻辑注册相应的回调函数。这些回调函数都是异步执行的,这意味着虽然在代码结构中,这些函数看似是依次注册的,但是它们并不依赖于自身出现的顺序,而是等待相应的事件触发。事件驱动、异步编程的设计(感兴趣的读者可以查阅笔者的另一篇文章《Noe」js的昇步编程风格》),重要的优势在于,充分利用了系统瓷源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。此类设计非常适合于后端的网络服务编程,Nodejs的目标也在于此。在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。从Node.js提供的支持模块中,我们可以看到包括文件操作在内的许多函数都是异步执行的,这和传统语言存在区别,而且为了方便服务器开发,Node.s的网Info络模块特别多,包括HTTP、DNS、NET、UDP、Https、TS等,开发人员可以在此基础上快速构建Web服务器。以简单的helloworld.js为例:varhttprequire(http)ihttpcreateserver(function(reg,res)fres.writeHead(200,('Content-Type':'text/plain});resend('Helloworld\n);}).lister(80,"127.0.0.1");上面的代码搭建了一个简单的htp服务器(运行示例部署在htp/helloworld.cnodejsnet中,读者可以访问),在本地监听80端口,对于任意的ht请求,服务器都返回一个头部状态码为200、Content-Type值为text/plain'的”Helloworld“文字响应。从这个小例子中,我们可以看出几点:·Nodejs的网络编程比较便利,提供的模块(在这里是htt)开放了容易上手的APl接口,短短几行代码就可以构建服务器体现了事件驱动、异步编程,在createServel函数的参数中指定了一个回调函数(采用Javascript的匿名函数实现),当有ht请求发送过来时,NodejsI航会调用该回调函数来处理请求并响应。当然,这个例子相对简单,没有太多的事件注册,在以后的文章中读者会看到更多的实际例子。Node.js的特点下面我们来说说Node.js的特点。事件驱动、异步编程的特点刚才已经详细说过了,这里不再重复Node.js的性能不错。按照创始人RyanDahl的说法,性能是Node」js考虑的重要因素,选择C++和V而不是Ruby或者其他的虚拟机也是基于性能的目的。Node.js在设计上也是比较大胆,它以单进程、单线程模式运行(很吃惊,对吧?这和Javascrip的运行方式一致),事件驱动机制是Nodejs通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换,这意味着面对大规模的ht请求,Nodejs凭借事件驱动搞定一切,习惯了传统语言的网络服务开发人员可能对多线程并发和协作非常熟悉,但是面对Node」s,我们需要接受和理解它的特点。由此我们是否可以推测出这样的设计会导致负载的压力集中在CPU(事件循环处理?)而不是内存(还记得JaVa虚拟机抛出OutOMemory异常的日子吗?),眼见为实,不如来看看淘宝共享数Info据平台团队对Nodejs的性能测试:°物理机配置:RHEL52、CPU2.2GHz、内存4GNodejS,应用场景:MemCache代理,每次取100字节数据●连接池大小:50·并发用户数:100测试结果(socket模式):内存(30M)、QPS(16700)、CPU(95%)从上面的结果,我们可以看到在这样的测试场景下,qps能够达到16700次,内存仅占用30M(其中V8堆占用22M),CPU则达到95%,可能成为瓶颈。此外,还有不少实践者对Nodejs做了性能分析,总的来说,它的性能让人信服,也是受欢迎的重要原因。既然Node.js采用单进程、单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的Node」js如何利用多核CPU呢?创始人RyanDahl建议,运行多个Node.js进程,利用某些通信机制来协调各项任务目前,已经有不少第三方的Nodejs多进程支持模块发布,专栏后面的文章会详细讲述Nodejs在多核CPJ下的编程。Node.js的另一个特点是它支持的编程语言是Javascript。关于动态语言和静态语言的优缺点比较在这里不再展开讨论。只说三点:1.Javascript作为前端工程帅的主力语言,在技术社区中有相当的号召力。而且,随着Web技术的不断发展,特别是前端的重要性增加,不少前端工程师开始试水”后台应用“,在许多采用Node.js的企业中,工程师都表示因为习惯了Javascript,所以选择Nodejs2.Javascript的匿名函数和闭包特性非常适合事件驱动、异步编程,从helloworld例子中我们可以看到回调涵数采用了匿名函数的形式来实现,很方便。闭包的作用则更大,看下面的代码示例:varhostrequest=http.request(requestoptions,function(response)ivarresponseHTMl=iresponseon('data,function(chunk)iresponsehTMI=responseHTMIchunki});responseon(end,function()tconsole.log(responsehTMl);//dosomethinguseful
下载地址
用户评论