toc
什么是 RSocket
RSocket 是一种二进制协议,可以使用任何字节流传输方式,比如 TCP,UDP,WebSocket,Aeron。
它的官方网站: https://rsocket.io/(链接可能访问不畅)。
它通过单一连接传输异步消息,支持以下几种交互模式:
- 请求 / 响应( 1 : 1 )
- 请求 / 流 ( 1 : N )
- 发射了不管 ( 1 : 0 )
- 双向流( N : N )
它的底层协议符合 Reactive Streams 语义(链接可能访问不畅)。
从它叫 RSocket 这个名字,就能看出它的野心勃勃。这让我想起了当年 ZeroMQ 想成为 Linux 基础网络库呢。
我的一些理解
既然有了 Dubbo,gRPC,HTTP 2,Thrit,XXX… 为什么还需要 RSocket 呢?
拿我最熟悉的 gRPC 来对比,gRPC 也支持那四种交互模式,也是二进制协议,支持多语言,为啥 RSocket 更好呢?
我觉得最重要的,是 RSocket 基于 Reactive Streams 语义,并且是一种比较底层的协议。
Reactive Streams 是比较标准化的东西,JDK 9 直接内置了支持。
上面列举的那些协议,都自带自己的传输方式,使用的范围自然比更底层的协议要窄。
而且,RSocket 得到了多个大厂的支持:
- RSocket 出自 Netflix
- Facebook 将 Thrit 捐给 Apache 基金会后,自己又 Fork 了一个内部分支,底层基于 RSocket
- 阿里的 Dubbo 集成了 RSocket
- Pivotal 使劲将 RSocket 集成入 Spring
Broker 模式
Spring Cloud Gateway 支持 RSocket 的 Broker 模式。
简单说,这种模式是:
- 一堆 Spring Cloud Gateway 组成集群
- 服务生产者和消费者用 Client 模式接入集群,连接时提供注册信息
- 经过上面这么一搞,其实就不分生产者和消费者了,大家可以互相调,通过 Gateway 转发,有点像 SOA 服务总线了
- 由于都是连到集群,只需暴露集群地址,传统意义上的服务端就可以隐藏起来了,安全
- 权限,日志等等都在 Broker 上做
所有请求都通过转发,具体到一个调用,比直接连接要多耗时间。但是,当应用规模大了,复杂了,多花的时间就很值得了:
- 不关心互相调用的权限控制(除了处理跟 Gateway 间的权限)
- 无需单独的服务发现服务
- 没有断路器
- 没有客户端负载均衡
- 没有 Sidecar
- 解决启动顺序问题
- 解决服务热身的问题
- 代替消息队列
很好,你已经成功引起了我的注意!虽然有点新瓶装旧酒的意思,不过还挺期待这种模式赶快成熟呢。