GraphQL 已成为构建 API 时 REST 最灵活的替代方案。您提供一个入口点,而不是多个固定端点,允许客户准确选择他们需要的数据。这种方法带来了效率提升,但也需要模式设计的纪律和对性能的关注。
为什么选择 GraphQL?
- 按需查询,客户端指定字段和关系,避免过度获取和不足获取。
- 强类型,模式定义了清晰的类型,允许在编译时自动完成和验证。
- 无需破坏性更改即可演进,可以将新字段添加到架构中,而不会影响现有客户。
GraphQL API 的主要组件
- Schema,定义类型、查询、突变和订阅。
- 解析器,为模式中每个字段提供数据的函数。
- 数据源、解析器参考的数据库、外部服务或缓存。
- 中间件、身份验证层、日志记录和速率限制控制。
架构设计最佳实践
- 首先对域进行建模,首先描述主要实体(例如:2、3、4)。
- 避免深层嵌套字段,2-3级限制避免昂贵的查询并促进缓存。
- 使用标量类型和枚举,标准化值,例如556677)。
- 文档字段,包括架构中的描述;它们出现在自动文档中。
- 单独的查询和突变,保持阅读和写作清晰地区分。
极简架构示例 (TypeScript),3 行
0
这个片段说明了语法;完整的模式将有数十种类型。
绩效策略
- 批处理和 DataLoader,将对银行的多个请求分组到单个 8 中。
- 字段级缓存,存储幂等解析器的结果(例如用户配置文件)。
- 持久化查询,预编译查询并仅发送一个哈希值,从而减少负载大小。
- 限制深度,使用拒绝深度过大的查询的插件。
- 基于光标的分页,在大表中避免使用9;使用10/11。
DataLoader 示例(2 行)
1
DataLoader 对数据库的调用进行分组,减少查询次数。
高级模式
- Schema Stitching,将多个独立的schema组合成统一的网关。
- 联合(Apollo),将解析器委托给专门的服务,维护单一模式。
- 通过 WebSocket 订阅,向客户提供实时更新。
- 按字段授权,解析器在返回敏感数据之前检查权限。
部署清单
- 定义具有清晰类型和描述的模式。
- 实现 DataLoader 以避免 N+1 查询。
- 配置深度限制(例如:5 个级别)。
- 启用幂等解析器的缓存。
- 为关键端点创建持久查询。
- 在大型集合中测试基于光标的分页。
- 使用 GraphQL Playground 或 Apollo Studio 记录 API。
结论
GraphQL 提供强大的功能和灵活性,但需要仔细的模式设计并关注性能。通过应用所描述的最佳实践、领域建模、批处理、缓存和深度限制,您可以构建强大的 API,可以在不中断的情况下扩展和发展。
您对 GraphQL 的体验如何?在评论中分享!
另请阅读
- [GraphQL 应用程序:实施指南13
- [GraphQL应用:真实案例的成本和定价14
- [应用程序API15
- [应用后端:架构、技术和最佳实践16
- [应用程序后端 - 扩展的良好实践17
- [应用程序后端 - 初创公司的良好实践18
