RSocket入门:Spring Boot服务器 -Spring.io


在微服务的多样化世界中,HTTP无疑是代理到代理通信的领导者。它已经成熟,完善,并且无处不在。但是在某些情况下,HTTP请求响应可能很麻烦。如果您需要基于传统请求响应的通信模式,例如“一劳永逸”或流式传输,该怎么办?如果要向任一方向发送消息怎么办?
RSocket是一种新的消息传递协议,旨在解决一些常见的微服务通信难题。使用RSocket,您可以获得在TCP或WebSockets上运行的灵活协议。这意味着您可以执行二进制消息而无需转换。您将获得诸如多路复用,背压,恢复和路由之类的现代控件,并且您将获得多种消息传递模式,包括即发即忘,请求响应和流传输。RSocket也具有完全反应性,因此非常适合您的高吞吐量微服务应用程序。

这里下载演示代码示例

@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);
    }
}

否注意到这与Spring的REST控制器有什么不同?在REST控制器中,URL路径映射(例如)/hello用于将HTTP调用与其处理程序方法关联。这里使用@MessageMapping("request-response")注解,此注释声明此方法应处理任何包含RSocket路由的元数据消息。稍后,当您从客户端发送请求消息时,将使用此路由。
在application.properties文件中,RSocket服务器的TCP端口设置为7000,并且Spring Boot的惰性初始化功能已打开。

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

Maven配置文件加入依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>

测试:
启动Rsocket服务器:

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

使用RSocket CLI客户端向服务器发送命令:

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

路由request-response与匹配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}