此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Boot 3.4.0! |
RSocket 系列
RSocket 是一种用于字节流传输的二进制协议。 它通过单个连接上的异步消息传递来实现对称交互模型。
这spring-messaging
Module 在客户端和服务器端都为 RSocket 请求者和响应者提供支持。
有关更多详细信息,包括 RSocket 协议的概述,请参见 Spring Framework 参考的 RSocket 部分。
RSocket 策略自动配置
Spring Boot 会自动配置RSocketStrategies
bean 提供编码和解码 RSocket 有效负载所需的所有基础结构。
默认情况下,自动配置将尝试配置以下内容(按顺序):
-
使用 Jackson 的 CBOR 编解码器
-
使用 Jackson 的 JSON 编解码器
这spring-boot-starter-rsocket
starter 提供了这两个依赖项。
请参阅 Jackson 支持部分以了解有关自定义可能性的更多信息。
开发人员可以自定义RSocketStrategies
组件,方法是创建实现RSocketStrategiesCustomizer
接口。
请注意,他们的@Order
很重要,因为它决定了编解码器的顺序。
RSocket 服务器自动配置
Spring Boot 提供 RSocket 服务器自动配置。
所需的依赖项由spring-boot-starter-rsocket
.
Spring Boot 允许从 WebFlux 服务器通过 WebSocket 公开 RSocket,或者建立独立的 RSocket 服务器。 这取决于应用程序的类型及其配置。
对于 WebFlux 应用程序(类型为WebApplicationType.REACTIVE
),则仅当以下属性匹配时,RSocket 服务器才会插入 Web 服务器:
-
Properties
-
YAML
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 服务器作为独立的嵌入式服务器启动。 除了依赖项要求之外,唯一需要的配置是为该服务器定义一个端口:
-
Properties
-
YAML
spring.rsocket.server.port=9898
spring:
rsocket:
server:
port: 9898
Spring Messaging RSocket 支持
Spring Boot 将为 RSocket 自动配置 Spring Messaging 基础设施。
这意味着 Spring Boot 将创建一个RSocketMessageHandler
bean 的 bean 来处理对应用程序的 RSocket 请求。
使用 RSocketRequester 调用 RSocket 服务
一旦RSocket
channel 建立在 Server 和 Client 端之间,任何一方都可以向另一方发送或接收请求。
作为服务器,您可以注入RSocketRequester
实例在 RSocket 的任何处理程序方法上@Controller
.
作为客户端,您需要先配置并建立 RSocket 连接。
Spring Boot 会自动配置RSocketRequester.Builder
对于此类情况,使用预期的编解码器并应用任何RSocketConnectorConfigurer
豆。
这RSocketRequester.Builder
instance 是一个原型 bean,这意味着每个注入点都会为您提供一个新的 instance 。
这是有意为之的,因为此构建器是有状态的,您不应使用同一实例创建具有不同设置的请求者。
以下代码显示了一个典型的示例:
-
Java
-
Kotlin
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
)
}
}