SpringBoot创建RSocket服务器的全过程记录

前言

在微服务的多样化世界中,HTTP是代理到代理通信中无可争议的领导者。它成熟,无处不在。但在某些情况下,HTTP请求-响应可能很麻烦。如果您需要传统请求-响应之外的通信模式,如fire-and-forget或streaming,该怎么办?如果你想向任何一个方向发送信息呢?

有了HTTP,有很多方法可以实现这一点,但这不是构建协议的目的。许多解决方案都带有额外的权衡或缺点。另外,这里没有规则手册说“你应该一直使用HTTP”,像AMQP这样的消息传递协议已经证明了这一点。所以,知道你的选择是什么是好的,每隔一段时间在你的列表中添加一些新技术也是健康的。这篇文章是关于一个这样的替代RSocket。

RSocket是一种新的消息传递协议,旨在解决一些常见的微服务通信难题。使用RSocket,您可以获得一个在TCP或WebSockets上工作的灵活协议。这意味着您可以在不进行转换的情况下处理二进制消息。您可以使用诸如多路复用、背压、恢复和路由等现代控件,还可以使用多种消息传递模式,包括启动和忘记、请求-响应和流式传输。RSocket也是完全反应的,因此它非常适合于高吞吐量的微服务应用程序。早期采用者包括Netflix、Pivotal、阿里巴巴和Facebook,它们都是提供可伸缩互联网服务的专家。

由于请求-响应是大多数web开发人员熟悉的基础,因此我们将以这种模式开始我们的RSocket之旅。请求-响应的语义相当简单,您发送一个请求,就得到一个响应。HTTP是建立在这个基本的交互之上的,它非常常见。

在本文中,您将了解如何使用RSocket,使用Spring Boot作为服务器,使用终端应用程序作为客户机来执行请求响应。

请求-响应Request-response只是Spring和RSocket支持的四种交互模型之一。

当您按照下面的步骤操作时,您会注意到使用springboot构建RSocket服务器所需的代码量非常少。这里已经为您提供了代码,但是您也可以在几分钟内自己从头开始编写代码。

步骤1:设置环境

首先,检查是否安装了以下必备组件:

  • Java8或更高版本的JavaSDK(要检查,请在终端使用Java-version)
  • 一个工作的javaide(我正在使用IntelliJ IDEA)
  • 包含克隆或提取的演示代码示例的文件夹。
  • Linux Bash/ZSH shell(如果您是Windows用户,请查看下面的注释)

如果您是Windows用户,请切换到Microsoft针对Linux的Windows子系统。

现在,将下载的项目文件夹设置为终端中的当前目录:

cd spring-rsocket-demo

在终端中,下载JAR文件如下:

cd rsocket-server
wget -O rsc.jar https://github.com/making/rsc/releases/download/0.4.2/rsc-0.4.2.jar

稍后您将使用此客户机与RSocket服务器进行对话,但现在,通过如下方式调用help命令来测试它是否正常工作:

java -jar rsc.jar --help

您应该会看到下面这样的一些输出(我已经截断了),解释了命令的用法和选项。

usage: rsc Uri [Options]

Non-option arguments:
[String: Uri]

Option                              Description
------                              -----------
--channel                           Shortcut of --im REQUEST_CHANNEL
-d, --data [String]                 Data. Use '-' to read data from

...

把这个终端窗口开着,你以后会需要的。

步骤2:检查服务器代码

在IDE中打开rsocket服务器项目并检查代码。如您所见,在springboot中支持RSocket服务器所需的代码非常少。以下是一些亮点:

项目文件

在项目的pom.xml文件中,您可以看到Spring Boot RSocket服务器所需的<dependencies>。之所以使用SpringBootVersion2.2.5.RELEASE,是因为在撰写本文时,该版本具有最适合生产的RSocket特性。该项目还依赖于lombok和springbootstartersocket库。Lombok为Java数据类添加了构造函数、getter、setter和equals,还简化了对日志等内容的访问。RSocket的springbootstarter将RSocket与springboot集成在一起,并在运行时自动为您配置一些RSocket基础设施。

应用程序属性

