Spring GraphQL与Netflix领域图服务框架集成


有两个相互竞争的GraphQL框架:

  • Netflix 于 2021 年初开源了域图服务 (DGS) 框架。此后,该框架在 Netflix 和许多其他公司中得到了广泛采用。DGS 框架为 Java 开发人员提供了基于 Spring Boot 的编程模型来创建 GraphQL 服务。
  • 在Netflix 开源 DGS 框架后不久, Spring 团队为 Spring Boot 开发 GraphQL 框架的工作。Spring GraphQL 项目当时处于早期阶段,提供了与graphql-java 的较低级别的集成。在过去的一年里,Spring GraphQL 已经成熟,并且大部分功能与 DGS 框架相当。

新用户必须在 DGS 框架和 Spring GraphQL 之间进行选择。

DGS 框架和 Spring GraphQL 都是在graphql-java之上设计的,graphql-java 是负责执行 GraphQL 查询的低级库。

  • 在 Netflix,数百个应用程序使用 DGS 框架和自定义工具与 Netflix 的指标、跟踪、安全等生态系统集成。
  • 从 Spring Boot 的角度来看,像 REST 一样随时提供 GraphQL 支持是有意义的,而不需要任何第三方框架。

DGS 框架
 DGS 框架高度模块化:

  1. 核心由 DGS API 及其注释组成,例如 @DgsComponent 和 @DgsQuery、DGS 查询执行器和 DGS 架构提供程序。 
  2. DGS 架构提供程序负责加载架构文件并使用graphql-java连接数据获取器。
  3. DGS 查询执行器通过调用graphql-java的执行引擎来执行查询。 DGS 查询执行器 API 也可以在您的测试中独立使用来执行 GraphQL 查询。

框架的网络层与核心完全分离:

  • WebMVC 和 WebFlux 模块接收 HTTP/Websocket 请求,解析响应,并使用 DGS 查询执行器执行查询。

与 Spring GraphQL 集成后,我们现在可以同时支持 DGS 和 Spring GraphQL 编程模型:

  • DGS Schema Provider 仍然负责连接 DGS Framework 和 Spring GraphQL 的数据获取器。
  • DGS 查询执行器委托给 Spring GraphQL 的执行引擎,并且仍然存在主要是为了保持测试的向后兼容性。
  • 最后,WebMVC/WebFlux 请求的处理完全由 Spring GraphQL 负责,并且不再使用 DGS 实现。

性能注意点:
使用 Spring GraphQL 的 HTTP 处理程序,我们已经隐式切换到异步请求处理。不幸的是,我们许多现有服务的代码没有明确的“AsyncAware”,导致由于多次执行过滤器而产生 CPU 开销。

为了保持当前框架的性能,我们禁用了异步请求处理,以便于采用。
如果需要,您可以使用配置属性启用异步请求处理。

集成了 Spring GraphQL 的 DGS 框架现在与我们的基准一样具有性能!

总结
随着DGS Framework 8.5.0的发布,我们的用户可以访问与 Spring GraphQL 的集成。
然这可能是集成的第一个版本,但我们花费了大量精力测试我们的应用程序,以确保我们有传统 DGS 的直接替代品。

通过引入新的 Spring Boot 启动器,用户可以选择加入 Spring GraphQL 集成。