早先Node.js(一):什么是Node.js(转贴)

以下内容转自:http://www.infoq.com/cn/articles/what-is-nodejs/
作者:崔康

 

【编者按】:Node.js从二〇〇九年出生于今,已经进化了两年有余,其成长的进度明显。从在github的访问量超过Rails,到二零一八年底Node.jsS开创者RyanDalh加盟Joyent获得集团捐助,再到当年公告Windows移植版本,Node.js的前景得到了技术社区的任天由命。InfoQ一贯在关怀Node.js的迈入,在当年的五回Qcon大会(法国巴黎站和拉脱维亚里加站)都有尤其的讲座。为了更好地推向Node.js在境内的技术推广,我们决定进行“浓厚浅出Node.js”专栏,邀约来自Node.js领域的布道师、开发职员、技术专家来讲述Node.js的外地点内容,让读者对Node.js有更深入的问询,并且能够主动投入到新技巧的议论和实行中。


专辑的率先篇作品《什么是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++语言编写而成,是1个Javascript的周转条件。为何选用C++语言呢?据Node.js开创者RyanDahl纪念,他早期梦想利用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.js

Node.js选取了谷歌(Google)Chrome浏览器的V8引擎,质量很好,同时还提供了许多系统级的API,如文件操作、网络编制程序等。浏览器端的Javascript代码在运营时会受到各个安全性的限量,对客户系统的操作简单。相比较之下,Node.js则是3个健全的后台运转时,为Javascript提供了任何语言能够达成的好多效果。

Node.js选拔事件驱动、异步编制程序,为网络服务而规划

连锁厂商内容

属性优化最佳实践经验谈

超级App的实时品质监察和控制与质量优化实践

微信图片录像背后的EB级存款和储蓄引擎安插

漏斗模型:京东物流系统高并发架构演进之路

哪些支付三个商业智能推荐系统?

 

相关赞助商

Node.js 1

ArchSummit费城2017,7月7-十七日,深圳·华裔城洲际酒馆,优异内容当先看

 

事件驱动那几个词并不生疏,在一些古板语言的互联网编制程序中,我们会用到回调函数,比如当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 = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(80, "127.0.0.1");

