此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

RSocket

RSocket 是一种用于字节流传输的二进制协议。 它通过在单个连接上进行异步消息传递,支持对称的交互模型。spring-doc.cadn.net.cn

Spring Framework 的 spring-messaging 模块为 RSocket 请求方和响应方提供了支持,既适用于客户端,也适用于服务端。 更多详细信息(包括 RSocket 协议的概述),请参阅 Spring Framework 参考文档中的 RSocket 章节spring-doc.cadn.net.cn

RSocket 策略自动配置

Spring Boot 会自动配置一个 RSocketStrategies Bean,该 Bean 提供编码和解码 RSocket 负载所需的所有基础设施。 默认情况下,自动配置将尝试按以下顺序进行配置:spring-doc.cadn.net.cn

  1. CBOR 编解码器(使用 Jackson)spring-doc.cadn.net.cn

  2. 使用 Jackson 的 JSON 编解码器spring-doc.cadn.net.cn

spring-boot-starter-rsocket 起步依赖提供了上述两个依赖项。 有关更多自定义选项,请参阅Jackson 支持章节spring-doc.cadn.net.cn

开发人员可以通过创建实现 RSocketStrategiesCustomizer 接口的 Bean 来自定义 RSocketStrategies 组件。 请注意,它们的 @Order 非常重要,因为它决定了编解码器的顺序。spring-doc.cadn.net.cn

RSocket 服务器自动配置

Spring Boot 提供了 RSocket 服务器的自动配置。 所需的依赖由 spring-boot-starter-rsocket 提供。spring-doc.cadn.net.cn

Spring Boot 允许通过 WebFlux 服务器以 WebSocket 方式暴露 RSocket,或者启动一个独立的 RSocket 服务器。 这取决于应用程序的类型及其配置。spring-doc.cadn.net.cn

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

spring.rsocket.server.mapping-path=/rsocket
spring.rsocket.server.transport=websocket
spring:
  rsocket:
    server:
      mapping-path: "/rsocket"
      transport: "websocket"
将 RSocket 集成到 Web 服务器中仅支持使用 Reactor Netty,因为 RSocket 本身正是基于该库构建的。

或者,RSocket TCP 或 WebSocket 服务器会作为一个独立的嵌入式服务器启动。 除了依赖项要求外,唯一需要的配置就是为该服务器定义一个端口:spring-doc.cadn.net.cn

spring.rsocket.server.port=9898
spring:
  rsocket:
    server:
      port: 9898

Spring Messaging RSocket 支持

Spring Boot 将自动配置用于 RSocket 的 Spring Messaging 基础设施。spring-doc.cadn.net.cn

这意味着 Spring Boot 将创建一个 RSocketMessageHandler Bean,用于处理发往您应用程序的 RSocket 请求。spring-doc.cadn.net.cn

使用 RSocketRequester 调用 RSocket 服务

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

作为服务器,您可以在 RSocket @Controller 的任何处理方法中注入一个 RSocketRequester 实例。 作为客户端,您需要先配置并建立 RSocket 连接。 Spring Boot 会为这类情况自动配置一个带有预期编解码器的 RSocketRequester.Builder,并应用任何 RSocketConnectorConfigurer Bean。spring-doc.cadn.net.cn

RSocketRequester.Builder 实例是一个原型作用域(prototype)的 Bean,这意味着每个注入点都会为您提供一个新的实例。 这是有意为之的,因为该构建器是有状态的,您不应使用同一个实例来创建具有不同配置请求器。spring-doc.cadn.net.cn

以下代码展示了一个典型示例:spring-doc.cadn.net.cn

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);
	}

}
import org.springframework.messaging.rsocket.RSocketRequester
import org.springframework.stereotype.Service
import reactor.core.publisher.Mono

@Service
class MyService(rsocketRequesterBuilder: RSocketRequester.Builder) {

	private val rsocketRequester: RSocketRequester

	init {
		rsocketRequester = rsocketRequesterBuilder.tcp("example.org", 9898)
	}

	fun someRSocketCall(name: String): Mono<User> {
		return rsocketRequester.route("user").data(name).retrieveMono(
			User::class.java
		)
	}

}