首页 > 其他分享 >如何设计可扩展的RPC协议

如何设计可扩展的RPC协议

时间:2024-07-31 17:30:01浏览次数:13  
标签:协议 扩展 RPC 长度 序列化 数据

如何设计可扩展且向后兼容的RPC协议

为什么不直接用现成的HTTP协议?

RPC的职责是负责应用间的通信,所以性能要求相对更高。而HTTP协议的数据包相对于请求数据本身要大很多,有很多冗余内容(如换行回车等),会影响性能。另外HTTP协议是无状态的协议,每次请求都要重新建立连接。因此对于要求高性能的RPC来说,HTTP协议很难满足要求。

怎样设计一个私有RPC协议?

最简单的协议数据格式

最简单的协议数据格式就是数据长度+数据体,接收方先读一个固定长度的值作为数据长度,然后根据这个长度继续读取对应长度的数据作为数据体。

改进的协议数据格式

使用数据长度+数据体方式只能用来断句,给接收的数据分段,并不能知道数据体中的数据是使用什么序列化方式。因此需要将序列化方式单独拿出来,类似数据长度那样用固定的长度存放,除了序列化方式之外还有其他的参数需要使用固定长度存放,把这些需要固定长度存放的参数统称为协议头。而数据体的长度是可变的。

在协议头中,除了放数据长度,序列化方式,还会放一些协议标识、消息ID、消息类型等参数,而协议体一般只放请求接口方法、请求的业务参数和一些扩展属性。

但是这样的协议还存在一个问题,不可扩展,因为协议头是定长的,如果后面想加入新的参数,就会导致兼容问题。

可扩展的协议

为了保证能平滑地升级改造已有地协议,需要设计一种可扩展地协议。其关键在于让协议头可扩展,也就是说协议头的长度不是固定的。那么就需要一个固定长度的值去获取协议头的长度。整个协议就分成三部分内容:固定部分、协议头内容、协议体内容。前两部分还是可以统称为协议头,具体的协议如下:

标签:协议,扩展,RPC,长度,序列化,数据
From: https://www.cnblogs.com/zawaludo/p/18335077

相关文章

  • Profibus转EtherCAT协议转化网关(功能与配置)
    如何能够把Profibus和EtherCAT通讯连接起来?这几天有几个客户朋友咨询到这个问题,作者在这里统一为大家回复一下。想要解决这个问题其实也非常简单,只需要用到一个设备,名为JM-DPM-ECT。下面作者为大家详细讲解一下该设备的主要功能及详细配置方法。一,设备主要功能捷米特JM-DPM-......
  • 零代码GIS视效升级!一键添加环境效果,支持多种GIS影像协议
    在当今的三维GIS领域,如何轻松实现视效升级?这款免费可视化工具——山海鲸可视化,可以给你提供零代码解决方案。山海鲸可视化从三维GIS需求出发,带来了一键添加环境效果的强大功能,显著提升视觉效果。无论是体积云、体积雾还是其他天气效果,只需简单操作,即可呈现逼真环境场景,让GIS视效焕......
  • RPC核心原理
    什么是RPCRPC就是远程过程调用RPC的作用屏蔽远程调用和本地调用的区别,让我们感觉就是调用本地项目内的方法。隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。RPC通信流程一个完整的RPC会涉及哪些步骤呢?在调用方程序中,RPC框架根据调用的服务接口提前生成动态代理实现类......
  • 扩展 BSGS 学习笔记
    在之前,我们学习了BSGS。设有\(a,b,m\),且\((a,m)\ne1\),求解:\[a^x\equivb\pmodm\]这玩意如何求解?把它变成BSGS能做的形式不就行了!具体的,设\(d_1=(a,m)\),若\(d_1\not|b\)则方程无解。否则我们可以得到:\[\dfrac{a}{d_1}\cdota^{x-1}\equiv\dfrac{b}{d_1}\pmod{\d......
  • 协议加密
    根据上篇,如果我们通讯协议不进行加密,被人抓包后很容易解析出来,这个时候我们就需要对协议进行加密处理,协议传输本质上是传输的二进制字节流,我们可以考虑用一定的方式修改字节数据,最简单的方式是把0改成1,把1改成0,也就是直接取反,这也是一种加密方式,虽然比较容易被破解,意义不大,我们可......
  • SOMEIPSRV_RPC_11: 字段的设定器和有效载荷
    测试目的:验证字段的setter方法是否按照规范要求,通过请求/响应调用实现,其中请求消息的负载包含期望的字段值,响应消息的负载包含已设置到字段的值。描述本测试用例旨在验证DUT(DeviceUnderTest,被测试设备)在接收到字段setter方法的请求时,是否能够正确地在响应消息中返回设......
  • [HTTP] HTTP协议之MIME类型(多媒体资源类型)
    1概述MIME的定义、由来MIME(MultipurposeInternetMailExtensions)多用途互联网邮件扩展类型。MIME是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一......
  • 类型提示和@singledispatch:如何以可扩展的方式包含 `Union[...]`?
    我正在重构一个函数,该函数将各种日期格式(即ISO8601字符串、datetime.date、datetime.datetime等)转换为Unix时间戳。我希望新函数使用@singledispatch而不是类型检查,但我不知道如何保留以前函数的类型提示:旧函数:使用类型检查importdat......
  • 网络安全靶场系列(臃肿版):PbootCMS(V3.2.5)遇到的坑(您的服务器环境不支持gd扩展,将无法使
    PbootCMS(V3.2.5)遇到的坑(您的服务器环境不支持gd扩展,将无法使用验证码!)前言dockerphpgd扩展,docker安装php扩展gd库一、安装nginx、php、mysql镜像二、运行、停止、删除容器三、安装php扩展gd库四、扩展知识1、docker-php-source2、docker-php-ext-enable......
  • Ansible 学习与扩展整理
    一、Ansible基础知识回顾核心组件主机清单(HostInventory):定义了Ansible可以管理的目标机器列表。模块(Modules):Ansible执行特定任务的最小单位,类似于命令行工具或脚本。插件(Plugins):扩展Ansible功能,如连接插件、回调插件等。Playbook:YAML格式的文件,定义了Ansi......