Netflix发布用于Spring Boot的GraphQL的开源服务框架DGS


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,我们强烈希望采用架构优先的开发方式,因为:
  1. 模式schema架构设计是开发人员体验的重中之重。
  2. 它为工具使用模式提供了一种简便的方法。
  3. 模式差异使向后不兼容的更改更加明显。在联邦GraphQL架构中工作时,向后兼容性甚至更为重要。

尽管从代码中生成模式可能会稍快一些,但花时间以易于理解的协作方式来设计模式是值得的,以争取更好的API。
 
框架的核心
框架的核心围绕Spring Boot开发人员所熟悉的基于注释的编程模型进行。
让我们来看一个示例,以向您展示使用此框架有多么容易。
让我们从一个简单的模式schema开始。
type Query {
    shows(titleFilter: String): [Show]
}

type Show {
    title: String
    releaseYear: Int
}

要实现此API,我们需要编写一个数据提取程序。

@DgsComponent
public class ShowsDatafetcher {
    
    private final List<Show> shows = 
      List.of(
         new Show("Stranger Things", 2016),
         new Show(
"Ozark", 2017)
     );
    
    @DgsData(parentType =
"Query", field = "shows")
    public List<Show> shows(@InputArgument(
"titleFilter") String titleFilter) {
        if(titleFilter == null) {
            return shows;
        }
      
        return shows.stream()
            .filter(s -> s.getTitle().contains(titleFilter))
            .collect(Collectors.toList());
    }
}

Show类型是一个简单的POJO,通常使用Gradle的DGS代码生成插件生成 。用@DgsData注释的方法为字段实现数据获取程序。请注意,我们不需要每个字段都需要数据获取程序,我们可以返回Java对象,框架将处理其余的工作。框架还具有许多便利,例如本示例中使用的@InputArgument批注。
此代码足以使GraphQL端点运行。只需启动Spring Boot应用程序,即可使用/ graphql端点。
另一个关键功能是支持轻量级查询测试。这些测试使您无需使用HTTP端点即可执行查询。这些测试看起来和感觉像普通的JUnit测试。
@SpringBootTest(classes = {DgsAutoConfiguration.class, ShowsDatafetcher.class})
class ShowsDatafetcherTest {
    @Autowired
    DgsQueryExecutor dgsQueryExecutor;
   
    @Test
    void shows() {
        List<String> titles = dgsQueryExecutor.executeAndExtractJsonPath(
             " { shows { title releaseYear }}",
             
"data.shows<li>.title");
      
        assertThat(titles).contains(
"Ozark");
    }
}

有关该框架的完整文档,请参见DGS框架github存储库
 
适应GraphQL服务器生态系统
那么DGS框架如何完全适合现有的GraphQL生态系统?当前的生态系统包括服务器,客户端,联合网关和工具,以帮助进行查询测试,模式管理,代码生成等。在使用JVM构建GraphQL服务器时,既有模式优先库又有代码优先库。
流行的代码优先库是针对Kotlin的graphql-kotlingraphql-java在用Java实现模式优先的GraphQL API方面最受欢迎,但被设计为低级库。
无论您使用Java还是Kotlin,我们的框架都提供了一种在Spring Boot中构建GraphQL服务的简便方法。它可以用于构建独立服务,也可以用于联合GraphQL。
 
DGS框架提供了一种方便的方法来实现具有联盟的GraphQL服务。联合允许服务共享网关公开的统一图。通常,服务使用Apollo的联邦规范定义的@extends指令共享和扩展在统一模式中定义的类型。这是在微服务之间划分大型整体GraphQL模式所有权的有效方法。
 
请在GitHub上查看DGS框架项目。我们还有一个Gradle代码生成插件,用于从GraphQL模式生成Java和Kotlin类型。