Node.js 网络应用架构
Node.js 是一个基于 JavaScript 的平台,主要用于创建 I/O 密集型 Web 应用程序,例如聊天应用程序、多媒体流站点等。它基于 Google Chrome 的 V8 JavaScript 引擎构建。 Web 应用程序是在服务器上运行并由客户端浏览器呈现的软件,该客户端浏览器通过 Internet 访问应用程序的所有资源。
一个典型的 Web 应用程序由以下组件组成:
- 客户端:客户端是指通过发送请求与服务器交互的用户。
- 服务器:服务器负责接收客户端请求,执行适当的任务,并将结果返回给客户端。它充当前端和存储数据之间的桥梁,允许客户端对数据执行操作。
- 数据库:数据库是存储 Web 应用程序数据的地方。根据客户的请求,可以创建、修改和删除数据。
Node.js 服务器架构:为了管理多个并发客户端,Node.js 采用了“单线程事件循环”设计。 Node.js 处理模型中采用了基于 JavaScript 事件的模型和 JavaScript 回调机制。它采用了两个基本概念:
- 异步模型
- I/O 操作的非阻塞
这些特性增强了 Node.js Web 应用程序的可扩展性、性能和吞吐量。
Node.js 架构的组件:
- 请求:根据用户需要执行的操作,对服务器的请求可以是阻塞的(复杂的)或非阻塞的(简单的)。
- Node.js 服务器: Node.js 服务器接受用户请求,处理它们,并将结果返回给用户。
- 事件队列:事件队列的主要用途是存储传入的客户端请求,并按顺序将它们传递给事件循环。
- 线程池: Node.js 服务器中的线程池包含可用于执行处理请求所需的操作的线程。
- 事件循环:事件循环接收来自事件队列的请求并将响应发送给客户端。
- 外部资源:为了处理阻塞的客户端请求,使用了外部资源。它们可以是任何类型(计算、存储等)。
Nodejs 服务器的工作流程:
- 用户向服务器发送请求(阻塞或非阻塞)以执行操作。
- 请求首先在服务器端进入事件队列。
- 事件队列按顺序将请求传递给事件循环。事件循环检查请求的性质(阻塞或非阻塞)。
- 事件循环处理不需要外部资源的非阻塞请求,并将响应返回给相应的客户端
- 对于阻塞请求,将单个线程分配给进程以使用外部资源完成任务。
- 操作完成后,请求被重定向到事件循环,事件循环将响应返回给客户端。
优点:
- Node.js 服务器可以通过使用事件队列和线程池来有效地处理大量请求。
- 无需建立多个线程,因为 Event Loop 一次处理所有请求,因此单个线程就足够了。
- 向 Node.js 服务器提供请求的整个过程消耗更少的内存和服务器资源,因为一次处理一个请求。