Spring Boot对RSocket的支持

本文介绍了如何在SpringBoot3.2.0中使用RSocket进行字节流传输,包括RSocketStrategies的自动配置、服务器的WebFlux和独立部署选项,以及如何通过SpringMessaging支持和RSocketRequester进行客户端调用。
摘要由CSDN通过智能技术生成

https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#messaging.rsocket

RSocket是一个用于字节流传输的二进制协议。它通过单个连接上的异步消息传递启用对称的交互模型。

Spring框架的spring-messaging模块为客户端和服务器端的RSocket请求者和响应者提供支持。

RSocket策略自动配置

Spring Boot会自动配置一个RSocketStrategies bean,该bean为RSocket有效载荷的编码和解码提供了所有必要的基础设施。默认情况下,自动配置将尝试按顺序配置以下组件:

  • 使用Jackson的CBOR编解码器
  • 使用Jackson的JSON编解码器

spring-boot-starter-rsocket启动器提供了这两个依赖项。

开发人员可以通过创建实现RSocketStrategiesCustomizer接口的bean来定制RSocketStrategies组件。请注意,它们的@Order很重要,因为它决定了编解码器的顺序。

RSocket服务器自动配置

Spring Boot 提供了 RSocket 服务器的自动配置功能。所需的依赖项由 spring-boot-starter-rsocket 提供。

Spring Boot 允许从 WebFlux 服务器通过 WebSocket 公开 RSocket,或者建立独立的 RSocket 服务器。这取决于应用程序的类型及其配置。

对于 WebFlux 应用程序(即类型为 WebApplicationType.REACTIVE 的应用程序),仅当以下属性匹配时,RSocket 服务器才会插入到 Web 服务器中:

spring.rsocket.server.mapping-path=/rsocket
spring.rsocket.server.transport=websocket

注意:将 RSocket 集成到 Web 服务器仅支持使用 Reactor Netty,因为 RSocket 本身是使用该库构建的。

作为替代方案,可以启动一个独立的、内嵌式的 RSocket TCP 或 websocket 服务器。除了依赖项要求外,唯一必需的配置是定义该服务器的端口:

spring.rsocket.server.port=9898

Spring Messaging RSocket 支持

Spring Boot 会自动配置 RSocket 的 Spring Messaging 基础设施。

这意味着 Spring Boot 将创建一个 RSocketMessageHandler bean,该 bean 将处理发送到你的应用程序的 RSocket 请求。

使用 RSocketRequester 调用 RSocket 服务

一旦服务器和客户端之间建立了 RSocket 通道,任何一方都可以向另一方发送或接收请求。

作为服务器,可以在 RSocket @Controller 的任何处理程序方法上注入一个 RSocketRequester 实例。作为客户端,首先需要配置和建立 RSocket 连接。Spring Boot 为此类情况自动配置了带有预期编解码器的 RSocketRequester.Builder,并应用了任何 RSocketConnectorConfigurer bean。

RSocketRequester.Builder 实例是一个原型 bean,这意味着每个注入点都会为你提供一个新实例。这是有意的,因为这个构建器是有状态的,不应该使用同一个实例创建具有不同设置的请求者。

以下代码展示了一个典型的例子:

import reactor.core.publisher.Mono;

import org.springframework.messaging.rsocket.RSocketRequester;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final RSocketRequester rsocketRequester;

    public MyService(RSocketRequester.Builder rsocketRequesterBuilder) {
        this.rsocketRequester = rsocketRequesterBuilder.tcp("example.org", 9898);
    }

    public Mono<User> someRSocketCall(String name) {
        return this.rsocketRequester.route("user").data(name).retrieveMono(User.class);
    }

}
  • 22
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值