领先一步
VMware 提供培训和认证,助您加速进步。
了解更多继 Spring GraphQL 项目宣布以及 1.0 里程碑版本发布后,这篇博客文章旨在提供更多详细信息。
如果你想开始使用,请前往我们的参考文档并阅读“Boot Starter”部分,或者运行示例。
如果你对 GraphQL 不太了解,有很多很好的资源。你可以从 graphql.org/learn 开始。
GraphQL 被 InfoQ 2020 年的“架构趋势”评为“早期大众”阶段,表明其被广泛采用。它为 REST API 提供了一种更侧重于数据、并为客户端提供模式(schema)和查询语言的替代方案。从客户端角度来看,其吸引力在 2020 年 JavaScript 状态报告中很明显。你可以阅读GitHub 的故事,了解其为何使用 GraphQL。
正如 Andy Marek 在开篇博客中所写,Spring GraphQL 被构想为 GraphQL Java 团队的GraphQL Java Spring 项目的后续。这就是为什么我们最初合作的重点是匹配该功能,并以最佳方式集成 GraphQL Java 和 Spring。
为此,我们创建了以下基础支持:
ExecutionInput 或 ExecutionResult。除此之外,我们还开始关注安全、测试和指标等关键方面。
GraphQL 端点的 URL 可以像往常一样轻松保护。要实现更精细的安全控制,应用程序可以在数据检索方法上使用 Spring Security 注解。这需要 Spring Security 上下文传播到数据检索方法,并且尽管 GraphQL Java对线程是中立的,但执行中的组件本身可能是异步的,并导致线程切换。
这促使我们增加了对从 Web 框架级别、通过 GraphQL 引擎到数据获取组件的上下文传播的支持。这包括分别适用于 Spring MVC 和 WebFlux 应用程序的 ThreadLocal 上下文和 Reactor Context。在这些功能到位后,Spring Security 就可以正常工作,无需任何进一步的专门集成。
webmvc-http 和 webflux-security 示例演示了 Spring Security 的使用。
Spring GraphQL 使应用程序能够创建多个独立的 GraphQlExceptionResolver 组件,将异常解析为 GraphQL 错误,以便包含在 GraphQL 响应中。它还提供了一个 ErrorType 类型,用于将错误分类为常见的类别,如默认的 BAD_REQUEST、UNAUTHORIZED、FORBIDDEN、NOT_FOUND 或 INTERNAL_ERROR。
你可以使用 WebTestClient 测试 GraphQL 请求,只需发送和接收 JSON。然而,GraphQL 的特定细节使得这种方法比预期的更麻烦。
这就是为什么 Spring GraphQL 包含 WebGraphQlTester,它定义了一个测试 GraphQL 请求的工作流程。它提供了以下好处:
所有示例都使用 GraphQlTester。
当存在 spring-boot-starter-actuator 启动器时,会收集 GraphQL 请求的指标,包括请求和 DataFetcher 执行计时器,以及一个错误计数器。
Querydsl 提供了一种灵活且类型安全的方法来表达查询谓词。Spring GraphQL 构建在 Spring Data Querydsl 扩展之上,可以轻松创建基于 Querydsl 的 DataFetcher。它从 GraphQL 请求参数准备一个 Querydsl Predicate,并使用它来获取数据,这适用于 JPA、MongoDB 和 LDAP。
webmvc-http 示例使用了 Querydsl。
GraphQL 提供了一种模式语言,可帮助客户端创建有效的请求,启用 GraphiQL UI 编辑器,促进团队之间的通用术语,等等。它还带来了古老的 schema-first 与 object-first 开发的困境。
我们的观点是,应优先考虑 schema-first 开发。它促进了技术和非技术背景的人们之间的交流,有助于工具化,使跟踪更改更容易,等等。GraphQL schema 和 Java 类型之间也没有一对一的映射。
话虽如此,代码生成也有其用武之地,例如用于入门、让客户端创建查询等。像 Netflix DGS 这样的框架对此提供了出色的支持,可以与 Spring GraphQL 一起使用。
我们计划在 SpringOne(9 月 2-3 日)之前发布第二个里程碑。我们已经从早期反馈中收集了许多M2 的问题,包括支持 GraphQL 客户端、BatchLoader 注册、文件上传等等。
里程碑阶段将持续到 11 月 Spring Boot 2.6 发布之后,届时 Boot 启动器将迁移到 Spring Boot 仓库,并包含在 Boot 2.7 中。
我们的目标是在今年晚些时候发布稳定 API 并进入 RC 阶段。要实现这一目标,我们需要您的反馈。请试用一下,并在我们的问题跟踪器上创建一个问题,或在现有问题下评论。
有关 Spring GraphQL 功能的更多详细信息,请参阅参考文档。
GraphQL Java 和 Spring 团队将在今年的SpringOne 大会(已连续第二年免费在线举办)上联合进行演讲。请注册参加我们的演讲,并与演讲者和与会者进行互动。