Logan 如果前面还有路,答应我,跑下去...

Node.js入门-1-简介

2018-06-13
Logan

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…)
  • 跨平台打包工具

类似文章

留言