学习使用RSocket - Waldemar Panas


本文介绍如何使用带有Spring Boot的RSocket。
什么是RSocket?
RSocket是一种双向消息驱动的通信协议。是超越标准的请求/响应模型的高级通信流程。您可以使用单个消息、消息流或无响应实现响应。RSocket允许您使用以下传输协议进行客户端和服务器端的通信:

  • TCP
  • WebSocket
  • Argon
  • HTTP/2流

如果您想了解更多信息,可以观看Ben Hale 在Spring I / 0 2019年的演讲

RSocket TCP服务器
RSocket服务器是整个项目中最简单的部分。您需要做的就是转到Spring Initializr并选择Spring Boot,至少是版本2.2.0.M4。然后,选择RSocket作为依赖项。
要使用TCP协议配置RSocket服务器,请添加下行到application.properties。此配置将在端口7000处打开RSocket。

spring.rsocket.server.transport=tcp
spring.rsocket.server.port=7000

最后一步是添加一些控制器,您已准备好使用服务器。

@Controller
class ServerController {
    @MessageMapping("queue")
    fun helloQueue(incomingMessage: Message): Mono<Message> 
        = Mono.just(Message(
"Hello ${incomingMessage.message}"))
}

data class Message(val message: String)

RSocket TCP客户端
客户端应用程序非常相似。转到Spring Initializr并用RSocket和引导它Spring Reactive Web。
要通过TCP端口7000与RSocket通信,您需要创建一个RSocketRequester。对于TCP协议,它看起来像这样。

@Configuration
class ClientConfiguration {
    @Bean
    internal fun rSocketRequester(rSocketStrategies: RSocketStrategies): RSocketRequester 
        = RSocketRequester.builder()
            .rsocketStrategies(rSocketStrategies)
            .connect(TcpClientTransport.create(7000))
            .block()!!
}

客户端应用程序可以是使用HTTP的标准响应式Web应用程序。要测试与已配置服务器的通信,请添加以下端点。

@RestController
class ClientController(private val rSocketRequester: RSocketRequester) {
    @GetMapping("/hello/{name}")
    fun hello(@PathVariable(
"name") name: String): Mono<String> = rSocketRequester.route("queue")
        .data(Message(name))
        .retrieveMono(Message::class.java)
        .map { it.message }
}

data class Message(val message: String)

RSocket WebSocket服务器
如果你想使用RScoket的WebSocket,那么需添加依赖Spring Reactive Web,这样Rsocket端口和Web端口一样,不再使用配置中端口,呢需要定义RScoket的映射端点,比如这里使用/rsocket,在application.properties配置:

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

你之前为TCP服务器配置的控制器就无需改变。

RSocket WebSocket客户端
如果你的服务器已经配置了端口8080,在application.properties改变客户端端口:
server.port=8081

为WebSocket传输协议配置客户端,类似之前TCP协议一样:

@Configuration
class ClientConfiguration {
    @Bean
    internal fun rSocketRequester(rSocketStrategies: RSocketStrategies): RSocketRequester {
        val uri = URI.create("ws://localhost:8080/rsocket")
        return RSocketRequester.builder()
            .rsocketStrategies(rSocketStrategies)
            .connect(WebsocketClientTransport.create(uri))
            .block()!!
    }
}

之前为TCP创建的控制器不需改变。

​​​​​​​Spring Boot使创建使用RSocket的应用程序变得简单。我希望这些例子告诉你如何做到这一点。版本2.2.0.M4尚未准备好生产,但您可以在您的反应式应用程序中试用它。