创始人:Ryan Dahl
运行时引擎 :Google V8开源
JavaScript语言编写 原因:单线程异步
最大的优势是借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务,通过模块化的JavaScript代码,加上函数式编程,并且无需考虑浏览器兼容性问题,直接使用最新的ECMAScript 6标准,可以完全满足工程上的需求。
优点:
1.采用事件驱动,异步编程,为网络服务而设计
2.node.js异步非阻塞模式的IO处理给node.js带来 在相对较低的资源消耗下 高性能与出众的负载能力
3.node.js轻量高效 时数据密集型实时应用系统的完美解决方法
4.适合前段工程师上手
缺点:
1.单线程,单进程 单核cup 不能充分利用多核cpu服务器
2.对程序员要求高 一旦进程崩溃 整个web服务器就会崩溃
3.不适合做复杂性很高的运算
4.Nodejs的社区在壮大,不仅包的数量在快速增加,而且包的质量也要明显好于其他语言的。
解决方案
1.多进程绑定同一个端口 进程间发送 '文件句柄' 功能
2. 多进程绑定不同端口, 反向代理服务器 Nginx 做负载代理 引入间接层
关于'文本句柄':
Linux系统中 ,每当进程打开一个文件时,系统就会为其分配一个唯一的整形文本描述符,用来标识这个文件.标准输入,标准输出,标准错误 flie结构指针表示是哪个文本描述符 0,1,2
关于 同步-异步-阻塞-非阻塞:
同步包括 阻塞 非阻塞, 异步 只有非阻塞
阻塞:调用之后一定要等到系统内核层面完成所有事件操作后, 调用才结束.
非阻塞:非阻塞 I/O 和阻塞 I/O 的差别为调用之后会立即返回.
同步 :在未返回结果前一直请求 直到有了返回结果,期间做不了别的事情 (read)(select 进程短暂阻塞)(epoll事情提交后休眠 结果产生后唤醒)
异步:触发事件后可以做别的事情,事情完成通知你
请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
Node.js事件循环机制:
http://www.tuicool.com/articles/3QBRzm
从事件循环开始 javaScript是函数式编程,异步调用回调函数,在回调函数(可能会有emit事件 IO请求等)中注册回调函数,回调函数中因为可能会有其他的事件,所以可能不会先去执行.
打开某个东西 首先要于其建立链接
事件循环 会检测队列还有没有未处理的事件,如果没有则会结束程序
一个 JavaScript 运行时包含了一个待处理的消息队列。每一个消息都与一个函数相关联。当栈为空时,从队列中取出一个消息进行处理。这个处理过程包含了调用与这个消息相关联的函数(以及因而创建了一个初始堆栈帧)。当栈再次为空的时候,也就意味着消息处理结束。
Node.js架构:
Node.js是一个基于Chrome V8引擎的javascript的运行环境,其使用了事件驱动,非阻塞I/O模型,非常轻便高效
主要分为三层,应用app >> V8及node内置架构 >> 操作系统. V8是node运行的环境,可以理解为node虚拟机.node内置架构又可分为三层: 核心模块(javascript实现) >> c++绑定 >> libuv + CAes + http.