RPC原理与实现 | 青训营笔记

51 阅读2分钟

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

一. 重点内容

  • 基本概念

  • 分层设计

  • 关键指标

二. 知识点介绍

1. 基本概念

  • 概念模型image.png
  • 单次RPC完整过程
    • IDL(Interface Description Lanuage)文件:通过一种中立的方式来描述接口,使得在不同平台上运行的的对象和用不同语言编写的程序可以相互通信
    • 生成代码:通过编译器工具把IDL文件转换成语言对应的静态库
    • 编解码:从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
    • 通信协议:规范了数据在网络中的传输内容和格式,除必须的请求/响应数据外,通常还会包含额外的元数据
    • 网络传输:通常基于成熟的网络库走TCP/UDP传输
  • RPC的好处
    • 单一职责,有利于分工协作和运维开发
    • 可扩展性强,资源使用率低
    • 故障隔离,,服务的整体可靠性高

2. 分层设计

  • 编解码层:生成代码 image.png
    • 数据格式:
      • 语言特定的格式:许多编程语言内建了将内存对象编码为字节序列的支持,如Java有java.io.Serializable
      • 文本格式:JSON、XML、CSV等,具有可读性
      • 二进制编码:具备跨语言和高性能等优点,如Thift的BinaryProtocol
    • 选型:
      • 兼容性:支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
      • 通用性:支持跨平台、跨语言
      • 性能:从空间和时间两个方面考虑
  • 协议层
    • 特殊结束符:一个特殊字符作为每个协议单元结束的标示
    • 变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
    • 协议构造: image.png
    • 协议解析: image.png
  • 网络通信层:Sockets API image.png
    • 网络库:
      • 提供易用API:封装底层Socket API;连接管理和事件分发
      • 功能:协议支持tcp、udp和uds等;优雅退出、异常处理等
      • 性能:应用层buffer减少copy;性能定时器、对象池等

3. 关键指标

  • 稳定性-策略保障
    • 熔断:保护调用方,防止被调用的服务出现问题而影响到整个链路
    • 限流:保护被调用方,防止大流量把服务压垮
    • 超时控制:避免在不可用节点上浪费资源
  • 稳定性-请求成功率:负载均衡;重试
  • 稳定性-长尾请求:Backup Request
  • 易用性
    • 开箱即用:合理的默认参数选项、丰富的文档
    • 周边工具:生成代码工具、脚手架工具
  • 扩展性:如Middleware、代码生成工具插件扩展
  • 观测性:Log、Metric、Tracing;内置观测性服务
  • 高性能:高吞吐、低延迟