Dubbo 3.0中常用协议对比及RPC 协议新形态是怎样的

发布时间:2021-12-27 15:31:48 作者:柒染
来源:亿速云 阅读:154

Dubbo 3.0中常用协议对比及RPC 协议新形态是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

协议是 RPC 的基础。数据在连接上以什么格式传输,服务端如何确定收到请求的大小,同一个连接上能不能同时存在多个请求,请求如果出错了应该怎么响应……这些都是需要协议解决的问题。

从定义上讲,协议通过定义规则、格式和语义来约定数据如何在网络间传输。RPC 需要通信的两端都能够识别同一种协议。数据在网络上以比特流的方式传输,如果本端的协议对端不识别,对端就无法从请求中获取到有用信息,就会出现鸡同鸭讲的情况,无法实现上层的业务需求。

Dubbo 3.0中常用协议对比及RPC 协议新形态是怎样的

一个简单的协议需要定义数据交换格式,协议格式和请求方式。

数据交换格式在 RPC 中也叫做序列化格式。常用的序列化有 JSON/Protobuf/Hessian 等,评价序列化优劣一般从三个维度:

协议在选取序列化方式时,按照具体的需求在这三个维度中互相取舍。序列化后的数组越小,越节省网络流量,但序列化过程可能更消耗时间。JSON\XML 这类基于文本的序列化方式往往更容易被开发者接受,因为相比于一连传的字节数组,文本更容易被理解,在各层设备中都能比较容易的识别,但可读性提高的后果是性能大幅降低。

协议格式是和 RPC 框架紧密相关的,按照功能划分有两种,一种是紧凑型协议,只提供用于调用的简单元数据和数据内容。另外一种是复合型协议,会携带框架层的元数据用来提供功能上的增强,这类协议的一个代表就是 RSocket。

请求方式和协议格式息息相关,常见的请求格式有同步 Request/Response 和异步 Request/Response,区别是客户端发出一个请求后,是否需要同步等待响应返回。如果不需要等待响应,一个链接上就可以同时存在多个未完成的请求,这也被叫做多路复用。另外的请求模型有 Streaming ,在一次完整的业务调用中存在多次 RPC,每次都传输一部分数据,适合流数据传输。

有了这三个基本约定,就能实现一个简单的 RPC 协议了。

Dubbo 3.0中常用协议对比及RPC 协议新形态是怎样的

Dubbo3 的一个核心内容就是定义下一代 RPC 协议。除了基础的通信功能,新协议还应该具有以下特性:

这里我们对比一些常用的协议,来探索新协议的形态。

HTTP/1.1

HTTP/1.1 应该是应用最广泛的协议,简单清晰的语法,跨语言以及对原生移动端的支持都让其成为了事实上最被广泛接受的 RPC 方案。

然而从 RPC 协议的诉求上讲, HTTP1.1 主要有以下几个问题

Dubbo 3.0中常用协议对比及RPC 协议新形态是怎样的

RESP

RESP 是 Redis 使用的通信协议,其简洁易于理解的格式也助力了 Redis 各语言客户端的快速发展。但是这种类似 HTTP/1.1 的协议也存在着同样的性能问题。

Dubbo2.0

Dubbo2.0 协议直接定义在 TCP 传输层协议上,为协议功能定义提供了最大的灵活性,但同时也正是因为这样明显的灵活性优势,RPC 协议普遍都是定制化的私有协议。

Dubbo 协议体 Body 中有一个可扩展的 attachments 部分,这给 RPC 方法之外额外传递附加属性提供了可能,是一个很好的设计。但是类似的 Header 部分,却缺少类似的可扩展 attachments,这点可参考 HTTP 定义的 Ascii Header 设计,将 Body Attachments 和 Header Attachments 做职责划分。

HTTP/2.0

HTTP/2.0 保留了 HTTP/1 的所有语义,在保持兼容的同时,在通信模型和传输效率上做了很大的改进,主要也是为了解决 HTTP/1 中的问题。

HTTP/2.0 虽然克服了以上问题,但也存在着一些争议点,比如在 TCP 的上层进行流量控制的必要性以及对 HTTP 语义通过 HPACK 兼容是否过于繁琐复杂。

gRPC

相比较于一些框架将应用层协议构建在裸 TCP 上,gRPC 选择了 HTTP/2.0 作为传输层协议。通过对 Header 内容和 Payload 格式的限定实现上层协议功能。下面是 gRPC 的一些设计理念。

在这样的设计理念指导下,gRPC 最终被设计为一个跨语言、跨平台的、通用的协议。功能上基本已经完全具备或可以轻易扩展出需要的新功能。然而我们知道,软件工程没有银弹,相比较于裸 TCP 专有协议,极限性能上 gRPC 肯定是要差一些。但是对大部分应用来说,相比较于 HTTP/1.1 的协议,gRPC/HTTP2 已经在性能上取得了很大的进步,同时又兼顾了可读性。

序列化上,gRPC 被设计成保持 payload 中立,但实际的跨语言场景需要一个强规范的接口定义语言来保证序列化结果的一致。在 gRPC 的官方实现中,protobuf 和 json 分别用来支持性能场景和开发效率场景。从序列化方式的选择到协议的各维度比较,基于 gRPC 扩展出新的协议是最优的选择。

Dubbo3.0

Dubbo3.0 的协议基于 gRPC ,在应用层、异常处理、协议层负载均衡支持和 Reactive 支持上提供了扩展。主要有三个目标:

除了协议层的支持,Dubbo3.0 新协议还包括易用性方面的支持,包括同时支持 IDL compiler 和 Annotation Compiler。客户端将更完善的支持原生异步回调,Future 异步和同步调用。服务端将使用非反射调用。这将十分显著的提升客户端和服务端性能。从用户迁移的角度,Dubbo 框架将提供平滑的协议升级支持,力求尽可能少的改造代码或配置就能带来成倍的性能提升。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

推荐阅读:
  1. Dubbo架构设计详解
  2. Dubbo的架构及用法

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

dubbo rpc

上一篇:怎么进行新一代垃圾回收器ZGC的探索与实践

下一篇:linux如何修改hostname

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》