RSocket 是用于字节流传输的二进制协议。 它通过通过单个连接传递异步消息来实现对称交互模型。Spring中文文档

Spring Framework 的模块在客户端和服务器端为 RSocket 请求者和响应者提供支持。 有关更多详细信息,请参阅 Spring Framework 参考的 RSocket 部分,包括 RSocket 协议的概述。spring-messagingSpring中文文档

RSocket 策略自动配置

Spring Boot 会自动配置一个 bean,该 bean 提供编码和解码 RSocket 有效负载所需的所有基础结构。 默认情况下,自动配置将尝试配置以下内容(按顺序):RSocketStrategiesSpring中文文档

  1. 带有 Jackson 的 CBOR 编解码器Spring中文文档

  2. 使用 Jackson 的 JSON 编解码器Spring中文文档

启动器提供这两个依赖项。 请参阅 Jackson 支持部分,了解有关自定义可能性的更多信息。spring-boot-starter-rsocketSpring中文文档

开发人员可以通过创建实现接口的 Bean 来自定义组件。 请注意,这很重要,因为它决定了编解码器的顺序。RSocketStrategiesRSocketStrategiesCustomizer@OrderSpring中文文档

RSocket 服务器自动配置

Spring Boot 提供 RSocket 服务器自动配置。 所需的依赖项由 .spring-boot-starter-rsocketSpring中文文档

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

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

spring.rsocket.server.mapping-path=/rsocket
spring.rsocket.server.transport=websocket
spring:
  rsocket:
    server:
      mapping-path: "/rsocket"
      transport: "websocket"
只有 Reactor Netty 支持将 RSocket 插入 Web 服务器,因为 RSocket 本身就是使用该库构建的。

或者,RSocket TCP 或 websocket 服务器作为独立的嵌入式服务器启动。 除了依赖关系要求之外,唯一需要的配置是为该服务器定义一个端口:Spring中文文档

spring.rsocket.server.port=9898
spring:
  rsocket:
    server:
      port: 9898
只有 Reactor Netty 支持将 RSocket 插入 Web 服务器,因为 RSocket 本身就是使用该库构建的。

Spring Messaging RSocket 支持

Spring Boot 将自动为 RSocket 配置 Spring Messaging 基础结构。Spring中文文档

这意味着 Spring Boot 将创建一个 bean 来处理对应用程序的 RSocket 请求。RSocketMessageHandlerSpring中文文档

使用 RSocketRequester 调用 RSocket 服务

在服务器和客户端之间建立通道后,任何一方都可以向另一方发送或接收请求。RSocketSpring中文文档

作为服务器,您可以在 RSocket 的任何处理程序方法上注入实例。 作为客户端,您需要先配置并建立 RSocket 连接。 Spring Boot 会使用预期的编解码器自动配置这种情况并应用任何 bean。RSocketRequester@ControllerRSocketRequester.BuilderRSocketConnectorConfigurerSpring中文文档

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

下面的代码显示了一个典型示例:Spring中文文档

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

}