主题
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 中的全局对象主要包括以下几个:
- global 对象:在 Node.js 中,
global
对象是一个全局可用的对象,它类似于浏览器环境中的window
对象。global
对象作为全局变量的宿主,提供了在程序的任何地方访问全局变量的能力。所有全局变量(除了global
本身以外)都是global
对象的属性。 - process 对象:
process
对象是一个全局变量,提供了有关当前 Node.js 进程的信息和控制。通过process
对象,我们可以处理命令行参数、获取环境变量、控制进程的行为等。它还包含了一些有用的方法,如exit()
(用于终止进程)和nextTick()
(用于在事件循环的当前迭代结束后执行回调)。 - console 对象:
console
对象用于在控制台输出信息。它提供了一系列的方法,如log()
、error()
、warn()
等,用于在开发过程中进行调试和记录日志。 - __filename 和 __dirname:这两个是全局变量,而非对象。
__filename
是一个包含当前执行脚本的完整文件路径的字符串,而__dirname
是一个字符串,表示当前执行脚本所在的目录的绝对路径。这两个变量在需要引用文件或目录路径时非常有用。 - Buffer 类:虽然不是一个全局对象,但
Buffer
类在 Node.js 中也是全局可用的。它用于处理二进制数据,提供了在 TCP 流、文件系统操作、以及其他上下文中处理字节流的接口。 - setTimeout, setInterval, clearTimeout, clearInterval:这些函数也是全局可用的,用于在 Node.js 中设置和清除定时器。它们通常用于执行延迟操作或周期性任务。
这些全局对象和变量在 Node.js 程序中广泛使用,帮助开发者更方便地处理各种任务和操作。然而,为了避免命名冲突和提高代码的可读性和可维护性,建议将变量和函数定义在模块的作用域内,而不是直接使用全局作用域。
require 查找过程
在 Node.js 中,require
函数用于导入和执行 JavaScript 模块。当你使用 require
函数导入一个模块时,Node.js 会遵循一定的查找过程来找到并加载该模块。下面是 require
的查找过程的基本步骤:
核心模块:Node.js 首先检查导入的模块名是否为核心模块(如
fs
,http
,path
等)。如果是,Node.js 会直接从其内部核心模块中加载该模块,并返回导出的对象。文件路径:如果导入的模块名不是核心模块,Node.js 会尝试将其解析为文件路径。它会检查相对路径或绝对路径,这取决于你提供的模块名。例如,如果你写
require('./myModule')
,Node.js 会查找当前目录下的myModule.js
文件。NODE_PATH:如果 Node.js 还没有找到模块,它会检查环境变量
NODE_PATH
中指定的目录。NODE_PATH
是一个由冒号分隔的目录列表,Node.js 会在这些目录中查找模块。node_modules 目录:如果上述步骤都没有找到模块,Node.js 会开始在当前模块的父目录(即包含当前执行脚本的目录)中查找
node_modules
目录。它会继续向上查找,直到找到根目录或找到所需的模块。这个过程被称为“模块解析”。- 首先,它会检查当前目录的
node_modules
。 - 如果没有找到,它会向上检查父目录的
node_modules
。 - 这个过程会一直持续,直到到达文件系统的根目录或找到所需的模块。
- 首先,它会检查当前目录的
全局安装:如果你使用的是全局安装的 npm 包(例如通过
npm install -g packageName
),并且该包没有遵循标准的node_modules
查找路径,你可能需要确保NODE_PATH
环境变量包含全局node_modules
目录的路径。抛出错误:如果经过上述所有步骤后,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请求和响应。