前言
这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
今日学习内容:
- 基本概念
- 分层设计
- 关键指标
- 企业实践
1 基本概念
1.1 本地函数调用
编译器执行
1.2 远程函数调用
- 函数映射
- 数据转换成字节流
- 网络传输
1.3 RPC概念模型
RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
1.4 一次RPC的完整过程
-
IDL (Interface description language)文件 IDL通过—种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
-
生成代码 通过编译器工具把IDL文件转换成语言对应的静态库
-
编解码 从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
-
通信协议 规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
-
网络传输 通常基于成熟的网络库走TCP/UDP传输
2.分层设计
以 Apache Thrift 为例
编解码层
生成代码
数据格式
- 语言特定的格式
许多编程语言都内置了将内存对象编码为字节序列的支持,例如 Java 有 Java.io.Serializable。这种编码形式的好处是非常方便,可以用很少的额外代码实现内存对象的保存与恢复,这类编码通常与特定的编程语言深度绑定,其他语言很难读取这种数据。如果以这类编码存储或传输数据,那你就和这门语言绑死在一起了。安全和兼容性也是问题。
- 文本格式
JSON、XML、CSV 等文本格式。文本格式具有人类可读性,但是其数字编码多有歧义之处。比如 XML 和 CSV 不能区分数字和字符串,JSON 虽然能区分数字和字符串,但是不能区分整数和浮点数,而且不能指定精度,处理大量数据时,这个问题更严重了;没有强制模型约束,实际操作中往往只能采用文档方式来进行约定,这可能会给调试带来一些不便。由于 JSON 在一些语言的序列化和反序列化需要采用反射机制,所以性能比较差。