RPC框架 | 青训营笔记

46 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 14 天

一、本堂课具体内容

  • RPC框架

二、详细知识点介绍:

  • 基本概念

    1. 本地函数调用

    2. 远程函数调用(RPC)

      • RPC要解决的问题

        1. 函数映射
        2. 数据转换成字节流
        3. 网络传输
      • 概念模型

      • 一次RPC的完整过程

        1. IDL (Interface description language)文件

          IDL通过—种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信

        2. 生成代码

          通过编译器工具把IDL文件转换成语言对应的静态库

        3. 编解码

          从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化

        4. 通信协议

          规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据

        5. 网络传输 通常基于成熟的网络库走TCP/UDP传输

      • RPC的好处

        1. 单一职责,开发(采用不同的语言)、部署以及运维(上线独立)都是独立的

        2. 可扩展性强,例如压力过大的时候可以独立扩充资源,底层基础服务可以复用,节省资源

        3. 某个模块发生故障,不会影响整体的可靠性

      • RPC带来的问题

  • 分层设计

    image.png

    • 数据格式

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

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

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

    • 协议

      协议是双方确定的交流语义,比如:我们设计一个字符串传输的协议,它允许客户端发送一个字符串,服务端接收到对应的字符串。这个协议很简单,首先发送一个4字节的消息总长度,然后再发送1字节的字符集charset长度,接下来就是消息的payload,字符集名称和字符串正文。

      特殊结束符:过于简单,对于一个协议单元必须要全部读入才能够进行处理,除此之外必须要防止用户传输的数据不能同结束符相同,否则就会出现紊乱

      变长协议:一般都是自定义协议,有 header 和 payload 组成,会以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度,使用比较广泛

    • 网络通信

      • Socket api
      • 网络库