go语言-RPC篇 | 青训营

84 阅读3分钟

什么是RPC

go语言中,RPC(remote procedure calls 远程过程调用)是一种用于在不同计算机上或网络中的程序之间进行通信的控制。通过RPC,可以调用远程服务器上的函数或方法,就想调用本地函数一样,屏蔽了网络通信的细节。go语言标准库中也提供了内置的RPC包,所以go语言中使用RPC的方法比较简单。

RPC需要解决的问题

  1. 函数映射
  2. 数据转换成字节流
  3. 网络传输

一次RPC的完整过程

完整的过程主要包括以下几个阶段:

  1. IDL(Interface description language)文件---用于描述接口
  2. 生成代码--通过编译器工具把IDL文件转换成语言对应的静态库
  3. 编解码--内存内容和字节序列的相互转换
  4. 通信协议--根据通信协议,将内容规范格式
  5. 网络传输--将规范好的信息传输实现调用

编解码的设计

编解码的数据格式采用二进制编码,该格式具有跨语言和高性能等优点。另外,我觉得采用二进制编码,可能还有一个因素就是计算机存储信息也是使用二进制编码。 二进制编码的方式--Tag:数据类型 Length:长度 Value:数据值 选型方面需要从三个方面去考虑:兼容性,通用性,性能。

协议层

概念: 特殊结束符--作为每个协议单元结束的指示。 (个人理解)因为协议层会有需要个协议单元,为了避免读取错误,需要一个标志来告知我们后面的不属于这个协议单元。 变长协议--协议单元的内容长度不是固定的,我们需要提前告知是否变长,变长多少,来方便我们刚刚好获取到指定部分,不遗漏。 协议构造:LENGTH---数据包大小,不包含自身 HEADER MAGIC---标识版权信息,协议解析是快速检验 SEQUENCE NUMBER---表示数据包的seqID,可用于多路复用,单连接内递增。 HEADER SUZE---头部长度 PROTOCOL ID---编解码方式,Binary/Compact INFO ID---传递一些定制的meta信息 PAYLOAD---消息体 协议解析: 首先我们需要找到传输消息的区域,然后根据该区域识别编码的方式,最后解码成可以识别的传输内容。

网络通信层

选型网络库的主要因素:提供的API是否好用,功能是否比较完善,性能如何。

个人对于RPC的理解

RPC,我觉得它根本上可以理解成一个编码解码的过程,只是这个过程多了一些其他的步骤。又或者说,我觉得它像是一个传声筒,接收传来信息,然后用自己的语言翻译来获取真正的内容。