14.3 在 WebSocket 上传输 RSocket

默认情况下,RSocket 通信通过 TCP 套接字进行。但也有一些情况使 TCP 不是一个好的选择。考虑这两种情况:

  • 客户端是用 JavaScript 编写的,并在用户的 web 浏览器中运行。
  • 客户端必须跨越网关或防火墙边界才能访问服务器,防火墙不允许通过随意指定的端口进行通信。

此外,WebSocket 本身缺乏对路由的支持,要求路由细节在应用程序级别定义。通过将 RSocket 置于 WebSocket 之上,WebSocket 将受益来自 RSocket 的内置路由支持。

在这些情况下,RSocket 可以通过 WebSocket 进行运输。WebSocket 通信通过 HTTP 进行,HTTP 是所有 web 浏览器中的主要通信方式,并且通常是允许通过防火墙的。

要从 TCP 传输切换到 WebSocket 传输,只需在服务器和客户端中做几处简单的修改。首先,由于 WebSocket 是通过 HTTP 传输的,您需要确保服务器端应用程序支持处理 HTTP 请求。简言之,您需要将 WebFlux starter 依赖项添加到项目构建中(如果项目中还没有):

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

您还需要配置属性 spring.rsocket.server.transport,指出要在服务器端使用 WebSocket 进行传输。还需要设置 spring.rsocket.server.mapping-path 属性,指定 RSocket 将在 HTTP 上通信的路径。服务器的 application.yml 配置如下所示:

spring:
  rsocket:
    server:
      transport: websocket
      mapping-path: /rsocket

与通过特定端口进行通信的 TCP 传输不同,WebSocket 传输在特定的 HTTP 路径上。因此,不需要设置 spring.rsocket.server.port。

这就是在服务器端为 RSocket 启用 WebSocket 传输所需要做的全部工作。其他一切都将与使用 TCP 时完全相同。

在客户端,只需要一个小改动。您不再创建基于 TCP 的请求,而是需要通过调用 RSocketRequester.Builder 上的方法 WebSocket(),创建基于 WebSocket 的请求:

RSocketRequester requester = requesterBuilder.websocket(
URI.create("ws://localhost:8080/rsocket"));

requester
  .route("greeting")
  .data("Hello RSocket!")
  .retrieveMono(String.class)
  .subscribe(response -> log.info("Got a response: " + response));

这就是通过 WebSocket 传输 RSocket 的全部内容!

results matching ""

    No results matching ""