Spring Boot3新特性@RSocketExchange輕松實現(xiàn)消息實時推送
環(huán)境:Spring Boot3.2.5
1. 簡介
本篇文章將介紹與RSocket在Spring Boot中應用的相關知識,如果你對RSocket還不了解的,可以查看下面這篇文章
SpringBoot整合RSocket實時數(shù)據(jù)通信
從Spring 6和Spring Boot 3開始,類似于其他聲明式客戶端(如OpenFeign和Retrofit),Spring框架支持將RSocket服務創(chuàng)建為一個Java接口,其中使用注解的方法用于RSocket交互。接下來我將使用@RSocketExchange來創(chuàng)建一個用于RSocket協(xié)議的聲明式請求者客戶端。
一個聲明式HTTP接口是一個Java接口,它有助于減少樣板代碼,生成實現(xiàn)該接口的代理,并在框架級別執(zhí)行交互。
2. 實戰(zhàn)案例
2.1 依賴管理
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>
該starter中包含所有必要的類和接口。
2.2 使用@RSocketExchange
@RSocketExchange注解用于在RSocket服務接口上聲明一個方法作為RSocket端點。它接受一個value參數(shù),該參數(shù)定義了端點路由。與用于HTTP傳輸?shù)腀RequestMapping類似,@RSocketExchange可以在接口級別使用,以表達一個公共路由,該路由將被所有服務方法繼承。
public interface MessageService {
@RSocketExchange("message")
public Mono<String> sendMessage(Mono<String> requestObject);
}
服務方法可以接受以下方法參數(shù):
- @DestinationVariable: 添加路由變量,將模板占位符擴展到路由中。
- @Payload:可選注解,用于設置請求的輸入有效載荷。
- Object,然后是 MimeType:發(fā)送輸入有效載荷中的附加元數(shù)據(jù)項及其 MIME 類型。
public interface MessageService {
@RSocketExchange("message/{name}")
public Mono<String> sendMessage(
@DestinationVariable("name") String name,
@Payload Mono<String> content) ;
}
Spring底層會生成一個實現(xiàn) MessageService 接口的代理,并使用底層的 RSocketRequester 進行交互。
2.3 生成服務代理
眾所周知,Spring Boot自動配置會為我們自動配置RSocketRequester.Builder。我們可以使用這個構建器來創(chuàng)建RSocketRequester。
@Component
public class RSocketComponent {
private final RSocketRequester.Builder requesterBuilder;
public RSocketComponent(RSocketRequester.Builder requesterBuilder) {
this.requesterBuilder = requesterBuilder ;
}
@PostConstruct
public void initRSocket() {
RSocketRequester rsocketRequester = requesterBuilder.tcp("localhost", 7000);
}
}
接下來,我們可以使用 RSocketRequester 來初始化一個 RSocketServiceProxyFactory,最終用于為任何帶有 @RSocketExchange 方法的 RSocket 服務接口創(chuàng)建客戶端代理。
RSocketServiceProxyFactory factory = RSocketServiceProxyFactory.builder(rsocketRequester).build() ;
MessageService messageService = factory.createClient(MessageService.class) ;
這里就得到了MessageService服務對象,接下來就可以進行服務調(diào)用的測試了。
針對RSocket服務端,我這里打算還是使用下面這篇文章中的服務端程序
SpringBoot整合RSocket實時數(shù)據(jù)通信
在RSocketComponent中添加如下方法,執(zhí)行服務端接口調(diào)用
public Mono<String> message(Mono<String> requestObject) {
return this.service.sendMessage(requestObject) ;
}
接下來,我們就可以進行測試
2.4 測試
這里,通過Controller接口進行測試
@RestController
@RequestMapping("/messages")
public class MessageController {
private final RSocketComponent rc ;
public MessageController(RSocketComponent rc) {
this.rc = rc ;
}
@GetMapping("msg")
public String msg(String msg) {
return this.rc.message(Mono.just(msg)).block() ;
}
}
圖片
圖片
服務端控制臺輸出
接收到消息:Hello
接收到消息:Pack
測試通過;與Spring6之前版本相比較通過@RSocketExchange注解簡化了我們客戶端調(diào)用RSocket服務。其實,這種方式與Spring6中的@HttpExchange的使用及原理差不多。