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

70 阅读2分钟

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

程序一般分为本地函数调用和远程函数调用,本节课所学的 RPC 就是远程函数调用,它需要解决下面的问题

  1. 函数映射
  2. 数据转换成字节流
  3. 网络传输

RPC的概念模型

RPC的过程由5个模型组成

  • User
  • User-Stub
  • RPC-Runtime
  • Server-Stub
  • Server

来自论文:web.eecs.umich.edu/~mosharaf/R…

一次RPC的完整过程

  • IDL文件
  • 生成代码
  • 编解码
  • 通信协议
  • 网络传输

使用RPC的好处

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

RPC带来的问题

  1. 服务宕机,对方该如何处理
  2. 在调用过程中发生网络异常,如何保证消息的可达性
  3. 请求量突增导致服务无法及时处理,有哪些应对措施?

RPC框架分层设计

编解码层

数据格式

  • 语言指定格式,比如Java语言中的 java.io.Serializable
  • 文本格式:例如 JSON、XML、CSV 等
  • 二进制编码:常见有 Thrift 的 BinaryProtocol,Protobuf,实现可以有多种形式,例如 TLV 编码 和 Varint 编码

选型考察点

  • 兼容性
  • 通用性
  • 时间、空间开销

协议层

Thirft的THeader协议为例,通信协议的数据结构如下:

image.png

协议解析的过程中,先PEEK获取MagicNumber,然后再Peek获取PayloadCodec,最后直接解码,获得数据Payload。

网络通信层

  • 阻塞 IO 下,耗费一个线程去阻塞在 read(fd) 去等待用足够多的数据可读并返回。
  • 非阻塞 IO 下,不停对所有 fds 轮询 read(fd) ,如果读取到 n <= 0 则下一个循环继续轮询。

RPC框架核心指标

稳定性

为了保证稳定性,需要准备保障策略,比如熔断、限流、超时控制。还需要保证请求的成功率,比如使用负载均衡,重试等功能。

易用性

RPC需要开箱即用,支持使用代码生成工具或脚手架工具,快速生成业务代码。

拓展性

middleware 会被构造成一个有序调用链逐个执行,比如服务发现、路由、负载均衡、超时控制等

观测性

内置观测性服务,用于观察框架内部的状态,获取环境变量,参数等信息。

高性能

  • 使用连接池和多路复用
  • 高性能编解码协议
  • 高性能网络库