Spring for GraphQL 1.0 RC1 发布

版本发布 | Brian Clozel | 2022 年 4 月 20 日 | ...

我代表所有参与人员,很高兴宣布 Spring for GraphQL 1.0 的第一个也是最终发布候选版本已就绪。我们最终将在 5 月 17 日发布 1.0 版本,这将是 Spring Boot 2.7.0 的参考版本。在此版本中,我们进行了一些值得注意的更改,并添加了一个重要的新特性。

注意: Spring for GraphQL Boot starter 已更新,包含了本文讨论的更改,并且 Spring Boot 2.7.0-RC1 计划于本周四发布。

通过 RSocket 实现 GraphQL

Spring for GraphQL 最初支持 HTTP 和 WebSocket 传输——这是 GraphQL 世界中必备的。我们的编程模型也允许添加其他传输方式,而我们现有的基础设施指出了另一个明显的候选者:RSocket 协议。在 RC1 中,我们添加了通过 RSocket 实现 GraphQL 的客户端和服务器支持。

RSocket 支持通过响应式流反压、请求限流、会话恢复等实现流式传输。此外,RSocket 特性提供了作为所有 GraphQL 请求传输所需的全部语义,而无需像通过 HTTP 和 WebSocket 实现 GraphQL 那样在顶部添加额外的协议。

RSocket 本身运行在面向连接的传输协议上,例如 WebSocket、TCP 等。在 Spring Boot 中,你可以通过 WebSocket 或 TCP 设置 RSocket 服务器。之后,你只需要通过 "spring.graphql.rsocket.mapping" 属性为 GraphQL 消息配置一个“路由”,例如 "spring.graphql.rsocket.mapping=graphql"

然后你可以使用 rsc 来测试你的 GraphQL API

➜  ~ rsc --request --route=graphql --dataMimeType="application/graphql+json" --data='{"query":"{\n  greeting \n}"}' --debug tcp://example.spring.io:9191
DEBUG 39367 --- [actor-tcp-nio-2] io.rsocket.FrameLogger                   : sending ->
Frame => Stream ID: 0 Type: SETUP Flags: 0b0 Length: 83
Data:

DEBUG 39367 --- [actor-tcp-nio-2] io.rsocket.FrameLogger                   : sending ->
Frame => Stream ID: 1 Type: REQUEST_RESPONSE Flags: 0b100000000 Length: 50
Metadata:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| fe 00 00 08 07 67 72 61 70 68 71 6c             |.....graphql    |
+--------+-------------------------------------------------+----------------+
Data:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 7b 22 71 75 65 72 79 22 3a 22 7b 5c 6e 20 20 67 |{"query":"{\n  g|
|00000010| 72 65 65 74 69 6e 67 20 5c 6e 7d 22 7d          |reeting \n}"}   |
+--------+-------------------------------------------------+----------------+
DEBUG 39367 --- [actor-tcp-nio-2] io.rsocket.FrameLogger                   : receiving ->
Frame => Stream ID: 1 Type: NEXT_COMPLETE Flags: 0b1100000 Length: 45
Data:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 7b 22 64 61 74 61 22 3a 7b 22 67 72 65 65 74 69 |{"data":{"greeti|
|00000010| 6e 67 22 3a 22 48 65 6c 6c 6f 2c 20 52 53 6f 63 |ng":"Hello, RSoc|
|00000020| 6b 65 74 21 22 7d 7d                            |ket!"}}         |
+--------+-------------------------------------------------+----------------+
{"data":{"greeting":"Hello, RSocket!"}}

Spring for GraphQL 还为此提供了专门的 GraphQL 客户端,并且 Spring Boot 会自动配置其构建器


@Component
public class GraphQlExample {

    private final RSocketGraphQlClient client;

    public GraphQlExample(RSocketGraphQlClient.Builder<?> builder) {
        client = builder.tcp("example.spring.io", 8181).route("graphql").build();
    }

    public Mono<String> getGreeting() {
        return client.document("{ greeting }")
            .retrieve("greeting")
            .toEntity(String.class);
    }
}

默认 GraphQL 媒体类型

到目前为止,Spring for GraphQL 在 HTTP 请求和响应中一直只使用 "application/json" 作为媒体类型。我们决定,为了我们的发布候选版本,需要更好地与官方 GraphQL over HTTP 规范对齐。从现在开始,如果客户端没有请求特定的媒体类型,我们将默认使用 "application/graphql+json"。如果客户端请求 "application/json",我们仍会继续支持。无论如何,客户端应该识别 "+json" 后缀并相应地进行编码/解码。

GraphQL 文档位置

在之前的版本中,"classpath:graphql" 是模式文件、客户端查询文档和测试客户端查询文档的默认位置。这可能导致某些文件覆盖其他文件,使你的配置变得混乱。我们通过以下更改优化了这种情况:

  • 服务器模式文件保留当前主类路径上的默认位置 "graphql"
  • 测试器默认使用 "graphql-test"(在 src/test 下)作为测试服务器的文档文件位置
  • 客户端默认使用 "graphql-documents"(在 src/main 下),并提供了一种方法为不同的远程 API 使用自定义位置

不要忘记使用这些新位置更新你的应用程序!

GraphQlSource 构建器

GraphQL Java 提供了两种创建模式的方式。一种是在模式定义文件中声明,这称为 SDL 方式。另一种是通过 Java 代码以编程方式定义。

Spring for GraphQL 及其 GraphQlSource 构建器侧重于前者,即 SDL 方式,通过查找和解析 .graphqls 文件,准备 RuntimeWiring,并允许应用程序进行自定义。这也是 GraphQL Java 中更近期且推荐的选项。然而,我们认识到 GraphQlSource 的目的是公开任何 graphql.GraphQL 实例,无论 graphql.schema.GraphQLSchema 是如何准备的。

在此版本中,我们调整了 GraphQlSource 构建器,将通用配置选项提取到一个基础构建器中,并将 SDL 相关选项保留在一个扩展中。这意味着应用程序现在可以跳过初始化模式相关的步骤,转而提供一个外部准备好的 GraphQLSchema。这并未为编程方式创建模式带来一流支持,但它确实带来了更清晰的结构,并根据反馈和用例,为将来这样做留下了选项。

社区

最后但同样重要的是,感谢大家在 Spring for GraphQL 问题跟踪器中持续提供的反馈和讨论。我们非常感激,这让项目变得更强大、更好!

订阅 Spring 通讯

通过 Spring 通讯保持联系

订阅

保持领先

VMware 提供培训和认证,助你加速前进。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将到来的活动

查看 Spring 社区的所有即将到来的活动。

查看全部