GraphQL - 应用组成部分
GraphQL - 应用组成部分
Section titled “GraphQL - 应用组成部分”典型的 GraphQL 应用在服务器端和客户端都包含几个协同工作的关键组成部分。理解这些组成部分对于构建和维护基于 GraphQL 的系统至关重要。
服务器端组成部分
Section titled “服务器端组成部分”服务器端负责定义 API 的能力并满足客户端请求。
| 组成部分 | 描述 |
|---|---|
| GraphQL Server Library | 提供用于解析查询、根据 Schema (模式) 进行验证以及协调 Resolver (解析器) 执行的核心引擎。流行的选择包括 Apollo Server (JavaScript/Node.js)、Hot Chocolate (.NET)、Ariadne/Graphene (Python)、graphql-java (Java)。 |
| Schema Definition | 你的 API 的蓝图,通常使用 GraphQL Schema Definition Language (SDL,模式定义语言) 编写(例如,在 .graphql 文件中或代码中的字符串)。它定义了客户端可用的 Types (类型)、Fields (字段)、Queries (查询)、Mutations (变更) 和 Subscriptions (订阅)。这是客户端和服务器之间的契约。 |
| Resolvers | 函数的集合,每个函数负责为 Schema 中的特定 Field (字段) 获取数据。Resolvers (解析器) 是 GraphQL Schema 和实际 Data Sources (数据源)(数据库、API 等)之间的桥梁。它们包含用于检索或修改数据的业务逻辑。 |
| Data Sources | 数据实际所在的后端。这可以是 SQL 数据库、NoSQL 数据库、REST API、其他 GraphQL 服务、gRPC 服务、平面文件,或它们的任意组合。Resolvers (解析器) 与这些数据源交互。 |
| Web Server Framework (Optional but common) | GraphQL 服务器库通常集成到标准的 Web 服务器框架中,例如 Express、Koa、Hapi (Node.js)、ASP.NET Core (.NET)、Django/Flask (Python),用于处理 HTTP 请求、路由、Middleware (中间件,如身份验证、日志记录) 等。 |
| Context | 为每个传入请求创建并传递给该请求的所有 Resolvers (解析器) 的对象。它用于共享请求特定的信息,如身份验证详情(例如,已登录用户)、用于 Batching (批量处理)/Caching (缓存) 的 Data Loaders (数据加载器),或数据库连接。 |
客户端组成部分
Section titled “客户端组成部分”客户端负责向服务器发送请求,并在用户界面中管理接收到的数据。
| 组成部分 | 描述 |
|---|---|
| GraphQL Client Library | 简化与 GraphQL API 的交互。处理构建请求、发送请求(通常通过 HTTP)、缓存响应以及将数据与 UI 框架集成。Apollo Client (JavaScript - React, Angular, Vue 等) 是最流行的。其他包括 Relay (React, 来自 Meta)、urql (JavaScript) 以及用于原生平台 (iOS/Android) 的库。 |
| GraphQL Queries/Mutations | 字符串(通常使用模板字面量如 gql 定义),指定客户端需要的确切数据或想要执行的修改。这些通常在 HTTP POST 请求的主体中发送。 |
| UI Framework/Library | 用于构建 User Interface (UI,用户界面) 的前端技术(例如,React、Vue、Angular、Svelte、原生 iOS/Android SDK)。GraphQL 客户端库与此框架集成以显示数据并触发更新。 |
| Caching Mechanism | 大多数 GraphQL 客户端库(如 Apollo Client 的 InMemoryCache)的关键部分。它在本地存储先前获取的数据,通常以规范化结构存储,允许客户端从 Cache (缓存) 提供数据,而不是发出冗余的网络请求。 |
| Developer Tools | 用于检查 GraphQL 请求/响应、探索 Schema (模式)、测试 Queries (查询)/Mutations (变更) 以及调试 Cache (缓存) 的浏览器扩展(如 Apollo Client DevTools)或独立工具(如 Apollo Sandbox、GraphiQL、Insomnia、Postman)。 |
典型的交互流程如下:
- 客户端应用(使用 UI 框架和 GraphQL 客户端库)需要数据来渲染组件。
- 它定义一个 GraphQL Query (查询),指定所需的 Fields (字段)。
- GraphQL 客户端库 将此查询(通常通过 HTTP POST)发送到 GraphQL Server Endpoint (服务器端点)。
- Web Server Framework (Web 服务器框架) 接收请求并将其传递给 GraphQL Server Library (GraphQL 服务器库)。
- GraphQL Server Library 解析查询并根据 Schema Definition (Schema 定义) 进行验证。
- 对于查询中的每个 Field (字段),服务器执行相应的 Resolver (解析器) 函数,并传递 Context (上下文) 对象。
- Resolvers (解析器) 与 Data Sources (数据源)(数据库、API)交互以获取或修改数据。
- 服务器将来自 Resolvers (解析器) 的结果组装成与查询结构匹配的 JSON 响应。
- 客户端库 接收响应。
- 它用新数据更新其 Cache (缓存)。
- 它将数据提供给 UI Component (UI 组件),后者重新渲染以显示信息。