1. 简介
RSocket 是一种二进制的点对点通信协议,是一种新的网络通信第七层协议。旨在用于分布式应用程序中。从这个意义上讲,RSocket 是 HTTP 等其他协议的替代方案。它是一种基于 Reactive Streams 规范具有异步,背压的双向,多路复用,断线重连,基于消息等特性。它由 Facebook,Netifi 和 Pivotal 等工程师开发,提供 Java,JavaScript,C ++ 和 Kotlin 等实现。
2. 背景
说到这里就有一些疑问了,为什么要搞这个协议?难道程序员吃饱了撑得搞点新东西折腾自己?上面提到了 Reactive Streams 规范。如果你对这个规范不熟悉就需要通过 https://felord.cn 补补课了。这是 java 领域新的响应式规范,Reactor 3、RxJava 都是该规范的实现。webflux、hystrix 总听说过吧。java 9 也吸收了该规范的一些精华。也就是说我们现在可以实现网络通信上的响应式了。响应式一个重要的特性就是背压(backpressure)。http 通信中服务端接收到过多的请求很容易会过载,严重时导致宕机。而通过背压处理可以选择性的响应请求来避免这种情况。还有 http 协议是无状态的,只要有请求不管是有效的还是无效的,是否是重复的,服务器都会进行处理直到完成。如果使用响应式一定程度会大大减少这些无意义的请求。有时候我们需要建立起长连接。就需要借助于 Websocket 来实现。如果使用 RSocket 就很容易建立连接双方的管道。还有其它非常多的场景这里不再一一列举。
## 3. 特性
其实上面也说明了一些 RSocket 的特性。这里简单总结一下:
- 具有语言无关性的二进制通信协议
- 异步非阻塞消息驱动通信, 高性能
- 实现了网络通信的背压处理,在此基础上进行流量控制、连接恢复
- 天然支持双向通信
- 更加适合分布式通信场景
## 4. RSocket 四种交互模型
RSocket 定义了四种交互模型来弥补 Http 协议的不足之处:
- Fire-and-Forget:优化请求 / 响应,在不需要响应时非常有用,例如非关键事件日志记录。
- Request/Response:类似 Http 的请求 / 响应模型 但是具有 Http 没有的优点,它是异步和多路复用的。
- Request/Stream:单个请求可以接收多个响应。例如获取视频列表、获取目录中的产品
-
Channel: 该模型模型提供双向通信。在此模型中,消息流在两个方向上异步流动。例如发生更改时,从服务器向客户端发出增量 / 差异
5. 前景
随着响应式越来越被提及,RSocket 在网络通信的前途是不可限量的。有众多诸如 Facebook、Pivotal 等一线大厂的背书。Spring framework 最近的几次更新都特别对其进行了支持。知名 rpc 框架 Dubbo 从 3 开始也针对 RSocket 进行了适配。目前 RSocket 还处于候选版本,还没有正式版。相对资料较少。而且需要对 Reactive Streams 规范熟悉。相对来说目前学习曲线还是比较陡峭的。不过我们获取可以从中借鉴一些解决问题的思路。
关注公众号:Felordcn 获取更多资讯