RSocket 入門:Spring Boot 客戶端

工程 | Ben Wilcock | 2020年3月9日 | ...

時間:約 15 分鐘

上一篇文章中,您瞭解了 Spring Boot 如何簡化編寫 RSocket 伺服器的任務。那麼 RSocket 客戶端呢?在本文中,您將學習如何編寫自己的 RSocket 客戶端,然後使用這個新客戶端向 RSocket 伺服器傳送請求-響應訊息。我們開始吧!

本教程使用 Linux shell。有關如何在 Windows 上執行 Linux shell 的詳細資訊,請參閱此 Microsoft 教程

步驟 1:為客戶端建立一個新的 Spring Boot 專案

自己動手編寫程式碼很有趣,因此對於 RSocket 客戶端,我們從頭開始。

如果您覺得這太麻煩,或者現在沒有時間,可以在演示程式碼庫的 rsocket-client 資料夾中找到程式碼。

開啟瀏覽器並訪問 start.spring.io,然後使用以下設定建立一個新的 Spring Boot 專案:

  • 專案:Maven
  • 語言:Java
  • Spring Boot:2.2.5(或最新的 GA 版本)
  • 組 (Group):io.pivotal
  • Artifact:rsocket-client
  • 依賴項 (Dependencies):RSocket, Lombok

點選綠色的“Generate”按鈕。下載 ZIP 檔案並將其解壓到一個資料夾中,然後在您喜歡的 Java IDE 中開啟解壓後的專案。

步驟 2:將 Spring Shell 新增到專案

Spring Shell 幫助您使用 Spring Boot 編寫簡單的終端程式。在撰寫本文時,Spring Initializr 沒有提供 Spring Shell 選項,但您仍然可以透過手動將依賴項新增到專案來使用它。

在您的 IDE 中開啟 Maven pom.xml 檔案,並將以下 XML 新增到 <dependencies> 部分

<dependency>
    <groupId>org.springframework.shell</groupId>
    <artifactId>spring-shell-starter</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

這將使您的新 RSocket 客戶端專案能夠使用 Spring Shell。

步驟 3:編寫程式碼

需要進行一些簡短的編碼任務,以將 Spring Shell 和 RSocket 支援新增到您的新 RSocket 客戶端應用程式。它們如下:

刪除測試類

您可以刪除自動生成的 RsocketclientApplicationTests 測試類。如果不刪除,執行 Spring '整合' 測試時可能會發生奇怪的事情。詳情請參閱 此處 Spring Shell 文件中的注意事項

從伺服器程式碼複製 Message 類

io.pivotal.rsocketserver.data 包中複製 Message.java 資料類。此包位於您在上一篇文章中使用的 rsocket-server 專案資料夾中。您需要此類的定義才能與伺服器交換訊息。

建立 RSocketShellClient 類

io.pivotal.rsocketclient 包中,建立一個名為 RSocketShellClient 的新類,並用 @Slf4j@ShellComponent 註解標記此類。第一個註解告訴 Lombok 為此類新增日誌功能,第二個註解告訴 Spring 您正在構建一個基於 Shell 的元件。

@Slf4j
@ShellComponent
public class RSocketShellClient {
 // Your code will go here...
}

設定 RSocketRequester

RSocket 客戶端需要知道在哪裡可以找到 RSocket 伺服器並與之通訊。Spring Boot 會自動配置 Spring RSocket 支援,您只需構建一個定製的 RSocketRequester。您可以透過新增類建構函式並使用 RSocketRequester.Builder 來完成此操作,如下所示:

// Add a global class variable for the RSocketRequester
private final RSocketRequester rsocketRequester;

// Use an Autowired constructor to customize the RSocketRequester and store a reference to it in the global variable
@Autowired
public RSocketShellClient(RSocketRequester.Builder rsocketRequesterBuilder) {
    this.rsocketRequester = rsocketRequesterBuilder
            .connectTcp("localhost", 7000).block();
}

請求者的 connectTcp() 方法需要知道您的 RSocket 伺服器的 IP 地址和埠,並且您需要告訴請求者 block() 直到連線建立。之後,您就可以透過 TCP 與 RSocket 伺服器通訊了。

新增請求-響應 Shell 方法。