地方的代码搭建了一个简短的http服务器(运营示例安插在http://helloworld.cnodejs.net/中,读者能够访问),在当地监听80端口,对于随意的http请求,服务器都回来1个头顶状态码为200、Content-Type’值为text/plain’的”Hello
World“文字响应。从那么些小例子中,大家能够看看几点:

  • Node.js的互连网编制程序比较便于,提供的模块(在那里是http)开放了便于上手的API接口,短短几行代码就能够构建服务器。
  • 反映了事件驱动、异步编制程序,在createServer函数的参数中钦命了3个回调函数(选用Javascript的匿名函数实现),当有http请求发送过来时,Node.js就会调用该回调函数来处理请求并响应。当然,那几个例子相对不难,没有太多的事件注册,在之后的篇章中读者会看出越来越多的实际例子。

Node.js的特点

上边我们来说说Node.js的性状。事件驱动、异步编制程序的性状刚才已经详尽说过了,那里不再另行。

Node.js的属性不错。依据开创者RyanDahl的说法,品质是Node.js考虑的显要成分,采取C++和V8而不是Ruby只怕其余的虚拟机也是基于质量的指标。Node.js在规划上也是相比大胆,它以单进度、单线程情势运维(很吃惊,对啊?那和Javascript的周转方式一样),事件驱动机制是Node.js通过中间单线程高作用地爱护事件循环队列来完成的,没有二十四线程的财富占用和上下文切换,那象征面对广大的http请求,Node.js凭借事件驱动化解全体,习惯了观念语言的网络服务开发职员恐怕对二十多线程并发和合作十三分纯熟,但是面对Node.js,大家供给经受和掌握它的性情。因此我们是或不是能够想见出那般的统一筹划会造成负载的压力集中在CPU(事件循环处理?)而不是内部存款和储蓄器(还记得Java虚拟机抛出OutOfMemory相当的小日子呢?),眼见为实,不释迦牟尼探视天猫共享数据平台团队对Node.js的属性测试

  • 物理机配置:LX570HEL 5.② 、CPU 2.2GHz、内部存款和储蓄器4G
  • Node.js应用场景:MemCache代理,每一趟取100字节数据
  • 连接池大小:50
  • 并发用户数:100
  • 测试结果(socket方式):内部存储器(30M)、QPS(16700)、CPU(95%)

从地点的结果,大家能够看来在这样的测试场景下,qps能够实现16700次,内部存款和储蓄器仅占据30M(在那之中V8堆占用22M),CPU则达到95%,或许成为瓶颈。其它,还有好多实践者对Node.js做了品质分析,总的来说,它的性质令人服气,也是受欢迎的重中之重原由。既然Node.js接纳单进度、单线程方式,那么在于今多核硬件流行的条件中,单核质量特出的Node.js怎样采用多核CPU呢?开创者RyanDahl建议,运营多少个Node.js进度,利用某个通讯机制来协调各项任务。如今,已经有诸多第贰方的Node.js多进度帮助模块公布,专栏前面包车型大巴稿子会详细描述Node.js在多核CPU下的编制程序。

Node.js的另3个表征是它辅助的编制程序语言是Javascript。关于动态语言和静态语言的优缺点对比在那里不再展开研讨。只说三点:

var hostRequest = http.request(requestOptions,function(response) {
    var responseHTML ='';
    response.on('data', function (chunk) {
        responseHTML = responseHTML + chunk;
    });
    response.on('end',function(){
        console.log(responseHTML);
        // do something useful
   });
});

在上边的代码中,我们须要在end事件中处理responseHTML变量,由于Javascript的闭包性子,大家能够在多个回调函数之外定义responseHTML变量,然后在data事件对应的回调函数中穿梭修改其值,并最终在end事件中走访处理。

  1. Javascript作为前端工程师的新秀语言,在技能社区中有十分的号召力。而且,随着Web技术的不止向上,特别是前者的主要性扩展,不少前端工程师开端试水”后台应用“,在诸多接纳Node.js的合营社中,工程师都代表因为习惯了Javascript,所以接纳Node.js。
  2. Javascript的匿名函数和闭包天性万分适合事件驱动、异步编制程序,从helloworld例子中大家能够观察回调函数采取了匿名函数的格局来贯彻,很便宜。闭包的作用则更大,看下边包车型客车代码示例:
  3. Javascript在动态语言中质量较好,有开发职员对Javacript、Python、Ruby等动态语言做了质量分析,发现Javascript的质量要好于其余语言,再增进V8引擎也是同类的魁首,所以Node.js的习性也得益在那之中。

Node.js发展简史

贰零零玖年十二月,RyanDahl在博客上颁发准备依据V8成立叁个轻量级的Web服务器并提供一套库。

二〇〇八年一月,RyanDahl在GitHub上发布了早先时代版本的有的Node.js包,随后多少个月里,有人初叶应用Node.js开发应用。

二〇〇九年5月和二〇〇八年6月,两届JSConf大会都配备了Node.js的讲座。

2008年年终,Node.js获得云总计服务商乔伊ent帮衬,创办者RyanDahl到场Joyent专职负担Node.js的腾飞。

二零一三年8月,Node.js在微软的支撑下公布Windows版本。

Node.js应用案例

虽说Node.js诞生刚刚两年多,可是其发展势头渐渐赶上并超过Ruby/Rails,我们在此处列举了一些集团应用Node.js的案例,听听来自客户的声息。

在社交网站LinkedIn最新文告的位移应用中,NodeJS是该运动应用的后台基础。LinkedIn移动支付总经理KiranPrasad对传播媒介表示,其整个运动软件平台都由NodeJS创设而成:

Node.js,LinkedIn内部选拔了汪洋的技艺,可是在活动服务器这一块,大家完全遵照Node。

(使用它的来由)第③,是因为其灵活性。第三,若是你通晓Node,就会意识它最拿手的事情是与别的服务通讯。移动使用必须与大家的阳台API和数据库交互。大家从没做太多数据解析。相比较在此之前使用的Ruby
on
Rails技术,开发团队意识Node在品质方面加强广大。他们在每台物理机上跑了15个虚拟服务器(1多个实例),在那之中伍个实例即可处理双倍流量。体量评估基于负载测试的结果。

供销合作社社会化服务网站Yammer则选取Node成立了针对性其本人平台的跨域代理服务器,第①方的开发职员可以通过该服务器达成从本身域托管的Javascript代码与Yammer平台API的AJAX通讯。Yammer平台技术经理吉米帕特森对Node的亮点和瑕疵提议了祥和的看法

(优点)因为Node是基于事件驱动和无阻塞的,所以相当适合处理并发请求,因而塑造在Node上的代理服务器相比较别的技术完成(如Ruby)的服务器表现要好得多。其余,与Node代理服务器交互的客户端代码是由javascript语言编写的,由此客户端和劳动器端都用相同种语言编写,那是可怜了不起的事情。

(缺点)Node是叁个相对新的开源项目,所以不太平静,它总是一向在变,而且缺乏年足球够多的第1方库扶助。看起来,就像Ruby/Rails当年的规范。

天下闻明项目托管网站GitHub也尝尝了Node应用。该Node应用名叫NodeLoad,是三个存档下载服务器(每当你下载有些存款和储蓄分支的tarball也许zip文件时就会用到它)。GitHub此前的存档下载服务器采纳Ruby编写。在旧连串中,下载存档的乞请会创制多少个Resque任务。该任务实际在存档服务器上运维三个git
archive命令,从某些文件服务器中取出数据。然后,起首的伸手分配给你三个小型Ruby
Sinatra应用等待该任务。它实际上只是在检查memcache
flag是不是存在,然后再重定向到结尾的下载地址上。旧种类运作大约三个Sinatra实例和1个Resque
worker。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.js的基本知识,包蕴概念、特点、历史、案例等等。作为3个一味一岁的平台,Node.js的发展势头深入人心,更多的店堂起头关切并尝试Node.js,前后端开发职员应该明白有关的情节。

作者的微信公众号“老崔瞎编”,关心IT趋势,承载前沿、深刻、有热度的故事情节。感兴趣的读者可以搜索ID:laocuixiabian,只怕扫描下方二维码加关注。

Node.js 2

参考文献

[1] http://nodejs.org/

[2] http://beakkon.com/geek/node.js/why-node.js-single-thread-event-loop-javascript

[3] http://www.tbdata.org/archives/1285

[4] http://www.infoq.com/interviews/node-ryan-dahl

[5] http://www.infoq.com/cn/news/2011/08/enterprise-nodejs

[6] http://www.infoq.com/cn/news/2010/11/nodejs-joyent

[7] http://www.infoq.com/cn/news/2011/06/node-exe

[8] http://nodenode.com/post/1176414531/node-js-a-short-history

[9] http://www.infoq.com/cn/news/2011/05/nodeparty-hangzhou

【编者按】:本专栏欢迎有志于宣传和推广Node.js的布道师、开发人士和技巧专家投稿,有意者请通过邮件与本专栏主持人崔康(cuikang[at]infoq.com)联系。