RSocket 入门:Spring Boot 客户端

工程 | Ben Wilcock | 2020 年 3 月 9 日 | ...

时间:约 15 分钟。

上一篇文章中,您了解了 Spring Boot 如何简化编写 RSocket 服务器的任务。但是 RSocket 客户端呢?在本文中,您将学习如何编写自己的 RSocket 客户端,然后使用这个新客户端向您的 RSocket 服务器发送请求-响应消息。让我们开始吧!

本教程使用 Linux shell。有关如何在 Windows 上运行 Linux shell 的详细信息,请参阅此 Microsoft 教程

步骤 1:为您的客户端创建一个新的 Spring Boot 项目

自己编写代码很有趣,因此我们为您的 RSocket 客户端从头开始。

如果这太麻烦,或者您现在没有时间,您可以在演示代码仓库的 rsocket-client 文件夹中找到代码。

打开浏览器,访问 start.spring.io,然后使用以下设置创建一个新的 Spring Boot 项目:

  • 项目: Maven
  • 语言: Java
  • Spring Boot: 2.2.5 (或任何最新的 GA 版本)
  • Group: io.pivotal
  • Artifact: rsocket-client
  • 依赖: RSocket, Lombok

点击绿色的 “Generate” 按钮。下载 ZIP 文件并解压项目到一个文件夹中,然后用你喜欢的 Java IDE 打开解压后的项目。

步骤 2:向项目添加 Spring Shell

Spring Shell 可以帮助你使用 Spring Boot 编写简单的终端程序。在撰写本文时,Spring Initializr 不提供 Spring Shell 选项,但你仍然可以通过手动将依赖项添加到项目中来使用它。

在你的 IDE 中打开 Maven pom.xml 文件,并将以下 xml 添加到 <dependencies> 部分中

<dependency>
    <groupId>org.springframework.shell</groupId>
    <artifactId>spring-shell-starter</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

这将为你新的 RSocket 客户端项目启用 Spring Shell。

步骤 3:编写代码

需要进行一些简短的编码任务,才能将 Spring Shell 和 RSocket 支持添加到新的 RSocket 客户端应用程序中。它们如下所示

删除测试

你可以删除自动生成的 RsocketclientApplicationTests 测试类。如果你不删除,在运行 Spring“集成”测试时可能会出现奇怪的情况。有关详细信息,请参阅 此处 Spring Shell 文档 中的注意事项部分。

从服务器代码复制 Message 类

io.pivotal.rsocketserver.data 包中复制 Message.java 数据类。这个包位于你在上一篇文章中处理的 rsocket-server 项目文件夹中。你需要这个类才能与服务器交换消息。

创建 RSocketShellClient 类

io.pivotal.rsocketclient 包中,创建一个名为 RSocketShellClient 的新类,并用 @Slf4j@ShellComponent 注解此类别。第一个注解告诉 Lombok 为此类添加日志功能,第二个注解告诉 Spring 你正在构建一个基于 Shell 的组件。

@Slf4j
@ShellComponent
public class RSocketShellClient {
 // Your code will go here...
}

设置你的 RSocketRequester

RSocket 客户端需要知道它在哪里可以找到 RSocket 服务器并与之通信。Spring RSocket 支持由 Spring Boot 自动配置,你只需构建一个定制的 RSocketRequester。你可以通过添加一个类构造函数并使用 RSocketRequester.Builder 来完成此操作,如下所示

// Add a global class variable for the RSocketRequester
private final RSocketRequester rsocketRequester;

// Use an Autowired constructor to customize the RSocketRequester and store a reference to it in the global variable
@Autowired
public RSocketShellClient(RSocketRequester.Builder rsocketRequesterBuilder) {
    this.rsocketRequester = rsocketRequesterBuilder
            .connectTcp("localhost", 7000).block();
}

请求者的 connectTcp() 方法需要知道 RSocket 服务器的 IP 地址和端口,并且你需要告诉请求者 block() 直到建立连接。之后,你就可以通过 TCP 与 RSocket 服务器通信了。

