學習使用RSocket - Waldemar Panas

banq發表於2019-07-23

本文介紹如何使用帶有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尚未準備好生產,但您可以在您的反應式應用程式中試用它。

 

相關文章