RPC学习笔记 | 青训营
RPC由浅入深
1. 基本概念
- RPC(Remote Procedure Call Protocol)远程过程调用的缩写,通俗来说就是调用一个远程函数。相对应的就是本地函数。
- 有没有办法,调用一个跨进程(进程部署在另一台服务器上)的函数? 通过RPC。甚至可以跨语言,比如C++写的微服务A可以被Go调用,Python同理。
- 本地函数调用对比远程函数调用RPC(Remote Procedure Call Protocol):
- 举个例子,比如,网上商城场景和支付服务的场景,网上商城如何调用支付服务的函数?支付函数如何返回成功调用的信息到网上商城?在本地中我们可以通过内存传递参数,但远程情况下是不可行的。
- 由此可以看出RPC需要解决的问题:
- 函数映射
- 数据转换成字节流
- 网络传输
- RPC概念模型

- 一次完整RPC过程:
- IDL(Interface description language)文件:通过一种中立的方式描述接口,使得在不同平台上运行的对象和用不同编程语言写的程序之间可以互相通信。
- 生成编码:编译器工具将IDL文件转换成语言对应的静态库。
- 编解码:从内存中表示到字节序列的转换成为编码,反之为解码,也成为序列化和反序列化。
- 通信协议:规范了数据在网络中的传输内容和格式。除了必须相应的请求和数据外还会包含额外的元数据。
- 网络传输:常常基于成熟的网络库走TCP/UDP。
- RPC的优势:
- 单一职责有利于分工协作、运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
- RPC的弊端(由RPC框架来处理):
- 服务宕机,对方如何处理?
- 调用过程中如果出现网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
2. 分层设计:编解码层、协议层、网络通信层
- 编解码层
- 简单来说,就是将编写的代码编码成某种数据格式后再进行传输。
- 常见的数据格式有:文本格式、二进制编码、语言特定格式(编程语言内建了将内存对象编码为字节序列的支持)。其中二进制编码具备跨语言、高性能的有点,文本格式则具有人类可读性。
- 协议层
- 概念:
- 特殊结束符:一个特殊字符作为每个协议单元结束的表示,如\r\n。
- 变长协议:边长+不定长部分组成,定长部分要描述不定长的长度。
- 网络通信层,Sockets API
3. 关键指标:稳定性、易用性、扩展性、观测性、高性能
- 稳定性:
- 保障策略:
- 熔断:保护调用方,防止被调用的服务出现问题而影响到整条路
- 限流:保护被调用方,防止大流量把服务压垮
- 超时控制:避免浪费资源在不可用节点上
- 注册中间件:实现稳定性的手段
- 扩展性:各层功能都易扩展
- 观测性:Log、Metric(性能)、Tracing(延迟跟踪);内置观测服务
- 高性能:高吞吐、低延迟。
总结:
- RPC相对HTTP,封装实现了"负载均衡",“熔断、限流”等一系列面向服务的高级特性,是面向服务的更高级的封装。