添加请求-响应 Shell 方法。

在 Spring Shell 组件中添加 Shell 功能相当简单。首先,在 RSocketShellClient 中添加一个返回 void 的公共 requestResponse() 方法,并在方法签名上使用 @ShellMethod 注解来激活 Spring Shell 并声明用户在键入 help 时将看到的帮助文本。

在方法内部,使用对 RSocketRequester 的全局引用,并将 route() 设置为 "request-response",将 data() 设置为一个新的 Message 实例,并告诉请求者 retrieveMono() 类型为 Message。最后,向 subscribe() 方法添加一个简单的日志函数。其代码如下

    @ShellMethod("Send one request. One response will be printed.")
    public void requestResponse() throws InterruptedException {
        log.info("\nSending one request. Waiting for one response...");
        Message message = this.rsocketRequester
                .route("request-response")
                .data(new Message(CLIENT, REQUEST))
                .retrieveMono(Message.class)
                .block();
        log.info("\nResponse was: {}", message);
    }

RSocket 旨在处理长时间运行的异步数据流。这最有效地通过你已经熟悉的 Java 8 Stream API 的函数式编程风格来完成。

上面的代码说明了当(且仅当)有消息工作要做时你希望发生什么。在这种情况下,你已承诺发送一个请求消息,路由到服务器的 "request-response" 处理方法,并且你期望收到一个响应消息。这个过程由对 block() 方法的调用触发。没有它,什么都不会发生。

编码到此结束。让我们来运行它!

步骤 4:构建并运行 RSocket 服务器

作为我们的服务器,你将使用上一篇文章中的代码。打开一个终端窗口,进入 rsocket-server 目录,然后使用 Maven wrapper 运行服务器代码,如下所示

cd rsocket-server
./mvnw clean package spring-boot:run -DskipTests=true
```bash

The server will start up on `localhost` port `7000` and wait for your client to connect.

# Step 5: Build And Run The RSocket Client

To run your RSocket client, open a second terminal window and move to your `rsocket-client` directory. From there, build and run the client as follows:

```bash
cd rsocket-client
./mvnw clean package spring-boot:run -DskipTests=true

当客户端启动完成时,你将看到一个新的命令行提示符,如下所示

shell:>

你可以使用此提示符向 Spring 应用程序发出命令,类似于通过常规终端应用程序发出命令。

让我们向服务器发送一条请求消息并观察响应。在提示符处键入 request-response。然后你将看到请求和响应消息的发送和接收,如下所示

shell:>request-response
Sending one request. Waiting for one response...
Response was: Message(origin=Server, interaction=Response, index=0, created=1582558295)
shell:>

为简洁起见,我省略了此处大部分日志详细信息。你的输出将比所示的更详细,但结果将是相同的。

你现在可以通过在 shell:> 提示符下键入 exit 来停止 rsocket-client。你可以通过在其终端窗口中按 Ctrl-C 或关闭它来停止 rsocket-server

工作原理

Spring Shell 允许你使用 Spring Boot 构建和运行类似终端的程序。在你的 Shell 组件的构造函数中,你配置了一个 RSocketRequester,使其能够通过 localhost 端口 7000 上的 TCP 与你的服务器通信。

然后你在你的 shell 组件中创建了一个 requestResponse() 方法并对其进行注解,这样当你 shell 提示符下键入 request-response 时,Spring Shell 就会调用此方法。

requestResponse() 方法被调用时,客户端发送了一些描述要使用的 route 的元数据,然后它发送了作为 Message 对象的请求。服务器的响应消息使用一个简单的日志语句打印在屏幕上。

大功告成!

在本文中,你学习了如何使用 Spring Shell 编写一个简单的 RSocket 客户端。这个新客户端通过 TCP 与你的 RSocketServer 通信。在下一篇文章中,我们将通过向客户端和服务器项目添加额外功能来介绍 RSocket 和 Spring Boot 中的即发即忘消息。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有