发展历史初步Node.js(一):什么是Node.js(转贴)

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

 

【编者按】:Node.js打2009年出生至今天,已经提高了少数年富,其成长的快慢显然。从以github的访问量过Rails,到去年底Node.jsS创始人Ryan
Dalh加盟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++语言编写而变成,是一个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.js

Node.js采用了Google
Chrome浏览器的V8引擎,性能非常好,同时还提供了众多系统级的API,如文件操作、网络编程等。浏览器端的Javascript代码在运转时见面受各种安全性的克,对客户系统的操作简单。相比之下,Node.js则是一个两全的后台运行时,为Javascript提供了别样语言会实现的不在少数效应。

Node.js采用事件驱动、异步编程,为网络服务而规划

相关厂商内容

性优化最佳实践经验谈

超级App的实时性能监控与性能优化履

微信图片视频背后的EB级存储引擎计划

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

如何开发一个商业智能推荐系统?

 

连锁赞助商

发展历史 1

ArchSummit深圳2017,7月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呢?创始人Ryan
Dahl建议,运行多个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发展简史

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只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)联系。

发表评论

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