# 架构简介

URL: https://caijiao.org/fastify/performance/architecture
Source: docs/fastify/performance/architecture.md
Description: 介绍 Fastify 的整体架构设计，展示其模块化、高性能、扩展性强的特点，并解释其如何通过插件机制与高效的请求处理模型提供支持。

[Fastify](/fastify/) 是一个高性能的 Node.js Web 框架，设计理念旨在提供快速、灵活、可扩展的 Web 应用开发体验。其架构设计充分考虑了性能、可扩展性和易用性，采用了现代化的开发方式。

## 1. 快速响应

[Fastify](/fastify/) 从架构设计之初就注重于提供低延迟的请求处理。其请求生命周期通过高效的异步模型和钩子机制实现，以确保请求能以最小的开销得到处理。

### 请求生命周期

Fastify 的请求生命周期包括多个阶段，每个阶段都可以通过钩子进行扩展或修改。主要的生命周期阶段如下：

- **onRequest**：请求到达时触发，在处理之前进行初步操作。
- **preHandler**：在路由处理器执行前触发，可以用来做请求验证、权限校验等操作。
- **handler**：最终的路由处理器，处理业务逻辑并返回响应。
- **onResponse**：响应即将发送前触发，可以用来修改响应内容或执行日志记录等操作。

通过这种设计，Fastify 可以精细控制每个请求的处理流程，同时保持高效性。

## 2. 插件机制

Fastify 采用了插件化架构，所有功能都可以通过插件进行扩展。插件可以注册路由、处理钩子、增加自定义逻辑等。插件的使用使得 Fastify 的功能非常模块化，能够根据需求按需加载。

- **内置插件**：Fastify 提供了一系列官方维护的插件，如 `@fastify/cors`、`@fastify/jwt` 等，涵盖了常见的功能需求。
- **社区插件**：Fastify 拥有庞大的社区插件生态，用户可以根据需求选择第三方插件进行使用，或者自行编写和发布插件。

插件的优点在于可重用性高、模块化好、降低了代码耦合性，便于扩展和维护。

## 3. 高效的 JSON 处理

Fastify 的 JSON 处理能力非常强大，尤其是在高并发场景下。默认情况下，Fastify 使用 `fast-json-stringify` 库进行 JSON 序列化，避免了使用标准 JSON.stringify 方法的性能瓶颈。相较于其他框架，Fastify 在 JSON 序列化和反序列化方面有显著的性能优势。

## 4. 高度可定制的响应

Fastify 的响应处理非常灵活，支持自定义响应格式、响应头、状态码等。开发者可以通过装饰器和钩子灵活定制响应对象，例如：

- 修改响应状态码
- 动态生成响应头
- 支持流式响应

这种设计使得 Fastify 在处理不同类型的请求时能够提供更多定制化选项，适应复杂的应用场景。

## 5. 异步编程支持

Fastify 原生支持异步编程模型，所有的请求处理函数、钩子和插件都可以使用异步函数。这使得 Fastify 在 I/O 密集型的场景下，能够充分发挥异步操作的优势，避免阻塞。

## 6. 请求和响应装饰器

Fastify 提供了装饰器机制，允许开发者在请求或响应对象上增加自定义属性或方法。这种方式增强了应用的扩展性，且不影响原始对象的功能。

例如，开发者可以在请求对象上添加额外的数据：

```js
fastify.decorateRequest('user', null);
```

## 7. 高效的路由系统

Fastify 的路由系统采用了基于前缀的路由匹配方式，能够高效地处理大量路由。通过对路由的预编译和索引，Fastify 能够保证在处理每个请求时，查找匹配路由的速度非常快。

## 8. 默认启用 HTTP2 支持

Fastify 默认支持 HTTP2，这使得其在性能和并发处理能力上具有优势。HTTP2 相比传统的 HTTP1.1 协议，能够更有效地复用连接，减少请求延迟，提高吞吐量。

## 总结

Fastify 的架构设计充分考虑了性能、可扩展性和灵活性。通过高效的请求生命周期、插件机制、异步编程支持和优秀的 JSON 处理能力，Fastify 能够为开发者提供一个快速、模块化且易于扩展的开发环境。无论是在简单的应用还是在复杂的高并发场景中，Fastify 都能提供出色的性能和灵活的定制选项，是构建现代 Web 应用的理想框架。
