GraphQL 常见问题
本文将回答关于GraphQL 的常见问题,按照在 GraphQL 采纳时间线中的各个阶段组织。
1. 学习 GraphQL
您刚开始使用GraphQL。您正在学习语法、运行查询、Schema 以及如何将现有服务连接到 GraphQL 层。
什么是 GraphQL?
GraphQL是一种用于查询数据的语言。与大多数查询语言(如 SQL)不同,您不使用 GraphQL 来查询特定类型的数据库(如 MySQL 数据库)。相反,您使用 GraphQL 来查询来自任何数量的不同来源的数据。
💡 提示
请访问 graphql.com来了解更多关于 GraphQL 的基础知识。
在GraphQL中,客户端(如 Web 应用程序)不需要知道包含所需信息的数据存储。相反,客户端将查询发送到您的GraphQL 服务器(通常是 HTTP 上),然后从适当的数据存储中检索数据。
以下是一个示例查询:
# Fetches a list of Book objects, each with a title and authorquery GetBooks {books {titleauthor}}
您的 GraphQL 服务器 定义了一个强类型 模式,用以描述客户端可以查询的数据。客户端执行符合此模式结构的查询。
以下是一个支持上述示例查询的 GraphQL 模式 示例:
type Book {title: Stringauthor: Stringisbn: String}# The root fields of a query are always fields of the special# Query type. These root fields are also called "entry points"# into your schema.type Query {# Returns a list of Book objectsbooks: [Book]}
💡 提示
注意,上述示例查询没有获取这里定义的 isbn
字段。它不需要! GraphQL 允许客户端准确地查询他们需要的字段,无需开销。
您的 GraphQL 服务器 使用一组特殊函数,称为 解析器,每个解析器都知道如何通过与不同的 数据源(数据库、REST API 等)通信来为特定的模式字段填充数据。当查询完全解析时,您的服务器将结果响应当前端,这符合查询的结构:
{"data": {"books": [{"title": "The Awakening","author": "Kate Chopin"},{"title": "City of Glass","author": "Paul Auster"}]}}
为什么使用 GraphQL?
GraphQL可以提升开发的几乎每一个方面:从通过优质的工具提高开发者体验,到通过减少包的大小提高客户端性能。阅读更多关于 GraphQL 的益处。
在哪里可以学习 GraphQL?
Apollo 的学习平台Odyssey,提供了实用的、动手实践的课程,帮助您使用 Apollo 技术学习 GraphQL。
本文档还包含每个平台组件的入门内容
要了解核心 GraphQL概念,请查看 graphql.org。
要了解 Apollo 开发者和更大的 GraphQL 社区的技术 GraphQL 内容,请查看 Apollo 博客。
如何在线托管我的 GraphQL 服务器?
GraphQL 服务器 是使用 Apollo Server 制作的,可以被部署到任何支持 Node.js 项目的环境中。Apollo Server 还可以集成到 无服务器 部署环境中,例如 AWS Lambda。
以下提供了部署指南
如何将客户端应用程序连接到我的模式?
Apollo 平台有可供使用的工具,几乎可以将任何类型的客户端连接到您的模式
- Apollo Client 用于 JavaScript 客户端
- Apollo iOS 用于原生 iOS 客户端
- Apollo Android 用于原生 Android 客户端
对于 Apollo Client 项目,还有许多视图层集成,可以在 React、Vue、和 Angular 中轻松查询 GraphQL 模式。
2. 构建原型
您理解 GraphQL 的工作原理及其带来的优点。您正在尝试为您或您的公司创建一个原型,以测试 GraphQL 在生产环境中的实用性。
我应该使用哪种语言来编写我的 GraphQL 服务器?
大多数流行的语言都有 GraphQL 服务器工具,但鉴于 JavaScript 中开发的 GraphQL 工具生态系统,我们建议使用 Apollo Server(Node.js),因为 Node 服务器几乎可以在任何地方运行,包括边缘。
我如何包裹现有的 API?
GraphQL 的优点之一是它与现有 API 交互得非常好。可以将任何数量的现有服务连接到您的模式。
最常见的数据源是 REST API。RESTDataSource
类与 Apollo Server 集成,简化了现有 REST API 的获取和缓存。
然而,您可以将任何后端连接到模式。解析器 可以做任何事情,包括从 SDK 或 ORM 中获取数据。
如何设计模式?
应该以终端用户的需要来设计模式。与其在底层服务之后建模查询和类型,它们应该设计得尽可能简单。GraphQL 的解析器结构可以使我们允许这种灵活性而没有太多性能上的影响。更多详情请参阅以查询驱动的模式设计。
如何发现和重现错误?
与任何服务一样,跟踪错误及其原因至关重要。在 GraphQL 实现中可能会发生许多种类的错误。其中一些包括服务错误,模式无法访问底层数据源,以及用户错误,用户在查询或突变中输入无效信息。
GraphQL 能应对一些这些错误。因为模式是严格类型的,您可以限制用户可以提供作为输入的数据类型,以及您的解析器可以返回的数据类型。这个类型系统捕获了许多错误,并且不需要手动检查。
对于由类型系统阻止的错误,了解确切查询和使用的变量会很有帮助。GraphOS Studio 是一个可以做到这一点的工具。它可以通过显示错误发生的确切条件来帮助发现和重现错误。
将特性迁移到 GraphQL
您已决定在生产环境中使用 GraphQL。您不想立即重构 API 或应用程序。您想将单个特性迁移至 GraphQL 以学习如何使用它并在生产中进行监控。
如何实现到 GraphQL 的过渡?
与任何大型变更一样,GraphQL 的采用应该是逐步的。GraphQL 允许团队保留现有的服务不变,并在其上方构建便捷的网关。
模式设计由谁负责?
当后端实现者和前端消费者共同协作设计时,GraphQL 模式效果最佳。虽然设计一个与底层 API 结构或数据库表相似的架构可能很诱人,但这可能降低 GraphQL 的有用性。
如何为我的 GraphQL 模式设置身份验证/授权?
身份验证和授权是在讨论任何 API 时都非常重要的主题。GraphQL 提供了对这些主题进行细粒度处理的方法。不过,别担心,如果 GraphQL 消费者中已经包含授权功能,可能完全忽略它。
如何保护我的模式免受恶意或昂贵的查询攻击?
任何类型的公共API都需要某种防止恶意查询的安全措施。由于 GraphQL 允许递归查询,创建一个过于复杂的 查询 并作为DoS攻击,即使是不经意间,也不算难。有多种方法可以防止这种情况发生,从限制复杂度到限制查询深度。阅读有关安全的 指南 以了解更多。
我应该设置哪些缓存?
GraphQL可以在多个位置进行缓存。
在客户端,缓存可以防止当已有本地数据时调用多个查询。与REST客户端缓存相比,GraphQL客户端缓存有一个显著优点:它可以处理从未被执行过的查询。这是由于GraphQL响应的规范化和存储方式。
例如,如果客户端请求一部电影的列表,每部电影将在客户端单独缓存。稍后,如果客户端在另一个 查询中请求单独的电影,并且所需的电影在缓存中,则不需要使用网络。这种规范化的缓存是 apollo-client 默认的一部分。
您还可以设置服务器端缓存,包括完整查询缓存、部分查询缓存和由CDN支持的缓存。这些可以降低响应时间,并使您的GraphQL服务器尽可能高效。
完整查询和CDN缓存对API处理多个相同查询最有用。这通常发生在公共数据上,如网站的页面内容。无论API是否用于公共数据,这些缓存通常都有很大的性能优势,强烈建议您查阅 服务器端缓存 了解使用Apollo Server的完整查询和CDN缓存。
部分查询缓存可以通过使用类似Redis或Memcache的产品缓存底层服务的响应来实现。使用这种策略,即使两个查询看起来完全不同,如果有数据重复,这些结果可以被共享,避免了不必要的流量。如果REST响应中存在适当的 RESTDataSource
会自动完成此操作。
如何监控GraphQL模式状态?
许多应用程序和网站几乎完全由某些API如GraphQL模式供电,因此确保API始终稳定至关重要。不健康服务的指标包括响应时间长、资源使用率高和不寻常的流量模式。
GraphOS Studio 是跟踪许多这些事物的出色工具。它允许您对 字段 进行近距离检查,使其易于看到总响应时间以及每个字段执行所花费的时间。
GraphOS Studio 还有一些集成,使监控变得更加容易。通知 可以提供每日报告,为团队提供对其模式健壮性的快速概述。Datadog 集成 与现有的 Datadog 帐户协作,以帮助团队跟踪方案性能。
4. 将产品迁移到 GraphQL
您已经很好地理解了如何在生产环境中编写、部署和监控 GraphQL。 您希望将 GraphQL 功能扩展到整个产品线。
如何组织模式代码以便扩展开大规模项目?
将所有模式代码集中在一起对于小型项目是合理的,但当一个项目达到一定规模,或者很多人共同在项目上工作,管理相同文件中的冲突和代码导航会变得困难。 将类型和解析器分裂成更小的文件可以使这个过程更容易。阅读这篇文章 了解更多。
如何测试我的客户端?
Apollo Client 为测试查询 GraphQL 服务器的客户端应用提供了所需的一切。 有关详细信息,请参阅 测试 React 组件。
如何安全地更改我的模式?
随着时间推移,模式自然演变。 GraphQL 模式比其他 API 更有弹性,但在支持新功能时,有时仍需要必要的破坏性更改。本部分 详释了哪些更改始终是安全的,哪些可能破坏现有客户端。
GraphQL GraphOS 的 模式检查 功能有助于您在做出更改之前发现可能破坏模式的变化。