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 启动器已更新到本文中讨论的更改,并且 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 仅将"application/json"用作 HTTP 请求和响应的媒体类型。我们决定,对于我们的候选版本,我们需要更好地与官方的基于 HTTP 的 GraphQL 规范保持一致。从现在开始,如果客户端没有请求任何特定的媒体类型,我们将默认使用"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 社区中所有即将举行的活动。

查看全部