Skip to content
Node性能如何进行监控以及优化?

Node作为一门服务端语言,性能方面尤为重要,其衡量指标一般有如下:

  • CPU

  • 内存

js
// /app/lib/memory.js
const os = require('os');
// 获取当前Node内存堆栈情况
const { rss, heapUsed, heapTotal } = process.memoryUsage();
// 获取系统空闲内存
const sysFree = os.freemem();
// 获取系统总内存
const sysTotal = os.totalmem();

module.exports = {
  memory: () => {
    return {
      sys: 1 - sysFree / sysTotal,  // 系统内存占用率
      heap: heapUsed / headTotal,   // Node堆内存占用率
      node: rss / sysTotal,         // Node占用系统内存的比例
    }
  }
}
  • I/O
  • 网络
如何实现jwt鉴权机制?说说你的思路

JWT(JSON Web Token),分成了三部分,头部(Header)、载荷(Payload)、签名(Signature),并以.进行拼接。其中头部和载荷都是以JSON格式存放数据,只是进行了Base64编码

  • header(声明使用的算法)
json
{  "alg": "HS256",  "typ": "JWT" }
  • payload(内容)
  • Signature(签名是对头部和载荷内容进行签名,一般情况,设置一个secretKey,对前两个的结果进行加密)
说说对Nodejs中的事件循环机制理解?

Node.js 的事件循环机制是其核心特性之一,它使得 Node.js 能够以非阻塞的方式处理 I/O 操作,从而实现高并发和高效能的服务器开发。以下是对 Node.js 中事件循环机制的理解:

1. 事件循环的概念

事件循环是 Node.js 中用于处理异步事件和回调函数的机制。它不断监视事件队列,一旦队列中有待处理的事件,就将其出队并执行相应的回调函数。

2. 事件循环的组成部分

  • 事件队列:存放待处理的事件和相应的回调函数。当异步操作完成时,其回调函数会被推入事件队列等待执行。
  • 事件循环:一个无限循环,不断从事件队列中取出事件并执行其回调函数。
  • 执行栈:用于同步执行 JavaScript 代码的地方。当调用一个函数时,它会被推入执行栈;当函数执行完成后,它会被从执行栈中弹出。

3. 工作原理

  • 当 Node.js 启动时,它会初始化事件循环和执行栈。
  • 当同步代码执行时,它会被推入执行栈并立即执行。
  • 当遇到异步操作时(如文件读取、网络请求等),Node.js 不会等待操作完成,而是立即继续执行后续代码或返回事件循环。
  • 当异步操作完成时,其回调函数会被推入事件队列。
  • 事件循环会不断检查执行栈是否为空。如果为空,则从事件队列中取出一个事件并执行其回调函数。回调函数执行时会被推入执行栈,执行完成后从执行栈中弹出。
  • 这个过程不断重复,形成了 Node.js 的事件循环。

4. 优点与注意事项

  • 优点:通过事件循环和非阻塞 I/O,Node.js 能够高效地处理大量并发请求,特别适用于 I/O 密集型应用。
  • 注意事项:由于 JavaScript 在 Node.js 中是单线程的,长时间的 CPU 计算任务会阻塞事件循环,影响性能。因此,对于 CPU 密集型任务,应考虑使用子进程或工作线程来处理。

5. 与其他技术的比较

  • 与传统的多线程模型相比,Node.js 的单线程事件循环模型减少了线程间通信和同步的开销,从而简化了编程模型并提高了性能。
  • 与其他异步编程模型(如回调、Promise、async/await)相比,事件循环是 Node.js 实现异步编程的基础机制。这些高级异步编程技术都是基于事件循环来工作的。

综上所述,Node.js 的事件循环机制是其实现高并发和高效能的关键所在。理解并掌握这一机制对于深入学习和应用 Node.js 具有重要意义。

Node. js 有哪些全局对象?

Node.js 中的全局对象主要包括以下几个:

  1. global 对象:在 Node.js 中,global 对象是一个全局可用的对象,它类似于浏览器环境中的 window 对象。global 对象作为全局变量的宿主,提供了在程序的任何地方访问全局变量的能力。所有全局变量(除了 global 本身以外)都是 global 对象的属性。
  2. process 对象process 对象是一个全局变量,提供了有关当前 Node.js 进程的信息和控制。通过 process 对象,我们可以处理命令行参数、获取环境变量、控制进程的行为等。它还包含了一些有用的方法,如 exit()(用于终止进程)和 nextTick()(用于在事件循环的当前迭代结束后执行回调)。
  3. console 对象console 对象用于在控制台输出信息。它提供了一系列的方法,如 log()error()warn() 等,用于在开发过程中进行调试和记录日志。
  4. __filename 和 __dirname:这两个是全局变量,而非对象。__filename 是一个包含当前执行脚本的完整文件路径的字符串,而 __dirname 是一个字符串,表示当前执行脚本所在的目录的绝对路径。这两个变量在需要引用文件或目录路径时非常有用。
  5. Buffer 类:虽然不是一个全局对象,但 Buffer 类在 Node.js 中也是全局可用的。它用于处理二进制数据,提供了在 TCP 流、文件系统操作、以及其他上下文中处理字节流的接口。
  6. setTimeout, setInterval, clearTimeout, clearInterval:这些函数也是全局可用的,用于在 Node.js 中设置和清除定时器。它们通常用于执行延迟操作或周期性任务。

