1. 概述

近年来,客户端/服务器通信领域的一个重要变革是GraphQL,这是一种开源查询语言和API操作运行时。我们可以通过它请求所需的确切数据,从而减少需要的请求数量。

Netflix 为此创建了一个域图形服务框架(Domain Graph Service,简称 DGS)服务器框架,以简化开发过程。在本快速教程中,我们将探讨 DGS 框架的关键特性。我们将了解如何将此框架添加到我们的应用中,并查看其基本注解的工作方式。想要了解更多关于 GraphQL 的内容,请参考我们的《GraphQL 入门指南》这里

2. 域图形服务框架

Netflix DGS 是一个基于 Kotlin 和 Spring Boot 编写的 GraphQL 服务器框架。设计目标是在 Spring 框架之外尽量减少外部依赖。

Netflix DGS 框架使用基于 Spring Boot 的 GraphQL Java 库,该库基于注解构建。 除了基于注解的编程模型,它还提供了许多有用的功能,如从 GraphQL 模型自动生成源代码。以下是其核心功能的总结:

  • 基于 Spring Boot 的注解式编程模型
  • 用于编写查询测试的单元测试框架
  • Gradle/Maven 代码生成插件,根据 schema 创建类型
  • 简单集成 GraphQL 联邦
  • 与 Spring Security 的集成
  • GraphQL 订阅(WebSocket 和 SSE)
  • 文件上传
  • 错误处理
  • 多个扩展点

3. 配置

首先,由于 DGS 基于 Spring Boot,让我们创建一个 Spring Boot 应用。然后,向项目中添加DGS 依赖

<dependency>
    <groupId>com.netflix.graphql.dgs</groupId>
    <artifactId>graphql-dgs-spring-boot-starter</artifactId>
    <version>4.9.16</version>
</dependency>

4. 模型

4.1. 开发方法

DGS 框架支持两种开发方法:先定义 schema(schema-first)和先写代码(code-first)。 但推荐使用 schema-first 方法,因为这样更容易维护数据模型。schema-first 意味着我们首先定义 GraphQL 服务的 schema,然后根据 schema 中的定义实现代码。框架默认会在 src/main/resources/schema 目录下查找所有 schema 文件。

4.2. 实现

让我们使用 Schema Definition Language (SDL) 创建一个示例应用的简单 GraphQL schema:

type Query {
    albums(titleFilter: String): [Album]
}

type Album {
    title: String
    artist: String
    recordNo: Int
}

这个 schema 允许查询专辑列表,还可以根据 title 进行过滤。

5. 基本注解

现在,让我们创建一个对应的 Album 类:

public class Album {
    private final String title;
    private final String artist;
    private final Integer recordNo;

    public Album(String title, String artist, Integer recordNo) {
        this.title = title;
        this.recordNo = recordNo;
        this.artist = artist;
    }

    // standard getters
}

5.1. 数据获取器

数据获取器负责返回查询的数据。**@DgsQuery@DgsMutation@DgsSubscription 注解是简写,用于在 QueryMutationSubscription 类型上定义数据获取器。**所有这些注解等同于 @DgsData 注解。我们可以在 Java 方法上使用其中一个注解,使其成为数据获取器,并定义带有参数的类型。

5.2. 实现

因此,要在 DGS 数据获取器中定义,我们需要在 @DgsComponent 类中创建一个查询方法。 在示例中,我们想查询专辑列表,所以我们在方法上标记 @DgsQuery

private final List<Album> albums = Arrays.asList(
  new Album("Rumours", "Fleetwood Mac", 20),
  new Album("What's Going On", "Marvin Gaye", 10), 
  new Album("Pet Sounds", "The Beach Boys", 12)
  );

@DgsQuery
public List<Album> albums(@InputArgument String titleFilter) {
    if (titleFilter == null) {
        return albums;
    }
    return albums.stream()
      .filter(s -> s.getTitle().contains(titleFilter))
      .collect(Collectors.toList());
}

我们还为方法参数标记了 @InputArgument 注解。这个注解会使用方法参数的名称来匹配查询中发送的输入参数的名称。

6. 代码生成插件

DGS 还附带了一个代码生成插件,可以根据 GraphQL schema 生成 Java 或 Kotlin 代码。代码生成通常与构建过程集成。

DGS 代码生成插件适用于 Gradle 和 Maven。 在构建过程中,根据我们的域图形服务的 GraphQL schema 文件生成代码。插件可以生成类型、输入类型、枚举和接口的代码,以及样本数据获取器和类型安全的查询 API。 还有一个名为 DgsConstants 的类,其中包含类型和字段的名称。

7. 测试

一个方便的查询 API 方法是GraphiQLGraphiQL 是 DGS 框架自带的查询编辑器。 启动应用的默认 Spring Boot 端口,检查 URL http://localhost:8080/graphiql。尝试以下查询并查看结果:

注意,与 REST 不同,我们需要明确列出查询中希望返回的具体字段。让我们看看响应:

{
  "data": {
    "albums": [
      {
        "title": "Rumours"
      },
      {
        "title": "What's Going On"
      },
      {
        "title": "Pet Sounds"
      }
    ]
  }
}

8. 总结

域图形服务框架是一种简单且颇具吸引力的 GraphQL 使用方式。它使用高级构建块处理查询执行等任务。DGS 框架通过便捷的 Spring Boot 编程模型提供这一切。本文介绍了一些框架的实用功能。

我们讨论了如何在应用中配置 DGS,并查看了一些基本注解。接着,我们编写了一个简单的应用,了解如何根据 schema 创建数据并查询它们。最后,我们使用 GraphiQL 测试了我们的 API。如往常一样,示例代码可在GitHub上找到。