Node.js 前言
Node.js之父
Ryan Dahl : 2009年推出Node.js, 2012年退出Node.js, 转战Go语言
Node.js出现的背景
为了解决Web服务器的高并发性能问题
- 缩短客户端发送请求到服务端相应请求的时长
- 发送请求快一点 无法控制(客户端网速决定)
- 响应快一点可以控制(服务器带宽提高,CDN加速)
- 服务器处理请求任务快一点可以控制(优秀的程序员 / 多线程)
- 服务器从磁盘读取/写入数据到数据库快一点无法控制(磁盘的存取速度有上限)
- 要避免传统服务器运作流程中出现的I/O阻塞问题
- 事件驱动
- 异步I/O
V8引擎
什么是V8引擎
一款专门对JavaScript语言进行解释和执行的流程虚拟机
比如把V8引擎嵌入到浏览器中,那么我们写的JavaScript代码就会被浏览器所执行;如果把V8引擎嵌入到NodeJS环境下,那我我们写的JavaScript代码就会被服务器所执行
只要V8引擎能够嵌入到不同的宿主环境中,那么就可以用JavaScript语言来写各种不同领域的应用。-万能的JS
V8起初的作用
主要用于Chrome浏览器解析js脚本(比如发送HTTP请求给服务器,相应服务器端返回的HTTP请求)
V8引擎的优势
- 强大的编译和快速执行效率
- 性能非常好,它的执行效率远超Python,Ruby等其他脚本语言
- 历史包袱轻,没有同步I/O
- 强大的事件驱动机制
Node.js 简介
什么是Node.js
Node.js是一个让JavaScript运行在服务器端的开发平台
和其他后端语言的区别
- Node.js不是一种独立的语言
PHP等既是语言、也是平台 Node.js 使用JavaScript进行编程,运行平台是包装后的js引擎(V8)
- 轻量级架构
Node.js不用架设在任何服务器软件之上,用最小的硬件成本,达到更高的并发、更优的处理性能。没有web容器,安装配置完成之后,没有一个根目录。
Node.js的特点
1. 单线程
优势
减少了内存开销(操作系统完全不再有线程创建、销毁的时间开销)
在Java、PHP等服务器端语言中,会为每一个客户端链接创建一个新的线程,而每个线程需要耗费大约2MB内存,相当于有一个人就要分配一个线程,就要占用空间大小
Node.js: 当有用户连接了,就触发一个内部事件、通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上也是并行的。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。
Node.js不会为每个客户连接创建一个新的线程,而仅仅使用一个线程
劣势
- 如果某一个事情,进入了,但是被I/O阻塞了、整个线程就阻塞了
- 如果一个人把Node.js搞崩溃、全部崩溃
2. 非阻塞I/O (Non-blocking I/O)
基本概念
当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率,
Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。
当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断地检查有没有未处理的时间,依次予以处理。
阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程,而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。
3. 事件驱动 (Event Driven)
基本概念
不管是新用户的请求,还是老用户的I/O完成,都将以事件方式加入事件环,等待调度
Node.js 的应用方向
特点
- 善于I/O, 不善于计算
因为Node.js最擅长的就是任务调度,如果你的业务有很多的CPU计算,实际上也相当于这个计算阻塞了这个单线程,就不适合Node开发。
当应用程序需要处理大量并发的I/O,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,Node.js非常适合。Node.js也也非常适合与web socket配合,开发长连接的实时交互应用程序, - 天生异步
适用场景
- 网站开发(express/koa等)
- im即时聊天(socket.io)
- api(移动端、pc、h5)
- HTTP Proxy(淘宝、腾讯、百度都有)
- 前端构建工具(grunt/gulp/bower/webpack…)
- 跨平台打包工具