Node.js 技术架构简述

Node.js 不是什么?

  • Node.js 不是Web后端框架,不能与 Spring 和 Flask 相比
  • Node.js 不是编程语言,不能与 Python 和 PHP 相比

Node.js 是什么?Wiki

  • Node.js 是一个平台javascript

    • 它组合多种技术
    • 它让 JavaScript 也能调用系统接口,开发后端应用
  • Node.js 用到了哪些技术java

    V8 引擎libuv、C/C++ 实现的 c-ares(DNS解析)、http-parser(HTTP 解析)、OpenSSL(HTTPS)、zlib(压缩) 等库。node

    若是对源码实现感兴趣,推荐查看:git

    Node.js v0.10 (代码量较少,适合阅读)github

    Node.js 源码分析编程

Node.js 技术架构

Node.js 技术架构如图所示,下面简单介绍一下它们的做用后端

bindings

假如 C/C++ 实现了一个 xxx 库,很好用,JS 没法直接调用它。Node.js 用 C++ 对其进行了封装,使它符合某些要求。封装的文件叫 xxx_bindings.cpp,而后使用 Node.js 编译为 .node 文件(并非惟一的方式,也有其余方法),而后 JS 能够直接 require 这个文件,binding 文件就是 JS 和 C/C++ 库中间的桥梁,而 Node.js 提供了不少 binding,因此加个 s,也就是 bindingsapi

libuv

一个跨平台的异步 I/O 库,会根据系统自动选择合适的方案网络

用于 TCP / UDP / DNS / 文件等异步操做多线程

I/O 是什么?

全部输入输出都属于I/O,例如文件读写、访问网络、发送接收文件等

V8

功能
  • 将 JS 源码变成本地代码执行
  • 维护调用栈,确保 JS 函数的执行顺序
  • 内存管理
  • 垃圾回收,重复利用无用的内存
  • 实现 JS 的标准库
注意
  • V8 不提供 DOM API
  • V8 执行 JS 是单线程
  • 能够开启两个线程分别执行 JS
  • V8 自己是多线程
  • V8 自带 event loop 可是 Node.js 基于 libuv 本身作了一个

简单说一下 Event Loop:

Event(事件)

计时器到期、文件可读、文件读取出错、socket有内容了、socket 关闭了,这些都是Event

Loop(循环)

事件是有优先级的,例如:

setTimeout(f1,100)
fs.readFile('/1.txt',f2)
server.on('close',f3)
复制代码

这上面的三个事件若是同时发生,确定是会有一个执行优先级的规则(人为规定)的,而 Node.js会按照这个规则轮询事件,如 1->2->3->1->2->3

Event Loop

推荐阅读:Event Loop、计时器、nextTick-方应杭

操做系统触发事件,JS 处理事件,Event Loop 就是对事件处理顺序的管理

执行顺序

重点:

  • timer检查定时器
  • poll 轮询,检查系统事件
  • check 检查 setImmediate 回调
  • 其余阶段不多使用

大部分时间,Node.js 都停在 poll 轮询阶段。大部分事件也都在 poll 阶段被处理,如文件、网络请求。

setTimeout(f1,0) 
setImmediate(f2)
// 上方代码大部分时间是 setImmediate 先执行
// 由于大部分时间 Node.js 停留在 poll 阶段
// 前往 timer 阶段须要先通过 check 阶段
// 会先执行 setImmediate 回调
复制代码

总结

  • 用 libuv 进行异步 I/O 操做
  • 用 event loop 管理事件处理顺序
  • 用 C/C++ 库高效处理 DNS/HTTP...
  • 用 bindings 让 JS 能和 C/C++ 沟通
  • 用 V8 运行 JS
  • 用 Node.js 标准库简化 JS 代码
  • 这就是 Node.js

Node.js API

Node.js API 是 Node.js 对外开放用来调用上述功能进行的应用接口,须要使用时可自行查看文档

文档地址:英文 中文

相关文章
相关标签/搜索