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 計劃在本週四發布。

GraphQL over RSocket

Spring for GraphQL 最初使用 HTTP 和 WebSocket 傳輸 - 這是 GraphQL 世界中必備的。 我們的程式設計模型也允許添加其他傳輸方式,而我們現有的基礎架構指向另一個明確的候選者:RSocket 協定。 在 RC1 中,我們新增了對 GraphQL over RSocket 的客戶端和伺服器端支援。

RSocket 支援透過反應式串流的反向壓力、請求調節、會話恢復等進行串流。 此外,RSocket 功能提供所有語意,使其成為所有 GraphQL 請求的傳輸方式,而無需像 GraphQL over HTTP 和 over WebSocket 那樣在頂部添加額外的協定。

RSocket 本身透過面向連線的傳輸(例如 WebSocket、TCP 等)運行。 在 Spring Boot 中,您可以透過 WebSocket 或 TCP 設置 RSocket 伺服器。 之後,您只需要透過 "spring.graphql.rsocket.mapping" 屬性為 GraphQL 訊息配置 "route",例如 "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 請求和回應的媒體類型。 我們決定,對於我們的候選版本,我們需要更好地與 官方 GraphQL over HTTP 規範保持一致。 從現在開始,如果客戶端沒有請求任何特定的媒體類型,我們預設會使用 "application/graphql+json"。 如果客戶端請求,我們將繼續支援 "application/json"。 無論如何,客戶端應識別 "+json" 後綴並相應地編碼/解碼。

GraphQL 文件位置

在之前的版本中,"classpath:graphql" 是 schema 檔案、客戶端查詢文件和測試客戶端查詢文件的預設位置。 這可能導致某些檔案遮蔽其他檔案,使您的設置令人困惑。 我們透過以下變更改進了此情況

  • 伺服器 schema 檔案保留在主類別路徑上的當前預設 "graphql"
  • 測試器預設為 "graphql-test"(在 src/test 下)用於測試伺服器的文件
  • 客戶端預設為 "graphql-documents"(在 src/main 下),並且可以使用自定義位置來用於不同的遠端 API

別忘了使用這些新位置更新您的應用程式!

GraphQlSource Builder

GraphQL Java 提供了兩種建立 schema 的方法。 一種是在 schema 定義檔案中宣告,稱為 SDL 方式。 另一種是透過 Java 程式碼以程式化的方式定義。

Spring for GraphQL 及其 GraphQlSource 建構器側重於前者,即 SDL 方式,透過查找和解析 .graphqls 檔案、準備 RuntimeWiring 並允許應用程式自定義它。 這也是 GraphQL Java 中更新且推薦的選項。 但是,我們認識到 GraphQlSource 的目的是公開任何 graphql.GraphQL 實例,無論 graphql.schema.GraphQLSchema 是如何準備的。

在此版本中,我們調整了 GraphQlSource 建構器,將通用配置選項提取到基本建構器中,並將 SDL 相關選項保留在擴展中。 這意味著應用程式現在可以跳過與初始化 schema 相關的步驟,而是提供外部準備的 GraphQLSchema。 這不會帶來對程式化 schema 建立的一流支援,但它確實帶來了更多清晰度,並保留了將來這樣做的選項,具體取決於回饋和使用案例。

社群

最後但並非最不重要的是,感謝您在 Spring for GraphQL 問題追蹤器中持續的回饋和討論。 我們非常感謝,因為它使專案更強大、更好!

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔。

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

檢視全部