乐趣区

关于spring:译Hello-Spring-GraphQL

前言

我很快乐地发表咱们新增了 Spring GraphQL 我的项目并且 1.0 公布的初始里程碑可用。该我的项目集成了 GraphQL Java 和 Spring,并在两个团队之间合作开发。

明天是 GraphQL Java 的 6 岁生日!我从一开始所做的一个根本决定是将任何 HTTP 和 IO 方面作为独自的思考。GraphQL Java 始终“只是”一个执行 GraphQL 申请的引擎。这个决定失去了回报,但显著的毛病是须要为理论应用创立本人的 HTTP 适配器。

这导致多年来为 Spring 创立了大量的 GraphQL 集成,包含来自 GraphQL Java 团队的 GraphQL Java Spring 我的项目。但坦率地说,我始终渴望一流的 Spring 集成。

一、介绍

如果您想开始应用,请转到咱们的 参考文档 并浏览“Boot Starter”局部, 或运行 samples。

如果您对 GraphQL 不太理解,这里有很多很好的资源。你能够从 graphql.org/learn 开始。

基于 InfoQ 2020 年 架构趋势,GraphQL 被 宽泛采纳 并处于“Early Majority”。它提供了一种更专一于数据的 REST API 的代替计划,并提供了一种模式和一种供客户端应用的查询语言。在这份 JavaScript 现状报告 中,从客户端的角度来看,这种吸引力是不言而喻的。你能够浏览 GitHub 的应用案例,理解它为什么应用 GraphQL。

二、根底反对

Spring GraphQL 被认为是 GraphQL Java 团队的 GraphQL Java Spring 我的项目的继承者。这就是为什么咱们最后的单干重点是匹配该性能以及以最佳形式集成 GraphQL Java 和 Spring。
为此,咱们创立了以下根底反对:

  • HTTP handlers – 可用于 Spring MVC 和 WebFlux,建设在 WebMvc 和 WebFlux 功能性端点 API。
  • WebSocket handlers – 来自 graphql-ws 的协定,反对 GraphQL 订阅流。
  • Web Interception – 可能拦挡每个 GraphQL 申请、查看 HTTP 标头以及批改 GraphQL ExecutionInput 或 ExecutionResult.
  • Boot starter – 将所有这些放在一个可运行的应用程序中。

除此之外,咱们开始钻研 security、测试和 metrics 等要害方面。

三、平安

GraphQL 端点的 URL 像平常一样易于爱护。为了取得更细粒度的安全性,应用程序能够在数据检索办法上应用 Spring 安全性正文。这须要 Spring 平安上下文流传到数据检索办法,尽管 graphqljava 与线程无关,但执行中的组件自身能够是异步的,并导致线程切换。

这使咱们可能通过 GraphQL 引擎,从 Web 框架级别向数据获取组件增加对上下文流传的反对。这别离包含 springmvc 和 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 申请的工作流。它有以下几点劣势:

  • 验证 GraphQL 响应是否正确 200 (OK).
  • 验证响应中“error”key 下的意外谬误。
  • 在响应中的“data”key 下解码。
  • 应用 JsonPath 对响应的不同局部进行解码。
  • 测试订阅。

所以的应用 GraphQlTester 的示例请见:samples。

六、Metrics 指标

当 spring-boot-starter-actuator 依赖存在时, 会收集 GraphQL 申请的指标, 包含申请和 DataFetcher 执行工夫以及谬误数。

七、Querydsl 集成

Querydsl 提供了一种灵便且类型平安的办法来表白查问谓词。Spring GraphQL 建设在 Spring Data Querydsl extension 之上,能够轻松创立由 Querydsl 反对的 DataFetcher。它从 GraphQ L 申请参数筹备一个 Querydsl Predicate,并应用它来获取数 据,这实用于 JPA、MongoDB 和 LDAP。

这个 webmvc-http 示例就是应用的 Querydsl。

八、Schema 优先与 Object 优先

GraphQL 提供了一种 schema 语言,能够帮忙客户机创立无效的申请、启用 GraphiQL UI 编辑器、跨团队晋升通用词汇表,等等。它还提出了古老的 schema vs object 优先的开发窘境。

咱们的观点是,应该首选 schema 优先开发。它有助于技术和非技术背景人员之间的沟通,有助于应用工具,更容易跟踪更改,等等。GraphQL schema 和 Java 类型之间也不须要一对一的强映射。

也就是说,代码生成、开始、客户端创立查问等也有空间。像 Netflix DGS 这样的框架对此有很好的反对,能够与 Spring GraphQL 一起应用。

九、Roadmap 和 Feedback

咱们打算在 9 月 2 日至 3 日的 SpringOne 之前实现第二个里程碑。从晚期的反馈中,咱们曾经在队列中发现了许多 M2 的问题,包含对 GraphQL 客户端的反对、BatchLoader 注册、文件上传等。

里程碑阶段将继续到 11 月 Spring Boot 2.6 之后,届时 Boot starter 打算移入 Spring Boot 存储库,以蕴含在 Boot 2.7 中。

咱们的指标是领有稳固的 API,并在往年晚些时候进入 RC 阶段。为此,咱们须要您的反馈。请尝试一下应用和创立 issues 或是在咱们的 issue tracker 中发表本人的见解。

十、资源

无关 Spring GraphQL 性能的更多细节, 请查看 参考文档 .
GraphQL Java 和 Spring 团队将在往年的 SpringOne 大会上联结展现,该大会将再次通过线上直播收费参加。请注册加入咱们的演讲并与演讲者和参会者互动。

译者说

咱们也会继续关注和应用 Spring GraphQL 和整个 Spring 生态。如有疑难,欢送与我交换,微信号:JAVA 架构日记。

退出移动版