Spring GraphQL 简介

工程 | Rossen Stoyanchev | 2021年7月6日 | ...

继 Spring GraphQL 项目发布公告和 1.0 里程碑版本发布之后,这篇博客文章旨在提供更多细节。

引言

如果您想开始使用,请访问我们的参考文档并阅读“Boot Starter”部分,或运行示例

如果您不太了解 GraphQL,有很多优秀的资源。您可以从graphql.org/learn开始。

根据 InfoQ 2020 年的架构趋势,GraphQL已被广泛采用,处于“早期大众”阶段。它提供了一种替代 REST API 的方法,更侧重于数据,并为客户端提供模式和查询语言。从客户端的角度来看,其吸引力在 JavaScript 状态的报告中清晰可见。您可以阅读GitHub 的案例,了解它为什么使用 GraphQL。

基础支持

正如 Andy Marek 在开篇博客中所写,Spring GraphQL 被设想为 GraphQL Java 团队的GraphQL Java Spring项目的继任者。这就是为什么我们合作的最初重点是匹配该功能以及以最佳方式集成 GraphQL Java 和 Spring。

为此,我们创建了以下基础支持:

  • HTTP 处理程序——适用于 Spring MVC 和 WebFlux,构建于WebMvcWebFlux 函数式端点 API。
  • WebSocket 处理程序——遵循协议来自graphql-ws,支持 GraphQL 订阅流。
  • Web 拦截——能够拦截每个 GraphQL 请求,检查 HTTP 头,并修改 GraphQL 的ExecutionInputExecutionResult
  • Boot 启动器——将所有内容整合到一个可运行的应用程序中。

除此之外,我们还开始关注安全、测试和指标等关键方面。

安全

GraphQL 端点的 URL 可以像往常一样轻松地进行保护。对于更细粒度的安全性,应用程序可以在数据检索方法上使用 Spring Security 注解。这需要 Spring Security 上下文传播到数据检索方法,虽然 GraphQL Java对线程是中性的,但执行中的组件本身可能是异步的,并可能导致线程切换。

这导致我们添加了对从 Web 框架级别、通过 GraphQL 引擎以及到数据获取组件的上下文传播的支持。这包括 Spring MVC 和 WebFlux 应用程序分别使用的ThreadLocal上下文和 ReactorContext。在这些功能到位后,Spring Security 就可以工作,而无需任何进一步的专门集成。

webmvc-httpwebflux-security示例演示了 Spring Security 的用法。

异常处理

Spring GraphQL 使应用程序能够创建多个独立的GraphQlExceptionResolver组件,以将异常解析为 GraphQL 错误,以便将其包含在 GraphQL 响应中。它还提供了一种ErrorType类型,默认情况下可用于使用常见的类别(例如BAD_REQUESTUNAUTHORIZEDFORBIDDENNOT_FOUNDINTERNAL_ERROR)对错误进行分类。

测试

您可以使用WebTestClient测试 GraphQL 请求,只需发送和接收 JSON 即可。但是,GraphQL 的特定细节使这种方法比应有的更繁琐。

这就是为什么 Spring GraphQL 包含WebGraphQlTester,它定义了测试 GraphQL 请求的工作流程。它提供了以下好处:

  • 验证 GraphQL 响应为 200 (OK)。
  • 验证响应中的“errors”键下没有意外错误。
  • 解码响应中“data”键下的内容。
  • 使用 JsonPath 解码响应的不同部分。
  • 测试订阅。

所有示例都使用GraphQlTester

指标

当存在启动器spring-boot-starter-actuator时,会收集 GraphQL 请求的指标,包括请求和DataFetcher执行计时器以及错误计数器。

Querydsl 集成

Querydsl 提供了一种灵活且类型安全的方法来表达查询谓词。Spring GraphQL 基于 Spring Data 的Querydsl 扩展,可以轻松创建 Querydsl 支持的DataFetcher。它根据 GraphQL 请求参数准备 Querydsl Predicate,并使用它来获取数据,这适用于 JPA、MongoDB 和 LDAP。

webmvc-http示例使用了 Querydsl。

模式优先与对象优先

GraphQL 提供了一种模式语言,可帮助客户端创建有效的请求,启用 GraphiQL UI 编辑器,促进团队之间的通用词汇表等等。它还带来了古老的模式优先与对象优先开发难题。

我们的观点是,应该优先采用模式优先开发。它促进了技术和非技术背景人员之间的沟通,有助于工具的使用,使跟踪更改更容易等等。GraphQL 模式和 Java 类型之间也没有一一对应的映射。

也就是说,也有空间进行代码生成,以便开始使用,让客户端创建查询等等。Netflix DGS 等框架对此提供了极好的支持,可以与 Spring GraphQL 一起使用。

路线图和反馈

我们计划在9月2日至3日的SpringOne之前发布第二个里程碑版本(M2)。我们已经根据早期反馈收到了许多M2 的问题,包括对 GraphQL 客户端的支持、BatchLoader 注册、文件上传等等。

里程碑阶段将持续到11月的 Spring Boot 2.6 发布之后,届时 Boot 启动器计划迁移到 Spring Boot 仓库,并包含在 Boot 2.7 中。

我们目标是在今年年底拥有稳定的 API 并进入 RC 阶段。为了达到这个目标,我们需要您的反馈。请尝试一下,并在我们的问题追踪器中创建问题或评论现有问题。

资源

有关 Spring GraphQL 功能的更多详细信息,请查看参考文档

GraphQL Java 和 Spring 团队将在今年的SpringOne 大会上联合发表演讲,这已经是连续第二年免费在线举办了。请注册参加我们的演讲,并与演讲者和与会者互动。

获取 Spring 简讯

关注 Spring 简讯

订阅

领先一步

VMware 提供培训和认证,帮助您快速提升技能。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部