领先一步
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 仅将"application/json"
用作 HTTP 请求和响应的媒体类型。我们决定,对于我们的候选版本,我们需要更好地与官方的基于 HTTP 的 GraphQL 规范保持一致。从现在开始,如果客户端没有请求任何特定的媒体类型,我们将默认使用"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 问题跟踪器中持续提供的反馈和讨论。我们非常感谢您的支持,因为它使项目更加强大和完善!