这些全局对象和变量在 Node.js 程序中广泛使用,帮助开发者更方便地处理各种任务和操作。然而,为了避免命名冲突和提高代码的可读性和可维护性,建议将变量和函数定义在模块的作用域内,而不是直接使用全局作用域。

require 查找过程

在 Node.js 中,require 函数用于导入和执行 JavaScript 模块。当你使用 require 函数导入一个模块时,Node.js 会遵循一定的查找过程来找到并加载该模块。下面是 require 的查找过程的基本步骤:

  1. 核心模块:Node.js 首先检查导入的模块名是否为核心模块(如 fs, http, path 等)。如果是,Node.js 会直接从其内部核心模块中加载该模块,并返回导出的对象。

  2. 文件路径:如果导入的模块名不是核心模块,Node.js 会尝试将其解析为文件路径。它会检查相对路径或绝对路径,这取决于你提供的模块名。例如,如果你写 require('./myModule'),Node.js 会查找当前目录下的 myModule.js 文件。

  3. NODE_PATH:如果 Node.js 还没有找到模块,它会检查环境变量 NODE_PATH 中指定的目录。NODE_PATH 是一个由冒号分隔的目录列表,Node.js 会在这些目录中查找模块。

  4. node_modules 目录:如果上述步骤都没有找到模块,Node.js 会开始在当前模块的父目录(即包含当前执行脚本的目录)中查找 node_modules 目录。它会继续向上查找,直到找到根目录或找到所需的模块。这个过程被称为“模块解析”。

    • 首先,它会检查当前目录的 node_modules
    • 如果没有找到,它会向上检查父目录的 node_modules
    • 这个过程会一直持续,直到到达文件系统的根目录或找到所需的模块。
  5. 全局安装:如果你使用的是全局安装的 npm 包(例如通过 npm install -g packageName),并且该包没有遵循标准的 node_modules 查找路径,你可能需要确保 NODE_PATH 环境变量包含全局 node_modules 目录的路径。

  6. 抛出错误:如果经过上述所有步骤后,Node.js 仍然无法找到模块,它会抛出一个错误,告诉你无法找到指定的模块。

注意:Node.js 的模块查找机制基于其模块解析算法,该算法的具体实现可能会随着 Node.js 版本的更新而有所变化。因此,建议查阅最新的 Node.js 文档以获取最准确的信息。

koa 洋葱圈模型原理

Koa的洋葱圈模型原理是将请求和响应分别封装在一个对象中,然后通过一系列的中间件来处理这些对象。每个中间件都可以对请求和响应进行一些操作,然后将它们传递给下一个中间件。这个过程就像是一个洋葱圈,每个中间件都像是一个圈,请求和响应就像是在圈里面传递。

具体来说,在Koa中,中间件是一个函数,它接收两个参数:ctx和next。ctx是一个包含请求和响应的对象next是一个函数,用于将请求和响应传递给下一个中间件。中间件的执行顺序是按照它们被注册的顺序来执行的

在洋葱圈模型中,请求和响应都会通过一系列中间件。这些中间件会按照特定的顺序调用,直至最终的响应返回给客户端。每个中间件都可以进行某些操作,比如修改请求或响应的头部信息、记录请求信息、检查权限等等。

与传统中间件层不同,Koa的洋葱圈模型强调了一种更加优雅的代码结构。在一个Koa应用中,中间件可以按照任意顺序配置,甚至可以在运行时动态添加或删除中间件。

在处理过程中,Koa首先执行第一个中间件,该中间件对请求进行一些处理后,调用next()方法将请求和响应传递给下一个中间件。当第一个中间件调用next()方法时,Koa会依次执行后面的中间件。特别的是,Koa会在执行完每个中间件之后再一次回到前一个中间件,即从最后一个中间件开始,每次调用next()方法之后的控制权逐级返回回来,直到第一个中间件。最后,Koa会把处理后的响应返回给客户端。

总的来说,Koa的洋葱圈模型以其独特的中间件流程控制机制,提供了一种优雅、简洁的Web开发模式,使得开发人员可以用一种更加优美的方式来处理HTTP请求和响应。

Powered by VitePress.