长远浅出Node

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

 

【编者按】:Node.js从二〇〇九年落地至今,已经进化了两年有余,其成长的进程明显。从在github的访问量超越Rails,到二〇一八年终Node.jsS创办者RyanDalh加盟乔伊ent得到集团捐助,再到当年表露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++语言编写而成,是一个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则是一个完美的后台运行时,为Javascript提供了其余语言可以落实的浩大效能。

Node.js选择事件驱动、异步编程,为网络服务而陈设

有关厂商内容

性能优化最佳实践经验谈

一流App的实时性能监控与性能优化实践

微信图片摄像背后的EB级存储引擎安插

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

什么开发一个商业智能推荐系统?

 

相关赞助商

发展历史 1

ArchSummit深圳2017,九月7-8日,深圳·华裔城洲际酒馆,精粹内容当先看

 

事件驱动这么些词并不陌生,在一些传统语言的网络编程中,大家会用到回调函数,比如当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请求,服务器都回去一个头顶状态码为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格局):内存(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的另一个表征是它帮助的编程语言是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服务器并提供一套库。

二零零六年2月,RyanDahl在GitHub上揭橥了初期版本的有些Node.js包,随后几个月里,有人开头使用Node.js开发使用。

二零零六年2月和二零一零年四月,两届JSConf大会都配置了Node.js的讲座。

二零一零年年初,Node.js得到云总括服务商Joyent帮衬,创办人RyanDahl参加Joyent全职承担Node.js的进化。

2011年1三月,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个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的基本知识,包罗概念、特点、历史、案例等等。作为一个单单2岁的平台,Node.js的发展势头有目共睹,越多的商店上马关切并尝试Node.js,前后端开发人士应该明白有关的情节。

作者的微信公众号“老崔瞎编”,关怀IT趋势,承载前沿、深切、有热度的内容。感兴趣的读者可以搜索ID:laocuixiabian,或者扫描下方二维码加关心。

发展历史 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)联系。

发表评论

电子邮件地址不会被公开。 必填项已用*标注