在application.properties文件中,RSocket服务器的TCP端口被设置为7000,Spring Boot的延迟初始化功能被打开。

spring.rsocket.server.port=7000
spring.main.lazy-initialization=true

消息类

第一个更详细的类叫做Message.java。这个Lombok@Data类用于对客户机和服务器(或者“requester”和“responder”,如果您愿意的话)之间的请求和响应消息进行建模。这个类看起来像这样…

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message {
    private String origin;
    private String interaction;
    private long index;
    private long created = Instant.now().getEpochSecond();

    public Message(String origin, String interaction) {
        this.origin = origin;
        this.interaction = interaction;
        this.index = 0;
    }

    public Message(String origin, String interaction, long index) {
        this.origin = origin;
        this.interaction = interaction;
        this.index = index;
    }
}

使用这个类,您可以说一条消息来自何处(它的来源),它打算使用哪种消息传递样式(交互),以及消息序列中的序列号(它的索引)。Lombok通过提供构造函数、getter、setter、toString和hashcode实现来简化代码。

控制器类

RSocket服务器控制器代码可以在RSocketController.java文件中找到。这个类被注释为Spring@Controller,这本质上意味着它声明了服务端点(在本例中为RSocket endpoints)。

@Controller
public class RSocketController {

    @MessageMapping("request-response")
    Message requestResponse(Message request) {
            log.info("Received request-response request: {}", request);
            // create a single Message and return it
            return new Message(SERVER, RESPONSE);
    }
}

在类中,有一个名为requestResponse()的方法,它接受单个消息对象(请求)并返回单个消息对象(响应)。

您会注意到,这个requestResponse()方法用@MessageMapping(“request-response”)注释修饰。此注释声明任何包含请求-响应的RSocket路由的元数据的消息都应该由此方法处理。稍后从客户端发送请求消息时,您将使用此路由。

你注意到这和Spring的REST控制器有什么不同吗?对于REST控制器,URL路径映射(如/hello)用于将HTTP调用与其处理程序方法相关联。

这就是代码。我们试试看。

步骤3:启动Spring Boot RSocket服务器

在第二个终端窗口中,保持现有终端窗口处于打开状态,将rsocket server文件夹设置为当前目录。然后使用以下命令构建并运行RSocket服务器:

./mvnw clean package spring-boot:run -DskipTests=true

或者,如果愿意的话,可以在javaide中使用“Build”和“Run”命令。

步骤4:使用RSocket CLI向服务器发送命令

接下来,您将使用在步骤1中下载并测试的RSocket client rsc.jar向正在运行的服务器发送一条消息。返回到原来的终端窗口,在那里有--help文本并发出以下命令:

java -jar rsc.jar --debug --request --data "{\"origin\":\"Client\",\"interaction\":\"Request\"}" --route request-response tcp://localhost:7000

您将注意到该命令声明了一个RSocket消息路由(这是通过添加--route选项并指定路由的名称来实现的)。在本例中,路由是请求-响应,它与RSocketController.java中请求-响应处理程序方法中声明的@MessageMapping匹配。

当命令运行时,您将在终端窗口中看到一些调试信息,解释在请求-响应交互期间发生的事情。它看起来像这样:

2020-02-27 11:20:21.806 DEBUG --- [actor-tcp-nio-1] i.r.FrameLogger : sending ->
Frame => Stream ID: 1 Type: REQUEST_RESPONSE Flags: 0b100000000 Length: 69
Metadata:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 10 72 65 71 75 65 73 74 2d 72 65 73 70 6f 6e 73 |.request-respons|
|00000010| 65                                              |e               |
+--------+-------------------------------------------------+----------------+
Data:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 7b 22 6f 72 69 67 69 6e 22 3a 22 43 6c 69 65 6e |{"origin":"Clien|
|00000010| 74 22 2c 22 69 6e 74 65 72 61 63 74 69 6f 6e 22 |t","interaction"|
|00000020| 3a 22 52 65 71 75 65 73 74 22 7d                |:"Request"}     |
+--------+-------------------------------------------------+----------------+
2020-02-27 11:20:21.927 DEBUG --- [actor-tcp-nio-1] i.r.FrameLogger : receiving ->
Frame => Stream ID: 1 Type: NEXT_COMPLETE Flags: 0b1100000 Length: 81
Data:
         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 7b 22 6f 72 69 67 69 6e 22 3a 22 53 65 72 76 65 |{"origin":"Serve|
|00000010| 72 22 2c 22 69 6e 74 65 72 61 63 74 69 6f 6e 22 |r","interaction"|
|00000020| 3a 22 52 65 73 70 6f 6e 73 65 22 2c 22 69 6e 64 |:"Response","ind|
|00000030| 65 78 22 3a 30 2c 22 63 72 65 61 74 65 64 22 3a |ex":0,"created":|
|00000040| 31 35 38 32 38 30 32 34 32 31 7d                |1582802421}     |
+--------+-------------------------------------------------+----------------+
{"origin":"Server","interaction":"Response","index":0,"created":1582802421}

