知識庫 / Spring RSS 訂閱

Spring 中 RSocket 接口

Spring
HongKong
2
11:25 AM · Dec 06 ,2025

1. 概述

本教程將探討如何在 Spring Framework 6 中利用 RSocket。

使用 RSocket 變得更加簡單,這要歸功於 Spring Framework 6 中聲明式的 RSocket 客户端的引入。該功能消除了冗餘的樣板代碼的需求,使開發者能夠更高效、更有效地使用 RSocket。

2. Maven 依賴

我們首先在首選的 IDE 中創建一個 Spring Boot 項目,並將 spring-boot-starter-rsocket 依賴添加到 `pom.xml 文件中:

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-rsocket</artifactId>
    <version>3.1.4</version>
</dependency> 

3. 創建 RSocket 服務器

首先,我們將創建一個響應器,它使用控制器來管理傳入的請求:

@MessageMapping("MyDestination")
public Mono<String> message(Mono<String> input) {
    return input.doOnNext(msg -> System.out.println("Request is:" + msg + ",Request!"))
      .map(msg -> msg + ",Response!");
}

此外,我們還將添加以下屬性到 application.properties文件中,以使服務器通過 MyDestination監聽端口 7000

spring.rsocket.server.port=7000

4. 客户端代碼

現在,我們需要開發客户端代碼。為了保持簡單,我們將客户端代碼放在同一個項目中的一個單獨的包中。實際上,它們必須位於一個獨立的項目。

為了繼續,讓我們創建客户端接口:

public interface MessageClient {

    @RSocketExchange("MyDestination")
    Mono<String> sendMessage(Mono<String> input);
}

當使用我們的客户端界面時,我們使用 @RSocketExchange 來顯示 RSocket 端點。基本上,這只是意味着我們需要一些信息來建立端點路徑。我們可以通過在接口級別分配共享路徑來實現這一點。這非常簡單,並且幫助我們知道要使用哪個端點。

5. 測試

每個 Spring Boot 項目都包含一個用 <em/>@SpringBootApplication</em> 註解標記的類。該類在項目加載時運行。因此,我們可以使用該類並添加一些 Bean 來測試一個場景。

5.1. 創建 RSocketServiceProxyFactory Bean

首先,我們需要創建一個 Bean 來生成 RSocketServiceProxyFactory

這個工廠負責創建 RSocket 服務接口的代理實例。它處理這些代理的創建以及通過指定 RSocket 服務器接收傳入連接的 host 和 port,建立必要的連接。

@Bean
public RSocketServiceProxyFactory getRSocketServiceProxyFactory(RSocketRequester.Builder requestBuilder) {
    RSocketRequester requester = requestBuilder.tcp("localhost", 7000);
    return RSocketServiceProxyFactory.builder(requester).build();
}

5.2. 創建消息客户端

然後,我們將創建一個負責生成客户端接口的 Bean

@Bean
public MessageClient getClient(RSocketServiceProxyFactory factory) {
    return factory.createClient(MessageClient.class);
}

5.3. 創建 Runner Bean

最後,讓我們創建一個 Runner Bean,它使用 MessageClient 實例來向服務器發送和接收消息:

@Bean
public ApplicationRunner runRequestResponseModel(MessageClient client) {
    return args -> {
        client.sendMessage(Mono.just("Request-Response test "))
          .doOnNext(message -> {
              System.out.println("Response is :" + message);
          })
          .subscribe();
    };
}

5.4. 測試結果

當我們在命令行中運行我們的 Spring Boot 項目時,會顯示以下結果:

>>c.b.r.responder.RSocketApplication : Started 
>>RSocketApplication in 1.127 seconds (process running for 1.398)
>>Request is:Request-Response test ,Request!
>>Response is :Request-Response test ,Response!

6. RSocket 交互模型

RSocket 是一種二進制協議,用於創建快速且響應式的分佈式應用程序。它提供了用於服務器和客户端之間交換數據的不同通信模式。

通過這些交互模型,開發者可以設計滿足特定數據流、回溯和應用程序行為要求的系統。

RSocket 提供了四種主要交互模型。 這些方法之間的主要區別在於輸入和輸出的 cardinality(數量級)

6.1. 請求-響應

在這種方法中,每個請求都接收到一個單一的響應。因此,我們使用了單向的 單向 請求,請求的 cardinality 為 1,並接收到了 cardinality 相同的單向 單向 響應。

目前為止,本文檔中所有代碼都基於請求-響應模型。

6.2. 請求流 (Request-Stream)

當訂閲新聞郵件時,我們會從服務器接收到定期更新的流。客户端發起初始請求後,服務器會以數據流的形式作出響應。

請求可以是 MonoVoid 類型,但響應始終是 Flux 類型:

@MessageMapping("Counter")
public Flux<String> Counter() {
    return Flux.range(1, 10)
      .map(i -> "Count is: " + i);
}

6.3. 遺棄式發送 (Fire-and-Forget)

當我們將信件投遞到郵箱時,通常只是將其放入郵箱並不會期望收到回覆。 類似地,在遺棄式發送 (fire-and-forget) 的上下文中,響應可以是 null 或單個 Mono

@MessageMapping("Warning")
public Mono<Void> Warning(Mono<String> error) {
    error.doOnNext(e -> System.out.println("warning is :" + e))
      .subscribe();
    return Mono.empty();
}

6.4. 通道 (Channel)

想象一下一個雙向通信的對講機,雙方可以同時説話和傾聽,就像進行對話一樣。這種通信方式依賴於發送和接收 Flux 數據:

@MessageMapping("channel")
public Flux<String> channel(Flux<String> input) {
    return input.doOnNext(i -> {
          System.out.println("Received message is : " + i);
      })
      .map(m -> m.toUpperCase())
      .doOnNext(r -> {
          System.out.println("RESPONSE IS :" + r);
      });
}

7. 結論

在本文中,我們探討了 Spring 6 中新的聲明式 RSocket 客户端特性。我們還學習瞭如何使用 @RSocketExchange 註解進行使用。

此外,我們詳細瞭解瞭如何創建和設置服務代理,以便我們可以使用 TCP 協議輕鬆且安全地連接到遠程端點。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.