RSocket 入門指南:Spring Boot 用戶端

工程 | Ben Wilcock | 2020年03月09日 | ...

時間:約 15 分鐘。

前一篇文章中,您已了解 Spring Boot 如何簡化編寫 RSocket 伺服器的工作。但是 RSocket 用戶端呢?在本文中,您將學習如何編寫自己的 RSocket 用戶端,然後使用這個新的用戶端將請求-回應訊息傳送到您的 RSocket 伺服器。讓我們開始吧!

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

步驟 1:建立新的 Spring Boot 用戶端專案

編寫自己的程式碼很有趣,因此對於您的 RSocket 用戶端,讓我們從頭開始。

如果這對您來說太麻煩,或者您現在沒有時間,那麼您可以在demo code repository的 rsocket-client 資料夾中找到程式碼。

開啟您的瀏覽器並導覽至 start.spring.io,然後使用以下設定建立新的 Spring Boot 專案

  • 專案:Maven
  • 語言:Java
  • Spring Boot:2.2.5(或任何最新的 GA 版本)
  • 群組:io.pivotal
  • 構件:rsocket-client
  • 依賴套件:RSocketLombok

點擊綠色的「產生」按鈕。下載 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 RSocket 支援由 Spring Boot 自動配置,您只需要建置一個客製化的 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();
}

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

新增請求-回應 Shell 方法。

在 Spring Shell 元件中新增 shell 功能相當簡單。首先,將 public requestResponse() 方法(傳回 void)新增至 RSocketShellClient,並在方法簽名上使用 @ShellMethod 註解來啟用 Spring Shell 並宣告使用者在輸入 help 時將看到的說明文字。

在方法內部,使用對 RSocketRequester 的全域參考,並將 route() 設定為 "request-response",將 data() 設定為新的 Message 實例,並告知 requester 取得 Message 類型的 retrieveMono()。最後,將一個簡單的日誌記錄功能新增至 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 在本機主機埠號 7000 上與您的伺服器通訊。

然後,您在您的 shell 元件中建立了一個 requestResponse() 方法並對其進行了註解,以便當您在 shell 提示字元輸入 request-response 時,Spring Shell 調用了這個方法。

requestResponse() 方法被呼叫時,用戶端傳送了一些描述要使用 route 的 metadata,然後將請求作為 Message 物件傳送。伺服器的回應訊息使用簡單的日誌記錄陳述式印在螢幕上。

完成了!

在本文中,您學習如何使用 Spring Shell 撰寫簡單的 RSocket 用戶端。這個新的用戶端透過 TCP 與您的 RSocketServer 通訊。在下一篇文章中,我們將涵蓋 RSocket 和 Spring Boot 的 fire-and-forget 訊息,方法是為您的用戶端和伺服器專案新增額外功能。

取得 Spring 電子報

保持與 Spring 電子報的連線

訂閱

領先一步

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

瞭解更多

取得支援

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

瞭解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

檢視全部