1.1 Node的诞生历程
①2009年5月,由Ryan Dahl在Github上发布最初版本
②2011年7月,Node在微软的支持下发布了Windows版本
③2011年11月,Node超越Ruby onRails,成为Github上关注度最高的项目(随后被Bootstrap项目超越,目前仍居第二)。
④2012年1月底,Ryan Dahl将掌门人身份转交给Isaac Z. Schlueter
⑤此后的发布计划主要集中在性能提升上
1.2 Node的命名与起源
Nodejs, NodeJS,Node.js, Node是一回事
1.2.1为什么是JavaScript
目标:写一个基于事件驱动,非阻塞I/O的Web服务器
结论:①C开发门槛高 ②Ryan Dahl对HasKell不熟
③Lua自身含有很多阻塞I/O库 ④Ruby虚拟机的性能不够好
JavaScript的优势:
①高性能 ②符合事件驱动 ③没有历史包袱
1.2.2为什么叫Node
易于扩展达成构建大型网络应用的目的,每个Node进程都构成这个网络应用中的一个节点。
1.3 Node给JavaScript带来的意义
Chrome浏览器和Node的组件构成
浏览器通过事件驱动来服务界面上的交互
Node通过事件驱动来服务I/O
在Node中,JavaScript可以
①随心所欲的访问本地文件
②搭建WebSocket服务器端
③连接数据库
④如Web Workers一样玩转多进程
node-webkit将Node中的事件循环和WebKit的事件循环融合在一起
桌面应用程序的开发可以完全通过HTML,CSS,JavaScript完成
1.4 Node的特点
保留了前端JavaScript中的接口,没有改写语言本身的任何特性
依旧基于作用域和原型链
1.4.1 异步I/O
经典的Ajax调用
经典的异步调用
异步的意义:
可进行并行I/O操作,无需等待之前的I/O调用结束,极大地提升效率
1.4.2 事件与回调函数
事件的编程方式的优势:轻量级,松耦合,只关注事务点
1.4.3单线程
Node保持了单线程的特点。在Node中,JavaScript与其余线程无法共享任何状态。
Advantage:
①不用在意状态的同步问题
②没有死锁存在
③没有线程上下文交换所带来的性能上的开销
Disadvantage:
①无法利用多核CPU
②错误会引起整个应用退出,应用的健壮性值得考验
③大量计算占用CPU导致无法继续调用异步I/O
在浏览器中,JavaScript与UI共用一个线程,JavaScript长时间执行会导致UI渲染和响应被中断;
在Node中,长时间CPU占用会导致后续异步I/O发不出调用,已完成的异步I/O的回调函数也会得不到及时执行
解决方案:
①最早是Google的Gears,它启用一个完全独立的进程,将需要计算的程序发送给这个进程,结果得出后,通过事件将结果传递回来
②HTML5定制的Web Workers标准,创建工作线程进行计算,通过消息传递的方式来传递运行结果,也使得工作线程不能访问到主线程中的UI
③Node采用与Web Workers相同的思路解决问题:child_process
通过Master-Worker的管理方式,来管理各个工作进程,以达到更高的健壮性
1.4.4 跨平台
起初Node只可以在Linux平台上运行,跨Windows平台需要通过Cygwin或者MinGW
后期在v0.6.0版本时基于libuv实现跨平台
Node基于libuv实现跨平台的架构示意图
Node的第三方C++模块也可以借助libuv实现跨平台
1.5 Node的应用场景
1.5.1 I/O密集型
Node面向网络且擅长并行I/O,能够有效地组织更多的硬件资源,提供更多好的服务,资源占用少
1.5.2 是否不擅长CPU密集型业务
V8深度性能优化
合理调度,充分利用CPU的两种方法:
①编写C/C++扩展的方式
②通过子进程的方式
1.5.3与遗留系统和平共处
互相结合,取长补短
1.5.4 分布式应用
阿里巴巴数据平台
1.6 Node的使用者
根据倚重点分类:
①前后端编程语言环境统一。
雅虎
②Node带来的高性能I/O用于实时应用。
Voxer,腾讯朋友网,花瓣网,蘑菇街等
③并行I/O使得使用者可以更高效地利用分布式环境。
阿里巴巴,eBay
④云计算平台提供Node支持。
微软Azure,阿里云,百度,Joyent
⑤游戏开发领域。
网易
⑥工具类应用。