RPC 框架分层设计 | 青训营

62 阅读4分钟

RPC基本概念

Remote Procedure Calls,远程函数调用

RPC的过程由5个模型组成:

  • User
  • User-Stub
  • RPC-Runtime
  • Server-Stub
  • Server image.png

RPC解决的问题:

  • 函数映射
  • 数据转换成字节流
  • 网络传输

一次完整的RPC过程

image.png

  • 调用方将请求参数对象序列化(EnCode)成二进制数据,通过TCP协议(protocol)传输到服务提供方
  • 服务提供方从TCP协议通道里面接收到二进制数据
  • 根据RPC协议,服务提供方将二进制数据分割出不同请求数据,根据反序列化(DeCode)将二进制数据逆向还原出请求对象,找到对应的实现类,完成真正的方法调用
  • 服务提供方再将执行结果序列化,回写到对应的TCP通道内
  • 调用方获取到应答的数据包后,再反序列化为应答对象
当用户希望进行远程调用时,它实际上进行了一个完全正常的本地调用,该调用调用 user-stub 中的相应过程。User-stub 负责将目标过程和参数的规范放入一个或多个数据包中,并请求 RPCRuntime 将这些数据包可靠地传输到被调用计算机。在接收到这些数据包后,被调用机器中的 RPCRuntime 将它们传递给 server-stub。服务器存根将它们解包,然后再次执行一个完全正常的本地调用,这将调用服务器中的适当过程。同时,调用者机器中的调用进程暂停,等待结果数据包。当服务器中的调用完成时,它返回到 serverstub,并将结果传递回调用方机器中的挂起进程。在那里,它们被解压缩,用户存根将它们返回给用户。

为什么需要RPC

对大型项目进行服务化拆分

RPC的优点:

  • 单一职责,利于分工协作和运维开发
  • 可扩展性强,资源使用率更优
  • 故障隔离,服务的整体可靠性更高

RPC的缺点(调用方和被调用方每次都要关注底层的调用细节):

  • 服务宕机
  • 在调用过程中发生网络异常
  • 请求量突增导致服务无法及时处理

这些问题将由RPC框架来解决:让调用方像调用本地函数一样调用远端的函数(服务)

RPC框架的职责

  • Client:序列化、连接池管理、负载均衡,路由策略,故障转移、超时处理、异步管理
  • Sever:网络通信事件处理、反序列化、手法队列、优雅退出、超时处理

RPC框架分层设计

主要核心层分为:编解码层、协议层、网络通信层

image.png

编解码层

Client和Sever依赖于同一份IDL(Interface Description Language)文件去生成不同编程语言的CodeGen IDL文件数据

  • 数据格式
    • 语言特定格式:使用较少的额外代码实现内存对象的保存与恢复,与特定编程语言深度绑定,兼容性差。
    • 文本格式:具有人类可读性,数字编码多有歧义(XML和CSV不能区分数字和字符串;JSON不区分整数和浮点数)
    • 二进制编码:跨语言和高性能,常见有TLV编码、Varint编码
  • 选项
    • 兼容性:提高灵活度
    • 通用性:跨平台、跨语言
    • 性能

协议层

  • 消息切分

    • 特殊结束符
    • 变长协议
  • 协议构造

    • LENGTH:数据包大小
    • HEADER MAGIC:标识版本信息
    • SEQUENCE NUMBER:数据包的seqID,可用于多路复用,单联接内递增
    • HEADER SIZE:头部长度
    • PROTOCOL ID:编解码方式,Binary或Compact
    • TRANSFORM ID:压缩方式
    • INFO ID:传递特定meta信息
    • PAYLOAD:消息体
  • 协议解析

image.png

网络通信层

  • 网络库
    • 提供易用API
      • 封装底层Socket API
      • 连接管理和事件分发
    • 功能
      • 协议支持
      • 退出、异常处理
    • 性能
      • 应用层buffer减少copy
      • 高性能定时器、对象池
  • 核心指标

RPC框架需要解决的问题

  • 确定Client和Sever之间的通信协议
  • 高效进行网络通信
  • Sever提供的服务给到Client
  • Client发现Sever提供的服务
  • 高效的对请求对象和响应结果进行序列化和反序列化操作

http(s)与RPC都是进行数据传输交互的,不过http(s)是协议,RPC是一种技术思想,二者各有应用场景和优缺点,在传输数据方面可以进行对比学习。