在 Spring Shell 元件中新增 Shell 功能非常簡單。首先,向 RSocketShellClient 中新增一個返回 void 的 public 方法 requestResponse(),並在方法簽名上使用 @ShellMethod 註解來啟用 Spring Shell 並宣告使用者鍵入 help 時將看到的幫助文字。

在方法內部,使用 RSocketRequester 的全域性引用,將 route() 設定為 "request-response",將 data() 設定為一個新的 Message 例項,並告訴請求者 retrieveMono() 型別為 Message。最後,向 subscribe() 方法新增一個簡單的日誌記錄功能。程式碼如下:

    @ShellMethod("Send one request. One response will be printed.")
    public void requestResponse() throws InterruptedException {
        log.info("\nSending one request. Waiting for one response...");
        Message message = this.rsocketRequester
                .route("request-response")
                .data(new Message(CLIENT, REQUEST))
                .retrieveMono(Message.class)
                .block();
        log.info("\nResponse was: {}", message);
    }

RSocket 旨在處理長期執行的非同步資料流。使用您已經熟悉的 Java 8 Stream API 中的函數語言程式設計風格可以最有效地完成此操作。

上面的程式碼說明了您希望在(並且僅在)有訊息工作要做時發生的事情。在這種情況下,您承諾傳送一條請求訊息,路由到伺服器的 "request-response" 處理程式方法,並期望收到一條響應訊息。此過程由對 block() 方法的呼叫觸發。如果沒有它,什麼都不會發生。

編碼就到這裡。讓我們執行它!

步驟 4:構建並執行 RSocket 伺服器

我們將使用上一篇文章中的程式碼作為伺服器。開啟一個終端視窗,切換到 rsocket-server 目錄,然後使用 Maven wrapper 執行伺服器程式碼,如下所示:

cd rsocket-server
./mvnw clean package spring-boot:run -DskipTests=true
```bash

The server will start up on `localhost` port `7000` and wait for your client to connect.

# Step 5: Build And Run The RSocket Client

To run your RSocket client, open a second terminal window and move to your `rsocket-client` directory. From there, build and run the client as follows:

```bash
cd rsocket-client
./mvnw clean package spring-boot:run -DskipTests=true

客戶端啟動完成後,您將看到一個新的命令列提示符,如下所示:

shell:>

您可以使用此提示符向您的 Spring 應用程式發出命令,類似於透過常規終端應用程式發出命令。

讓我們向伺服器傳送一條請求訊息並等待響應。在提示符下鍵入 request-response。然後您將看到請求和響應訊息的傳送和接收,如下所示:

shell:>request-response
Sending one request. Waiting for one response...
Response was: Message(origin=Server, interaction=Response, index=0, created=1582558295)
shell:>

為了簡潔起見,我省略了大部分日誌詳情。您的輸出將比所示的更詳細,但結果是一樣的。

現在您可以在 shell:> 提示符下鍵入 exit 來停止 rsocket-client。您可以透過在其終端視窗中按 Ctrl-C 或關閉視窗來停止 rsocket-server

工作原理

Spring Shell 允許您使用 Spring Boot 構建和執行類似終端的程式。在您的 Shell 元件的建構函式中,您配置了一個 RSocketRequester,以便使用 TCP 在 localhost 的埠 7000 上與您的伺服器通訊。

然後您在 Shell 元件中建立了一個 requestResponse() 方法並對其進行註解,這樣當您在 Shell 提示符下鍵入 request-response 時,Spring Shell 就會呼叫此方法。

requestResponse() 方法被呼叫時,客戶端傳送了一些描述要使用的 route 的元資料,然後將請求作為 Message 物件傳送。伺服器的響應訊息使用一個簡單的日誌語句列印在螢幕上。

好了,大功告成!

在本文中,您學習瞭如何使用 Spring Shell 編寫一個簡單的 RSocket 客戶端。這個新客戶端透過 TCP 與您的 RSocket 伺服器通訊。在下一篇文章中,我們將透過向客戶端和伺服器專案新增額外功能,來介紹 RSocket 和 Spring Boot 中的“即發即忘”(fire-and-forget)訊息。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

先行一步

VMware 提供培訓和認證,助您快速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱即可。

瞭解更多

即將舉辦的活動

檢視 Spring 社群所有即將舉辦的活動。

檢視全部