RSocket

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

春季消息Spring 框架的模块支持RSocket的请求者和响应者,无论是客户端还是服务器端。 更多细节包括RSocket协议概述,请参见春季框架参考文献中的RSocket部分spring-doc.cadn.net.cn

RSocket 策略自动配置

Spring Boot 会自动配置Rocket策略提供所有编码和解码RSocket有效载荷所需的基础设施。 默认情况下,自动配置会尝试配置以下内容(按顺序):spring-doc.cadn.net.cn

  1. 与Jackson的CBOR编解码器spring-doc.cadn.net.cn

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

Spring Boot器启动Starter 同时满足了这两种依赖关系。 请参阅Jackson支持部分,了解更多定制可能性。spring-doc.cadn.net.cn

开发者可以自定义Rocket策略组件通过创建实现RSocketStrategies 定制器接口。 注意他们的@Order很重要,因为它决定了编解码器的顺序。spring-doc.cadn.net.cn

RSocket 服务器自动配置

Spring Boot 提供 RSocket 服务器的自动配置功能。 所需的依赖关系由Spring Boot器启动.spring-doc.cadn.net.cn

Spring Boot 允许通过 WebFlux 服务器暴露 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"
仅支持 Reactor Netty 支持将 RSocket 插入 Web 服务器,因为 RSocket 本身就是用该库构建的。

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

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

春季消息RSocket支持

Spring Boot 会自动配置 RSocket 的 Spring 消息基础设施。spring-doc.cadn.net.cn

这意味着Spring Boot会生成RSocketMessageHandler一个可以处理你应用的 RSocket 请求的 Bean 。spring-doc.cadn.net.cn

你可以使用@ControllerAdvice处理例外情况。

使用 RSocketRequester 呼叫 RSocket 服务

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

作为服务器,你可能会被注射RSocketRequester实例在RSocket的任意处理程序方法上@Controller. 作为客户端,你需要先配置并建立一个RSocket连接。 Spring Boot 会自动配置RSocketRequester.Builder对于这些具有预期编解码器和 的情况,应用任意RSocketConnectorConfigurer豆。spring-doc.cadn.net.cn

RSocketRequester.Builder实例是一个原型豆,意味着每个注射点都会给你一个新的实例。 这是有意为之,因为该构建器是有状态的,你不应该在同一实例里创建不同设置的请求者。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
		)
	}

}