領先一步
VMware 提供培訓和認證,以加速您的進展。
瞭解更多時間:約 15 分鐘。
在前一篇文章中,您已了解 Spring Boot 如何簡化編寫 RSocket 伺服器的工作。但是 RSocket 用戶端呢?在本文中,您將學習如何編寫自己的 RSocket 用戶端,然後使用這個新的用戶端將請求-回應訊息傳送到您的 RSocket 伺服器。讓我們開始吧!
本教學課程使用 Linux shell。如需如何在 Windows 上執行 Linux shell 的詳細資訊,請參閱此 Microsoft 教學課程。
編寫自己的程式碼很有趣,因此對於您的 RSocket 用戶端,讓我們從頭開始。
如果這對您來說太麻煩,或者您現在沒有時間,那麼您可以在demo code repository的 rsocket-client 資料夾中找到程式碼。
開啟您的瀏覽器並導覽至 start.spring.io,然後使用以下設定建立新的 Spring Boot 專案
Maven
Java
2.2.5
(或任何最新的 GA 版本)io.pivotal
rsocket-client
RSocket
、Lombok
點擊綠色的「產生」按鈕。下載 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 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 伺服器通訊了。
在 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()
方法觸發。沒有它,什麼都不會發生。
程式碼撰寫到此為止。讓我們執行它!
作為我們的伺服器,您將使用前一篇文章中的程式碼。開啟終端機視窗並移動到 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 訊息,方法是為您的用戶端和伺服器專案新增額外功能。