Node.js简介node
1.1 简介web
V8引擎自己就是用于Chrome浏览器的JS解释部分,可是Ryan Dahl鬼才般的把这个V8搬到了服务器上,用于作服务器的软件。数据库
Node.js是一个专一于实现高性能Web服务器优化的专家,几经探索,几经挫折后,遇到V8而诞生的项目。编程
Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触角伸到了服务器端,能够与PHP、JSP、Python、Ruby分庭抗礼。浏览器
但Node彷佛有点不一样:服务器
Node.js不是一种独立的语言,与PHP、JSP、Python、Ruby的“既是语言,也是平台”不一样,Node.js的使用JavaScript进行编程,运行在JavaScript引擎上(V8)。多线程
与PHP、JSP等相比(PHP、JSP、.net都须要运行在服务器程序上,Apache、Naginx、Tomcat、IIS。),Node.js跳过了Apache、Naginx、IIS等HTTP服务器,它本身不用建设在任何服务器软件之上。Node.js的许多设计理念与经典架构(LAMP = Linux + Apache + MySQL + PHP)有着很大的不一样,能够提供强大的伸缩能力。而且,Node.js没有web容器。架构
Node.js自身哲学,是花最小的硬件成本,追求更高的并发,更高的处理性能。并发
1.2 特色异步
Node.js使用了一个事件驱动、非阻塞式 I/O 的模型,这使他轻量又高效。
①单线程
在Java、PHP或者.net等服务器端语言中,会为每个客户端链接建立一个新的线程。而每一个线程须要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器能够同时链接的最大用户数为4000个左右。要让Web应用程序支持更多的用户,就须要增长服务器的数量,而Web应用程序的硬件成本固然就上升了。
Node.js不为每一个客户链接建立一个新的线程,而仅仅使用一个线程。当有用户链接了,就触发一个内部事件,经过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的。使用Node.js,一个8GB内存的服务器,能够同时处理超过4万用户的链接。
另外,带线程的带来的好处,还有操做系统彻底再也不有线程建立、销毁的时间开销。
坏处,就是一个用户形成了线程的崩溃,整个服务都崩溃了,其余人也崩溃了。
多线程、单线程的一个对比。
也就是说,单线程也能形成宏观上的“并发”。
②非阻塞I/O non-blocking I/O
例如,当在访问数据库取得数据的时候,须要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码以后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地下降了程序的执行效率。
因为Node.js中采用了非阻塞型I/O机制,所以在执行了访问数据库的代码以后,将当即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提升了程序的执行效率。
当某个I/O执行完毕时,将以事件的形式通知执行I/O操做的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。
阻塞模式下,一个线程只能处理一项任务,要想提升吞吐量必须经过多线程。而非阻塞模式下,一个线程永远在执行计算操做,这个线程的CPU核心利用率永远是100%。因此,这是一种特别有哲理的解决方案:与其人多,可是好多人闲着;还不如一我的玩命,往死里干活儿。
③事件驱动event-driven
在Node中,客户端请求创建链接,提交数据等行为,会触发相应的事件。在Node中,在一个时刻,只能执行一个事件回调函数,可是在执行一个事件回调函数的中途,能够转而处理其余事件(好比,又有新用户链接了),而后返回继续执行原事件的回调函数,这种处理机制,称为“事件环”机制。
Node.js底层是C++(V8也是C++写的)。底层代码中,近半数都用于事件队列、回调函数队列的构建。用事件驱动来完成服务器的任务调度,这是鬼才才能想到的。针尖上的舞蹈,用一个线程,担负起了处理很是多的任务的使命。
NodeJS基于这些特色的优点:
单线程,单线程的好处,减小了内存开销,操做系统的内存换页。
非阻塞I/O, 不会傻等I/O语句结束,而会执行后面的语句。
事件机制,事件环,不论是新用户的请求,仍是老用户的I/O完成,都将以事件方式加入事件环,等待调度。
NodeJS这三个特色是相辅相成的,单线程减小了内存的开销,至关于减小了硬件成本。同时,为了去适应单线程的特色,出现了非阻塞I/O机制,因此一个线程能够处理多个I/O。这时又出现了另外一个问题,当一个I/O正在执行时,另外一个I/O回调完成了该怎么办,因此有了事件驱动,事件机制就是全部的I/O都会在事件队列排队,当一个I/O回调完成会继续打回队列从新排队,避免产生冲突。
NodeJS的弊端一样很是明显,就是它只有一个线程,当这一个线程崩溃以后,就是整个服务器都崩溃了,可是我相信随着技术的发展和计算机硬件水平的提升NodeJS会愈来愈流行
1.3 适合开发什么?
Node.js适合用来开发什么样的应用程序呢?
善于I/O,不善于计算。由于Node.js最擅长的就是任务调度,若是业务有不少的CPU计算,实际上也至关于这个计算阻塞了这个单线程,就不适合Node开发。
当应用程序须要处理大量并发的I/O,而在向客户端发出响应以前,应用程序内部并不须要进行很是复杂的处理的时候,Node.js很是适合。Node.js也很是适合与web socket【1】配合,开发长链接的实时交互应用程序。
好比:
● 用户表单收集
● 考试系统
● 聊天室
● 图文直播
● 提供JSON的API
【1】WebSocket是HTML5规格中的一个很是重要的新特性,它的存在能够容许用户在浏览器中实现双向通讯,实现数据的及时推送,这个技术的意义在于咱们能够经过网页实现不少之前没法实现的应用。例如目前的在线聊天室,若是用户想要发送一句话,在他按下“发送”按钮的同时,浏览器会递送给目标服务器一个请求,而后服务器端会将这句话显示在网页上。而用户若是想要看到这句话,他须要刷新本身的浏览器以得到最新页面才能够。可是WebSocket的双向通讯就神奇与此,经过WebSocket技术构建的HTML5应用,用户再也不须要频繁的刷新页面以获取新数据,而新数据会自动由服务器端推送至用户的电脑屏幕上。
总结:
NodeJS是极客追求极致性能的产物,服务器健壮考量不够,因此不适合用来开发证券、银行、电信等可靠性需求高的业务中。
目前NodeJS在实战中的使用:
通常创业型公司用node开发核心业务
大型公司通常只用NodeJS开发某些业务的一部分,好比百度的表单提交、知乎的站内信等