先行一步
VMware 提供培訓和認證,助您快速進步。
瞭解更多時間:約 15 分鐘
在上一篇文章中,您瞭解了 Spring Boot 如何簡化編寫 RSocket 伺服器的任務。那麼 RSocket 客戶端呢?在本文中,您將學習如何編寫自己的 RSocket 客戶端,然後使用這個新客戶端向 RSocket 伺服器傳送請求-響應訊息。我們開始吧!
本教程使用 Linux shell。有關如何在 Windows 上執行 Linux shell 的詳細資訊,請參閱此 Microsoft 教程。
自己動手編寫程式碼很有趣,因此對於 RSocket 客戶端,我們從頭開始。
如果您覺得這太麻煩,或者現在沒有時間,可以在演示程式碼庫的 rsocket-client 資料夾中找到程式碼。
開啟瀏覽器並訪問 start.spring.io,然後使用以下設定建立一個新的 Spring Boot 專案:
Maven
Java
2.2.5
(或最新的 GA 版本)io.pivotal
rsocket-client
RSocket
, Lombok
點選綠色的“Generate”按鈕。下載 ZIP 檔案並將其解壓到一個資料夾中,然後在您喜歡的 Java IDE 中開啟解壓後的專案。
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。
需要進行一些簡短的編碼任務,以將 Spring Shell 和 RSocket 支援新增到您的新 RSocket 客戶端應用程式。它們如下:
您可以刪除自動生成的 RsocketclientApplicationTests
測試類。如果不刪除,執行 Spring '整合' 測試時可能會發生奇怪的事情。詳情請參閱 此處 Spring Shell 文件中的注意事項。
從 io.pivotal.rsocketserver.data
包中複製 Message.java
資料類。此包位於您在上一篇文章中使用的 rsocket-server
專案資料夾中。您需要此類的定義才能與伺服器交換訊息。
在 io.pivotal.rsocketclient
包中,建立一個名為 RSocketShellClient
的新類,並用 @Slf4j
和 @ShellComponent
註解標記此類。第一個註解告訴 Lombok 為此類新增日誌功能,第二個註解告訴 Spring 您正在構建一個基於 Shell 的元件。
@Slf4j
@ShellComponent
public class RSocketShellClient {
// Your code will go here...
}
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 伺服器通訊了。
在 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()
方法的呼叫觸發。如果沒有它,什麼都不會發生。
編碼就到這裡。讓我們執行它!
我們將使用上一篇文章中的程式碼作為伺服器。開啟一個終端視窗,切換到 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)訊息。