您看到的调试输出被分成三个“消息帧”。第一个消息帧被标记为Metadata。在本例中,它显示发送到服务器的路由元数据(请求-响应)。第二帧显示客户机发送给服务器的数据消息(一个JSON字符串)。第三帧显示服务器返回给客户机的响应消息(也是一个JSON字符串)。

在最后一行,您可以看到来自服务器的JSON格式的响应被单独打印出来,确认我们的命令消息已被服务器成功接收和确认:

{"origin":"Server","interaction":"Response","index":0,"created":1582802421}

你刚刚使用RSocket发送了一条请求-响应消息。现在可以通过在终端窗口中按Ctrl-C或关闭RSocket服务器来停止RSocket服务器。如果您使用IDE运行RSocket服务器,您可以用通常的方式停止IDE中的进程。

工作原理

你下载的RSocket rsc客户端使用RSocket消息传递协议向RSocketController发送请求消息。消息通过TCP发送到tcp://localhost:7000服务器正在等待的位置。

在第一消息帧中发送消息路由指令。此路由指令使用CLI客户端的--route选项设置,并设置为request-response。Spring使用这个路由信息来选择正确的@MessageMapping端点来调用requestResponse(Message-request)方法。然后,该方法用自己的消息进行响应。CLI客户机将终端窗口中的整个交互打印为一系列消息帧。

如果您继续下去,您会发现使用springboot编写一个简单的RSocket服务器是多么容易。

原文地址:https://spring.io/blog/2020/03/02/getting-started-with-rsocket-spring-boot-server

总结

