Netflix已经开发开源了 Domain Graph Service (DGS) framework。DGS框架简化了针对独立和联合GraphQL服务的GraphQL的实现。
通过开源项目,希望为Java和GraphQL社区做出贡献,并向每个将使用该框架使之变得更好的人学习并与之合作。
DGS框架的主要功能包括:
- 基于注释的Spring Boot编程模型
- 用于将查询测试编写为单元测试的测试框架
- Gradle代码生成插件,可从GraphQL模式创建Java / Kotlin类型
- 与GraphQL Federation轻松集成
- 与Spring Security集成
- GraphQL订阅(WebSocket和SSE)
- 文件上传
- 错误处理
- 自动支持界面/工会类型
- Java的GraphQL客户端
- 可插拔仪器
为什么Netflix需要DGS框架
我们在Spring Boot之上创建了我们的框架,它利用了graphql-java库。该框架最初仅旨在内部使用,着重于与Netflix生态系统集成以进行跟踪,日志记录,指标等。但是,始终将框架适当模块化始终是首要任务。很明显,我们构建的许多框架实际上并不是特定于Netflix的。该框架主要只是构建GraphQL服务(独立和联合)的一种简便方法。
模式schema优先于开发
GraphQL模式schema根据查询和突变操作以及相关的类型和字段来描述API。API用户可以精确指定要在查询中检索的字段,从而使GraphQL API非常灵活。模式使GraphQL如此强大并与REST不同。
GraphQL开发有两种不同的方法:模式优先和代码优先的开发。通过进行模式架构优先的开发,您可以使用GraphQL架构语言手动定义API的架构。服务中的代码仅实现此架构。
使用代码优先开发,您没有架构文件。而是在运行时根据代码中的定义生成模式。
我们的框架支持模式优先和代码优先这两种方法。在Netflix,我们强烈希望采用架构优先的开发方式,因为:
- 模式schema架构设计是开发人员体验的重中之重。
- 它为工具使用模式提供了一种简便的方法。
- 模式差异使向后不兼容的更改更加明显。在联邦GraphQL架构中工作时,向后兼容性甚至更为重要。
尽管从代码中生成模式可能会稍快一些,但花时间以易于理解的协作方式来设计模式是值得的,以争取更好的API。
框架的核心
框架的核心围绕Spring Boot开发人员所熟悉的基于注释的编程模型进行。
让我们来看一个示例,以向您展示使用此框架有多么容易。
让我们从一个简单的模式schema开始。
type Query { |
要实现此API,我们需要编写一个数据提取程序。
@DgsComponent |
Show类型是一个简单的POJO,通常使用Gradle的DGS代码生成插件生成 。用@DgsData注释的方法为字段实现数据获取程序。请注意,我们不需要每个字段都需要数据获取程序,我们可以返回Java对象,框架将处理其余的工作。框架还具有许多便利,例如本示例中使用的@InputArgument批注。
此代码足以使GraphQL端点运行。只需启动Spring Boot应用程序,即可使用/ graphql端点。
另一个关键功能是支持轻量级查询测试。这些测试使您无需使用HTTP端点即可执行查询。这些测试看起来和感觉像普通的JUnit测试。
@SpringBootTest(classes = {DgsAutoConfiguration.class, ShowsDatafetcher.class}) |
有关该框架的完整文档,请参见DGS框架github存储库。
适应GraphQL服务器生态系统
那么DGS框架如何完全适合现有的GraphQL生态系统?当前的生态系统包括服务器,客户端,联合网关和工具,以帮助进行查询测试,模式管理,代码生成等。在使用JVM构建GraphQL服务器时,既有模式优先库又有代码优先库。
流行的代码优先库是针对Kotlin的graphql-kotlin。graphql-java在用Java实现模式优先的GraphQL API方面最受欢迎,但被设计为低级库。
无论您使用Java还是Kotlin,我们的框架都提供了一种在Spring Boot中构建GraphQL服务的简便方法。它可以用于构建独立服务,也可以用于联合GraphQL。
DGS框架提供了一种方便的方法来实现具有联盟的GraphQL服务。联合允许服务共享网关公开的统一图。通常,服务使用Apollo的联邦规范定义的@extends指令共享和扩展在统一模式中定义的类型。这是在微服务之间划分大型整体GraphQL模式所有权的有效方法。
请在GitHub上查看DGS框架项目。我们还有一个Gradle代码生成插件,用于从GraphQL模式生成Java和Kotlin类型。