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