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
  • 依赖项:RSocketLombok

单击绿色的“生成”按钮。下载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();
}

requester的connectTcp()方法需要知道您的RSocket服务器的IP地址和端口,并且您需要告诉requester在建立连接之前block()。之后,您可以通过TCP与RSocket服务器通信。

添加请求-响应Shell方法。

在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()方法的调用触发。没有它,什么也不会发生。

编码到此为止。让我们运行它!

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

作为我们的服务器,您将使用上一篇文章中的代码。打开一个终端窗口并移动到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消息。

获取Spring通讯

关注Spring通讯

订阅

领先一步

VMware提供培训和认证,以加速你的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部