Spring 6 中的 RSocket 介面
1. 概述
在本教學中,我們將探討如何在 Spring Framework 6 中使用 RSocket .
隨著 Spring Framework 版本 6 中引入宣告式 RSocket 用戶端,使用 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
MyDestination:
spring.rsocket.server.port=7000
4. 客戶端程式碼
現在,我們需要開發客戶端程式碼。為了簡單起見,我們將在同一專案中但在單獨的套件中建立客戶端程式碼。事實上,它們必須處於一個獨特的項目中。
首先,讓我們建立客戶端介面:
public interface MessageClient {
@RSocketExchange("MyDestination")
Mono<String> sendMessage(Mono<String> input);
}
當使用我們的客戶端介面時,我們使用@RSocketExchange
來顯示 RSocket 端點。基本上,這只是意味著我們需要一些資訊來建立端點路徑。我們可以透過分配共享路徑在介面層級實現這一點。它非常簡單,可以幫助我們知道我們想要使用哪個端點。
5. 測試
每個 Spring Boot 專案都包含一個用@SpringBootApplication
註解的類別。該類別在專案載入時運行。因此,我們可以使用這個類別並添加一些bean來測試場景。
5.1.建立RSocketServiceProxyFactory
Bean
首先,我們需要建立一個 bean 來產生RSocketServiceProxyFactory
。
該工廠負責創建 RSocket 服務介面的代理實例。它處理這些代理的創建,並透過指定伺服器將接收傳入連接的主機和連接埠來建立與 RSocket 伺服器的必要連接:
@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
最後,讓我們建立一個使用MessageClient
實例從伺服器發送和接收訊息的運行程序 bean:
@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專案時,會顯示以下結果:
>>cbrresponder.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 有四種主要的互動模型可用。這些方法之間的主要區別在於輸入和輸出的基數。
6.1.請求-回應
在這種方法中,每個請求都會收到一個回應。因此,我們使用基數為 1 的Mono
請求,並收到基數相同的Mono
回應。
到目前為止,本文中的所有程式碼都基於請求-回應模型。
6.2.請求流
當我們訂閱時事通訊時,我們會從伺服器定期收到更新流。當客戶端發出初始請求時,伺服器會傳送資料流作為回應。
請求可以是Mono
或Void
,但回應將始終是Flux
:
@MessageMapping("Counter")
public Flux<String> Counter() {
return Flux.range(1, 10)
.map(i -> "Count is: " + i);
}
6.3.一勞永逸
當我們透過郵件寄出一封信時,我們通常只是將其放入郵箱中,並不期望收到回覆。類似地,在「即發即棄」情境中,回應可以為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.頻道
想像一下允許雙向通訊的對講機,雙方可以同時說和聽,就像進行對話一樣。這種類型的通訊依賴於發送和接收資料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);
});
}
七、結論
在本文中,我們探索了 Spring 6 中新的宣告式 RSocket 用戶端功能。我們也學習如何將其與RSocketExchange
註解一起使用。
此外,我們還詳細了解如何建立和設定服務代理,以便我們可以使用 TCP 協定輕鬆、安全地連接到遠端端點。
此外,本教學的源代碼可在 GitHub 上取得。