领先一步
VMware提供培训和认证,以加速你的进步。
了解更多时间:大约15分钟。
在上一篇文章中,您了解了Spring Boot如何简化编写RSocket服务器的任务。但是RSocket客户端呢?在本文中,您将学习如何编写自己的RSocket客户端,然后使用此新客户端向您的RSocket服务器发送请求-响应消息。让我们开始吧!
本教程使用Linux shell。有关如何在Windows上运行Linux shell的详细信息,请参阅此Microsoft教程。
编写自己的代码很有趣,因此对于您的RSocket客户端,让我们从头开始。
如果您觉得这太麻烦,或者现在没有时间,那么您可以在演示代码仓库的rsocket-client文件夹中找到代码。
打开您的浏览器并导航到start.spring.io,然后使用以下设置创建一个新的Spring Boot项目
Maven
Java
2.2.5
(或任何最新的GA版本)io.pivotal
rsocket-client
RSocket
,Lombok
单击绿色的“生成”按钮。下载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();
}
requester的connectTcp()
方法需要知道您的RSocket服务器的IP地址和端口,并且您需要告诉requester在建立连接之前block()
。之后,您可以通过TCP与RSocket服务器通信。
在Spring Shell组件中添加shell功能相当简单。首先,向RSocketShellClient
添加一个返回void
的公共requestResponse()
方法,并在方法签名上使用@ShellMethod
注解来激活Spring Shell并声明用户在键入help
时将看到的帮助文本。
在方法内部,使用对RSocketRequester
的全局引用并将route()
设置为"request-response"
,将data()
设置为一个新的Message
实例,并告诉requesterretrieveMono()
类型为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包装器运行服务器代码,如下所示
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
,使用TCP协议在本地主机7000端口与你的服务器进行通信。
然后,你在你的shell组件中创建了一个requestResponse()
方法,并对其进行了注解,以便当你输入request-response
到shell提示符时,Spring Shell会调用此方法。
当requestResponse()
方法被调用时,客户端会发送一些元数据来描述要使用的route
,然后它会将请求作为Message
对象发送。服务器的响应消息使用简单的日志语句打印在屏幕上。
在这篇文章中,你学习了如何使用Spring Shell编写一个简单的RSocket客户端。这个新的客户端通过TCP与你的RSocketServer通信。在下一篇文章中,我们将通过向你的客户端和服务器项目添加额外功能来介绍使用RSocket和Spring Boot的fire-and-forget消息。