FAQ:最佳实践
FAQ:最佳实践
GraphQL 具有可扩展性吗?
可以,GraphQL 在设计上就是可扩展的,并且已被许多公司用于生产环境中的高负载场景。
GraphQL 自带一些内建的性能提升,可提供帮助。但一旦将其投入生产,你仍需要负责跨实例扩展和性能监控。
GraphQL 支持离线使用吗?
不支持,或者至少原生不支持。但有一些 GraphQL 客户端可以让你构建离线优先的应用。这些客户端会使用专为离线数据操作而设计的功能,例如缓存和 Service Worker。
你可以在我们的 Code 页面找到多种语言的 GraphQL 客户端列表。
GraphQL 在安全方面有哪些顾虑?
大多数与 GraphQL 相关的安全顾虑,对任何 API 或服务来说都很常见。例如:SQL 注入、拒绝服务(DoS)攻击,或者有人滥用有缺陷的认证机制。但也存在一些 GraphQL 特有的攻击。例如,批量攻击(batching attacks)。这类攻击之所以可能发生,是因为 GraphQL 允许你在单个网络调用中批量执行多个查询(或对多个对象实例的请求)。
无论面对何种问题,主动防范都很重要。保护 GraphQL 服务器的方法有很多:使用超时、为查询设置最大深度,以及根据服务器完成查询所需的时间进行限流,都是可行的方案。
如需了解常见安全问题及其应对方法的概述,可以查看 How to GraphQL 的安全教程 以及 OWASP 的 GraphQL 速查表。
如何使用 GraphQL 设置授权?
我们建议在业务逻辑层强制实施授权行为。这样可以让授权拥有单一事实来源。
更详细的说明,请参阅我们的授权文档。
GraphQL 中的认证是如何工作的?
你可以使用常见模式来实现认证,例如 OAuth 或 JWT。GraphQL 规范本身对认证并没有特殊规定。
一些 GraphQL 库 也包含特定的认证协议。不过,如果你使用管道模型,我们建议将 GraphQL 放在所有认证中间件之后。
如果你使用 GraphQL.js 构建 API 服务器,我们提供了关于使用 Express 中间件处理认证的文档。
GraphQL 是否适合用于设计微服务架构?
可以。如果你要将 GraphQL 集成到微服务架构中,我们建议使用一个 GraphQL schema 作为 API 网关,而不是让客户端直接与多个 GraphQL 服务通信。这样,你既可以后端拆分为微服务,又能通过单个 API 将所有数据聚合到前端。
创建 API 网关的方法有很多。使用 GraphQL 的好处在于,你可以利用 缓存、请求预算以及查询调度规划等功能。
GraphQL 中的版本管理是如何工作的?
没有任何机制会阻止 GraphQL 服务像其他 REST API 一样进行版本管理。也就是说,GraphQL 在设计上会尽量避免版本管理。
相反,GraphQL 提供了一些工具,让你可以持续构建和演进 schema。例如,GraphQL 只返回显式请求的数据。这意味着你可以添加新功能(以及所有相关的类型和字段),而不会产生破坏性变更,也不会让现有查询的结果变得臃肿。
你可以在“最佳实践”部分阅读更多关于 GraphQL 中的版本管理机制的内容。
如何为我的 GraphQL API 编写文档?
GraphQL 的优势之一就是它天然是自文档化的。这意味着当你使用 GraphiQL 这样的交互式工具时,你可以查看 GraphQL API 暴露了哪些数据,包括字段、类型等。你还可以添加 description 字段,为端点提供补充说明。该字段支持字符串和 Markdown。
对很多人来说,这已经足够作为 API 参考文档。但它并不能减少对其他形式文档的需求。你可能仍然需要编写指南,解释这些通用概念如何与你的具体用例相关联。
帮助我们改进文档
发现翻译问题或内容错误?请告诉我们。
