RSocket是一个类似于HTTP的通讯协议。在了解Rsocket协议之前,先简单介绍下HTTP协议。

之所以推出springboot的技术,一个原因是因为前后端设计的分离。因为基于HTTP协议可以直接返回REST数据内容。

REST是一个简单且容易使用的异构处理架构,REST对于浏览器有这非常好的支持,同时也便于开发者进行测试。然而,当前所采用的REST架构大多是基于HTTP/1.1协议实现的,它存着这如下的问题。

HTTP简介

  • HTTP/1.1采用的是重文本传输,在某些场景下会给微服务带来巨大的负荷。 
  • HTTP属于无状态协议,对于一些附加头信息往往只能采用非压缩的方式进行传输。
    • HTTP/1.1是基于TCP协议设计实现的,而TCP协议在进行处理的时候为了及时的回收资源,所以每次都及时的释放连接,连接一旦断开,自然HTTP协议就成了无状态的协议了。所以就有了session的概念来区分。
  • HTTP/1.1协议属于一元操作,所以用户每发送一个请求才可以得到一个响应。(Request-Per-Response),在未接收到响应之前,不能够发送其他请求。(如果当前的资源已经耗尽了,于是就必须等待有连接释放才可以操作。)
  • HTTP协议是基于TCP协议完成,所以需要采用三次握手和四次挥手的方式来保证连接的可靠性,这样的操作会非常耗时,从而影响微服务的整体性能。

在HTTP /3.0标准之前所有的HTTP协议都是基于TCP协议实现的。所以在HTTP/1.0协议版本中每一次用户请求对服务器都需要创建有一个新的TCP连接(三次握手和四次挥手)。而为了解决TCP性能问题,在HTTP/1.1协议版本中提出了TCP连接复用的支持,但是此时的连接复用在每次只允许一个用户的请求进行处理,而当该请求处理完成之后才允许其他请求继续使用此TCP连接进行请求处理。(相当于没有叫号的银行排队,排在该窗口的前面那个人不知道什么时候能办理完成业务)。在HTTP/2.0中对连接操作进行了进一步的改善,允许一个TCP连接同时实现多个客户端的请求处理,这样即便是某一个请求操作耗时,但是也不会影响整体的性能。

所以在HTTP/3.0协议版本中使用QUIC作为新的传输层协议,QUIC基于UDP协议实现,同时也自带多路复用结构。 

但是,性能的问题可以依靠数量来解决,既然HTTP协议的性能不高,那么就需要多增加一些服务节点,多个节点统一提供集群服务。

RSocket简介

        虽然在浏览器和后端之间,使用Rest是最佳的做法,但是为了避免以上的问题,所以需要采用一些比Rest更好的方式来实现微服务之间的通讯处理。在这样的背景下,有Facebook,Netifi,和Pivotal等工程师开发了一种新的协议-RSocket通信协议。

该协议采用二进制点对点数据传输,主要应用于分布式架构之中,是一种基于Reactive Stream规范标准实现的新的网络通信OSI模型第七层(应用层)协议。随着响应式编程技术的不断普及,RSocket协议在网络通信(特别是移动通讯)中会有着非常重要的发展前景。

 RSocket协议具有多路复用(Multiplexed)、双向流(BIdirectional Streaming)、流控(Flow Control)、连接恢复(Socket Resumption)、异步消息传递(Asynchronous Message Passing)、传输层解耦(Transport independent)等主要特点。

1、多路复用二进制协议(Mutiplexed Binary Protocol)

         多路复用是当今通讯行业的宠儿,包括各种的组件应用都存在有大量的多路复用的实现。(Redis缓存数据库)

        在HTTP/2.0协议中重点的问题是解决了TCP连接多路复用的问题,但是在TCP协议中一切的数据都是以文本的形式进行传输,所以在实际的开发中就会存在有数据传输过大以及传输结构受限的问题,而RSocket是一个二进制协议,可以方便的进行各种数据的传输,同时没有数据格式的限制,用户也可以根据自身的需要进行压缩处理。

        在RSocket中将消息分为数据(data)和元数据(metadata)两个组成部分,这样可以保证在高速数据传输下依然可以对外暴露少量元数据给其他服务调用(服务监控)。

 RSocket实现了双向流通讯支持,利用双向流可以实现服务端与客户端之间的通讯处理,这样在请求和响应的处理过程中,客户端可以向服务器发送请求,服务器端也可以向客户端发送请求。

 2、RSocket四种数据交互模式:

1、Request-And-Response:请求/响应,类似于HTTP通信特点,提供异步通信与多路复用的支持。

2、Request-Response-Stream:请求/流式响应,一个请求对应多个流式的响应,例如:获取视频列表和产品列表;

3、Fire-And-Forget:异步触发,不需要响应,可以用于进行日志记录 。

4、Channer(bi-directional streams):双向异步通讯,消息流在服务器端与客户端两个方向上异步流动。

3、流控(Flow Control)

        在分布式的项目环境中,如果说生产者生产的数据过快,就会导致消费者无法进行及时处理,最终有可能出现内存与CPU的占用率增高,从而出现服务端或客户端无响应的情况。如果没有进行良好的实现控制,那么久有可能由于雪崩问题而导致整个应用集群的瘫痪。为了避免这样情况的出现,就需要一套流控机制来协调生产者与消费者之间的处理速度。

        而RSocket中提供了Stream Level流量控制,由于RSocket作为一个应用层协议,所以采取的并不是基于字节的网络层实现流控,而是基于应用层帧数的流量控制。(控制生产者生产的消息数量)。

        雪崩:由于向其他服务调用,其他服务无法提供服务,进而导致本服务崩溃。

 4、连接恢复

         由于移动网络的兴起,所以在网络连接的稳定性上就出现了较大的挑战,当网络出现故障后应该及时进行连接恢复,在RSocket中提供有连接恢复(Connection Resumption)功能,同时为了简化用户操作,在连接恢复成功后不会有任何的感知,而在连接恢复失败时才会通过onError事件触发相应的回调函数,这样在进行Stream时可以保持响应,同时减少重复信息的传输,因为在多路复用的结构中如果重复传输则意味着网络压力的增加。

        RSokcet中提供的"Sokcet Resumption"恢复机制,恢复实现的核心原理在于重新建立网络连接后不从头处理用户请求,客户端和服务端需要能够在连接中断开后的一段时间内自动保存该Connection上的Stream状态。而在恢复连接后,客户端会将此状态信息发送给服务器端,服务器端会进行恢复判断,如果成功恢复则继续之前的Stream操作。

5、异步消息传递(Asynchromous Message Passing)

        RSocket的协议在进行数据传输时采用的是异步消息传递的形式,所传输的内容为Frame(应用层帧,例如:FrameHeader RESUME等),同时在RSocket传输中并不像HTTP协议那样包含有明确的目标访问路径,所有访问全部由路由模块负责实现。

        RSocket协议在数据传输时消息使用帧来进行封装,每个帧可能是请求内容,响应内容或与协议相关的数据信息,而一个应用消息可能被切分为多个不同的片段来保存在一个帧中。

6、传输层解耦合(Transport independent)

        RSocket协议是一个应用层的面向连接协议,不依赖于传输层协议,所以可以由用户自由选择不同的应用场景。例如:在进行数据中心构建时可以使用TCP处理,而进行浏览器异步交互时,可以使用WebSocket处理,在进行HTTP服务时可以使用HTTP/2.0处理。 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