这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
引入
相比本地函数调用,远程调用的话我们不知道对方有哪些方法,以及参数长什么样,所以需要有一种方式来描述或者说声明我有哪些方法,方法的参数都是什么样子的,这样的话大家就能按照这个来调用,这个描述文件 就是 IDL 文件。 刚才我们提到服务双方是通过约定的规范进行远程调用,双方都依赖同一份IDL文件,需要通过工具来生 成对应的生成文件,具体调用的时候用户代码需要依赖生成代码,所以可以把用户代码和生成代码看成一个整体。 关键问题
- 跨语言的数据交换格式
- 制定通讯协议,
- 数据传输
- 网络模型
分层设计
编解码层
数据格式
- 语言特定格式 好处:语言内建支持 坏处:安全性兼容性
- 文本格式 JSON CSV 好处:可读性 坏处:性能差
- 二机制格式 TLV Varint 好处:高性能(pb,thrift)
需要考虑的问题:
- 兼容性 支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
- 高性能 从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
- 通用性 支持跨平台、跨语言
协议层
协议是 RPC 的核心,它规范了数据在网络中的传输内容和格式。除必须的请求、响应数据外,通常还会包含额外控制数据,如单次请求的序列化方式、超时时间、压缩方式和鉴权信息等。
协议的内容包含三部分
数据交换格式: 定义 RPC 的请求和响应对象在网络传输中的字节流内容,也叫作序列化方式 协议结构: 定义包含字段列表和各字段语义以及不同字段的排列方式 协议通过定义规则、格式和语义来约定数据如何在网络间传输。一次成功的 RPC 需要通信的两端都能够按照协议约定进行网络字节流的读写和对象转换。如果两端对使用的协议不能达成一致,就会出现鸡同鸭讲,无法满足远程通信的需求。