领先一步
VMware 提供培训和认证,助您加速进步。
了解更多我很高兴代表所有相关人员宣布 Spring for GraphQL 1.0 的第一个也是最后一个候选版本的可用性。我们终于将在 5 月 17 日发布 1.0 版本,这是 Spring Boot 2.7.0 的参考版本。在此版本中,我们进行了一些值得注意的更改,并添加了一项重要的新功能。
注意: Spring for GraphqL Boot 启动器已根据本文讨论的更改进行了更新,Spring Boot 2.7.0-RC1 计划在本周四发布。
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);
}
}
到目前为止,Spring for GraphQL 在 HTTP 请求和响应中仅使用 "application/json" 作为媒体类型。我们决定,为了与官方 GraphQL over HTTP 规范更好地对齐,在发布候选版本中,我们需要进行调整。从现在开始,如果客户端未请求任何特定媒体类型,我们将默认使用 "application/graphql+json"。如果客户端请求,我们仍将支持 "application/json"。无论如何,客户端应识别 "+json" 后缀并相应地进行编码/解码。
在之前的版本中,"classpath:graphql" 是模式文件、客户端查询文档和测试客户端查询文档的默认位置。这可能会导致某些文件覆盖其他文件,从而使您的设置变得混乱。我们通过以下更改来改进这种情况:
"graphql"。"graphql-test"(在 src/test 下)用于测试服务器的文档文件。"graphql-documents"(在 src/main 下),并提供了为不同远程 API 使用自定义位置的方法。请记住更新您的应用程序以适应这些新位置!
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 问题跟踪器中持续的反馈和讨论。我们非常感激,这使得项目更加强大和更好!