到此这篇关于SpringBoot创建RSocket服务器的文章就介绍到这了,更多相关SpringBoot创建RSocket服务器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Spring Boot中使用RSocket的示例代码

    1. 概述 RSocket 应用层协议支持 Reactive Streams 语义, 例如:用RSocket作为HTTP的一种替代方案.在本教程中, 我们将看到 RSocket 用在spring boot中,特别是spring boot 如何帮助抽象出更低级别的RSocket API. 2. 依赖 让我们从添加 spring-boot-starter-rsocket 依赖开始: <dependency> <groupId>org.springframework.boot</g

  • SpringBoot创建RSocket服务器的全过程记录

    前言 在微服务的多样化世界中,HTTP是代理到代理通信中无可争议的领导者.它成熟,无处不在.但在某些情况下,HTTP请求-响应可能很麻烦.如果您需要传统请求-响应之外的通信模式,如fire-and-forget或streaming,该怎么办?如果你想向任何一个方向发送信息呢? 有了HTTP,有很多方法可以实现这一点,但这不是构建协议的目的.许多解决方案都带有额外的权衡或缺点.另外,这里没有规则手册说"你应该一直使用HTTP",像AMQP这样的消息传递协议已经证明了这一点.所以,知道你的

  • SpringBoot轻松整合MongoDB的全过程记录

    前言 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 提示:以下是本篇文章正文内容,下面案例可供参考 一.技术介绍 1.MongoDB是什么? MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据库.作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新.与此同时,它也为开发人员 提供

  • springboot打war包的全过程记录

    目录 为什么要把SpringBoot打成war包 springboot打war包 分步指南 总结 为什么要把SpringBoot打成war包 正常情况下SpringBoot项目是以jar包的形式,通过命令行: java -jar demo.jar 来运行的,并且SpringBoot是内嵌Tomcat服务器,所以每次重新启动都是用的新的Tomcat服务器.正因如此,也出现了一个问题:上传到项目的文件,如果是保存在项目中的,那么重启过后文件就会丢失.比如我们上传了一个头像,重启项目后,这个头像就没了

  • .NET Core使用Topshelf方式创建Windows服务的全过程记录

    前言 Topshelf是一个.NET Standard库,它消除了在.NET Framework和.NET Core中创建Windows服务的那些麻烦. 安装 Install-Package Topshelf 代码 using System; using System.Collections.Generic; using System.Text; using Topshelf; namespace ConsoleApp2222 { public class LoggingService : Se

  • 利用Pycharm连接服务器的全过程记录

    前言 当下,很多深度学习的模型需要高配置的设备来跑,本地的pc可能无法满足要求.所以就需要利用服务器来训练,但是在服务器上操作代码不是很方便.利用Pycharm可以在本地编写/修改代码,能够同步到服务器上,并且能直接在本地利用pycharm运行同步到服务器上的代码.非常的方便. - 前提 一台装有anaconda的服务器,本地装了专业版的pycharm. 操作步骤 步骤一:在pycharm上使用服务器的python环境 用pycharm任意打开一个项目,从工具栏中选择File–Settings

  • SpringBoot多数据源配置的全过程记录

    目录 前言 配置文件 依赖 构建 AbstractRoutingDataSource 数据源切换 目录 总结 前言 多数据源的核心就是向 IOC 容器注入 AbstractRoutingDataSource 和如何切换数据源.注入的方式可以是注册 BeanDefinition 或者是构建好的 Bean,切换数据源的方式可以是方法参数或者是注解切换(其他的没想象出来),具体由需求决定. 我的需求是统计多个库的数据,将结果写入另一个数据库,统计的数据库数量是不定的,无法通过 @Bean 直接注入,又

  • SpringBoot创建多模块项目的全过程记录

    构建项目 我们采用IntelliJ IDEA工具来创建一个Maven项目,项目的pom.xml要添加对应SpringBoot的配置,因为Maven多模块项目内的模块并不能独立的存在,必须有一个介质来包含,项目结构如下下图所示 我们创建的Maven项目结构如上图所示,pom.xml内我们对应的添加了对SpringBoot的支持,因为我们需要使用SpringBoot来作为项目基本框架,并在pom.xml配置文件引入了Web模块的支持,所以介质项目内的Module都会用于Web依赖 我们在介质Mave

  • 从零开始搭建springboot+springcloud+mybatis本地项目全过程(图解)

    记录一下从零开始搭建一个springboot+springcloud+mybatis本地项目的demo的过程.纯代码小白一枚,若有不足或错误之处,欢迎广大朋友指出! 开发环境准备: IDE:IntelliJ Idea 2019.3 数据库:mysql 8.0.2.2 SpringBoot版本:2.2.0.RELEASE SpringCloud版本:Hoxton.RELEASE 一.创建一个新的Idea项目 打开Idea,单击New->File->Project,选择Maven,直接下一步 输入

  • Springboot实现多服务器session共享

    本文实例为大家分享了springboot实现多服务器session共享的具体代码,供大家参考,具体内容如下 环境: springboot:2.0.4 redis:3.2.100 jdk:1.8 eclipse:4.9.0 1.原理 正常情况下,HTTPSession是通过servlet容器创建并管理的,创建成功后都保存在内存中,如果开发者需要对项目进行横向拓展搭建集群,那么可以用一些硬件和软件工具来做负载均衡,此时,来自同一用户的HTTP请求有可能会被发送到不同的实例上去,如何保证各个实例之间的

  • springboot添加https服务器的方法

    什么是https 要说https我们得先说SSL(Secure Sockets Layer,安全套接层),这是一种为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密.SSL协议可以分为两层:SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议如TCP之上,为高层协议提供数据封装.压缩.加密等基本功能支持:SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际数据传输开始之前,通信双方进行身

随机推荐