go语言基础学习 | 青训营笔记

38 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第7天。今天继续学习RPC。

1675513614321.png

如上图所示,这是生成代码的原理。客户端和服务器依赖同一份IDL文件,去生成不同语言的CodeGen,然后根据编写的语言将代码输出。

而有关编解码层,可分为语言特定编码格式、文本格式和二进制编码。

语言特定编码格式:这种编码形式好处是非常方便,可以用很少的额外代码实现内存对象的保存与恢复,这类编码通常与特定的绾程语言深度绑定,其他语言很难读取这种数据。如果以这类编码存储或传输数据,那你就和这门语言绑死在一起了。安全和兼容性也是问题。

文本格式:文本格式具有人类可读性,数字的编码多有歧义之处,比如DXM和CSV不能区分数字和字符串,SON虽然区分字符串和数字,但是不区分整数和浮点数,而且不能指定精度,处理大量数据时,这个问题更严重了;没有强制模型约束,实际操作中往往只能采用胶档方式来进行约定,这可能会给调试带来一些不便。由于SON在一些语言中的序列业和反序列化需要采用反射机制,所以性能比较差。

二进制编码:实现可以有很多种,TLV编码和Varint编码。

而所谓TLV编码,其图如下图所示。

1675513818933.png

TLV编码结构简单清晰,并且扩展性较好,但是由于增加了Type和Length两余信息,有额外的内存开销,特别是在大部分字段都是基本类型的情况下,有不小的空间浪费。

更多内容将在之后学习。