这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
一、基础概念
1.1RPC需要解决的问题
- 函数映射
- 数据转化成字节流
- 网络传输
1.2 基本概念
- IDL文件:IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。相比本地函数调用,远程调用的话我们不知道对方有哪些方法,以及参数长什么样,所以需要有一种方式来描述或者说声明我有哪些方法,方法的参数都是什么样子的,这样的话大家就能按照这个来调用,这个描述文件就是IDL文件。
- 生成代码:通过编译器工具把IDL文件转换成语言对应的静态库。
- 编解码:从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化。
- 通信协议:规范了数据在网络中的传输内容和格式,除必须的请求/响应数据外,通常还会包含额外的元数据。
- 网络传输:通常基于成熟的网络库走TCP/UDP传输。
二、分层设计
2.1 编解码层
二进制编码:具备跨语言和高性能等优点,常见有Thrift的BinaryProtocol,Protobuf等。实现可以有很多种,TLV编码和Varint编码。
2.1.1 TLV编码介绍:
TLV编码结构简单清晰,并且扩展性较好,但是由于增加了Type和Length两个冗余信息,有额外的内存开销,特别是在大部分字段都是基本类型的情况下。
- Tag:标签,可以理解为类型。
- Length:长度。
- Value:值,Value也可以是个TLV结构。
2.1.2 如何进行选择?
- 通用性:是否支持跨平台、跨语言;流行程度。
- 兼容性:更新和扩展是否方便
- 性能:空间开销、时间开销。
2.2 协议层
- 特殊结束符:以一个特殊字符作为每个协议单元结束的标示。HTTP协议头就是以回车加换行符号序列结尾。
- 变长协议:一般都是自定义协议,有header和payload组成,会以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度,使用比较广泛。
2.3 网络通信层
封装底层Socket API。
参考链接
[RPC 框架分层设计 - 掘金 (juejin.cn)](