RSocket 入門指南:Spring Boot Fire-And-Forget

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

時間:約 15 分鐘。

有些開發人員看到這篇文章時,使用 HTTP 已經很多年了。 他們大多數人也知道,如果您想將 HTTP 與其他訊息傳遞模型(例如 fire-and-forget)一起使用,有時您必須使用聰明的變通方法,例如 Stackoverflow 上發布的這種方法。 這是因為 HTTP 是一種請求-回應協定。 它需要發送請求並接收回應。 它沒有單向訊息且不需任何形式回應的概念。

RSocket 採用不同的方法。 RSocket 在 TCP 和 WebSocket 等傳輸協議之上定義了一個新的協定層。 這個新協定為開發人員提供了更多選擇,內建支援四種不同的互動模型

  • 請求/回應
  • fire-and-forget(發送後不理會)
  • 請求/串流
  • 通道

在之前的文章中,您已經學習了如何使用 RSocket 進行請求-回應。 在這篇文章中,您將學習如何在您的程式碼中新增 fire-and-forget 訊息傳遞。 讓我們深入了解!

如果您沒有閱讀之前關於使用 RSocket 的 伺服器端用戶端 請求-回應訊息傳遞的文章,現在是您的機會! 程式碼範例在 GitHub 上。

步驟 1:新增伺服器端 Fire-And-Forget 方法

您會記得在您之前使用的 rsocket-server 專案中的 RSocketController

@Slf4j
@Controller
public class RSocketController {
// code goes here
}

RSocketController 是處理請求-回應訊息傳遞的伺服器端類別。 它的 .requestResponse() 方法接受一個 Message 物件作為參數,並傳回一個 Message 物件作為回應。 正是這種一個物件輸入、一個物件輸出的方法簽名使該方法成為請求-回應方法。

若要將 fire-and-forget 功能新增到伺服器,您必須新增一個具有不同簽名的方法。 .fireAndForget() 方法應接受單個 Message 參數,但這次傳回 void,如下所示...

    @MessageMapping("fire-and-forget")
    public void fireAndForget(Message request) {
        log.info("Received fire-and-forget request: {}", request);
    }

您仍然必須在您的方法上使用 @MessageMapping 註解,但這次您必須為路由映射指定不同的名稱。 在上面的程式碼中,我使用了名稱 "fire-and-forget"。

在 Spring RSocket 文件中,方法簽名規則位於訊息映射章節中。

步驟 2:新增用戶端 Fire-And-Forget 方法

當您按照之前的文章操作時,您在 rsocket-client 專案中建立了您的 RSocketShellClient

@Slf4j
@ShellComponent
public class RSocketShellClient {
// code goes here
}

RSocketShellClient 使用 .requestResponse() 方法,使用在類別建構子中建立的 RSocketRequester,向 RSocket 伺服器發送單個請求。

若要將 fire-and-forget 功能新增到您的用戶端,請將新的 .fireAndForget() 方法新增到 RSocketShellClient,如下所示

    @ShellMethod("Send one request. No response will be returned.")
    public void fireAndForget() throws InterruptedException {
        log.info("\nFire-And-Forget. Sending one request. Expect no response (check server log)...");
        this.rsocketRequester
                .route("fire-and-forget")
                .data(new Message(CLIENT, FIRE_AND_FORGET))
                .send()
                .block();
    }

讓我們更詳細地檢查這個方法中的程式碼

rsocketRequester 上的 .route() 設定為 "fire-and-forget"。 這個路由名稱與 RSocketController 中 fire-and-forget 方法上的 @MessageMapping 註解相符。

新的 Message 實例為 .data() 方法提供資料。 訊息實例將其來源設定為 CLIENT,並將 FIRE_AND_FORGET 設定為其互動模式。

請注意,沒有 .retrieveMono() 呼叫。 相反,fire-and-forget 特定的 .send() 方法將訊息發送到伺服器,而 .block() 訂閱並等待完成。 請記住,在沒有訂閱的情況下,反應式程式碼中不會發生任何事情。

所有編碼都已完成。 現在,是時候測試它是否正常運作了。

步驟 3:建置並執行 RSocket 伺服器

開啟終端機視窗並移動到 rsocket-server 目錄。 使用 Maven Wrapper 啟動伺服器,如下所示

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

伺服器在 localhost7000 上啟動。

有關如何在 Windows 10 上執行 Linux 終端機的詳細資訊,請參閱 Ubuntu 的這份快速指南

步驟 4:建置並執行 RSocket 用戶端

開啟第二個終端機視窗並移動到 rsocket-client 目錄。 從那裡,建置並執行用戶端應用程式,如下所示

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

當用戶端執行時,Spring Shell 會向您顯示一個新的提示符

shell:>

您可以透過在提示符中輸入 fire-and-forget,將您的 fire-and-forget 訊息發送到伺服器。

shell:>fire-and-forget
2020-02-03 14:54:14.028 INFO 2929 --- [ main] io.pivotal.rsocketclient.RSocketClient :
Fire-And-Forget. Sending one request. Expect no response (check server)...

用戶端不會印出任何回應,但如果您切換到伺服器的終端機視窗,您會注意到 fire-and-forget 訊息的接收已成功記錄到主控台

2020-02-03 14:54:14.129 INFO 2061 --- [or-http-epoll-2] io.pivotal.rsocketserver.RSocketServer : Received fire-and-forget request: Message(origin=Client, interaction=Fire-And-Forget, index=0, created=1580741654)

步驟 5:清理

您可以透過在 shell:> 提示符中輸入 exit 來停止 rsocket-client,如下所示。

shell:>exit

您可以透過在其終端機視窗中按下 Ctrl-C 來停止 rsocket-server 程序。

運作方式

當呼叫 block() 方法時,用戶端的 .fireAndForget() 方法使用 RSocketRequester 向伺服器發送單個 Message。 block 方法實際上是「訂閱並等待」的指令。

伺服器上的 RSocketController 檢查訊息元資料的 route,並正確地將訊息傳遞到 .fireAndForget(Message request) 方法進行處理。 一旦用戶端發送請求,它就可以繼續處理其他事情。 當伺服器收到請求時,它也可以繼續處理其他工作。 它不需要向用戶端發送回應。

最終想法

在這篇文章中,您學習了如何使用 Spring Boot 和 RSocket 快速建構 fire-and-forget 功能。 有關 Spring 的 RSocket 整合和訊息映射的更多資訊,請查看 Spring RSocket 文件。 在下一篇文章中,我們將介紹請求-串流訊息傳遞。 到時見!

取得 Spring 電子報

與 Spring 電子報保持聯繫

訂閱

領先一步

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

了解更多

取得支援

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

了解更多

即將到來的活動

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

查看所有