领先一步
VMware 提供培训和认证,助您加速进步。
了解更多时间:约 15 分钟。
在上一篇文章中,您了解了 Spring Boot 如何简化编写 RSocket 服务器的任务。但是 RSocket 客户端呢?在本文中,您将学习如何编写自己的 RSocket 客户端,然后使用这个新客户端向您的 RSocket 服务器发送请求-响应消息。让我们开始吧!
本教程使用 Linux shell。有关如何在 Windows 上运行 Linux shell 的详细信息,请参阅此 Microsoft 教程。
自己编写代码很有趣,因此我们为您的 RSocket 客户端从头开始。
如果这太麻烦,或者您现在没有时间,您可以在演示代码仓库的 rsocket-client 文件夹中找到代码。
打开浏览器,访问 start.spring.io,然后使用以下设置创建一个新的 Spring Boot 项目:
MavenJava2.2.5 (或任何最新的 GA 版本)io.pivotalrsocket-clientRSocket, Lombok点击绿色的 “Generate” 按钮。下载 ZIP 文件并解压项目到一个文件夹中,然后用你喜欢的 Java IDE 打开解压后的项目。
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。
需要进行一些简短的编码任务,才能将 Spring Shell 和 RSocket 支持添加到新的 RSocket 客户端应用程序中。它们如下所示
你可以删除自动生成的 RsocketclientApplicationTests 测试类。如果你不删除,在运行 Spring“集成”测试时可能会出现奇怪的情况。有关详细信息,请参阅 此处 Spring Shell 文档 中的注意事项部分。
从 io.pivotal.rsocketserver.data 包中复制 Message.java 数据类。这个包位于你在上一篇文章中处理的 rsocket-server 项目文件夹中。你需要这个类才能与服务器交换消息。
在 io.pivotal.rsocketclient 包中,创建一个名为 RSocketShellClient 的新类,并用 @Slf4j 和 @ShellComponent 注解此类别。第一个注解告诉 Lombok 为此类添加日志功能,第二个注解告诉 Spring 你正在构建一个基于 Shell 的组件。
@Slf4j
@ShellComponent
public class RSocketShellClient {
// Your code will go here...
}
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 服务器通信了。
在 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() 方法的调用触发。没有它,什么都不会发生。
编码到此结束。让我们来运行它!
作为我们的服务器,你将使用上一篇文章中的代码。打开一个终端窗口,进入 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 中的即发即忘消息。