这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
基本概念
远程函数调用(RPC - Remote Procedure Calls)
- RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
-
相比本地函数调用,RPC调用需要解决的问题
- 函数映射
- 数据转换成字节流
- 网络传输
-
一次 RPC 的完整过程
-
RPC 带来的问题将由 RPC 框架来解决
- 服务宕机如何感知?
- 遇到网络异常应该如何应对?
- 请求量暴增怎么处理?
分层设计
编解码层:生成代码
-
数据格式
- 语言特定格式:例如 java.io.Serializable
- 文本格式:例如 JSON、XML、CSV 等
- 二进制编码:常见有 Thrift 的 BinaryProtocol,Protobuf,实现可以有多种形式,例如 TLV 编码 和 Varint 编码
-
选型考察点:兼容性、通用型、性能(空间开销和时间开销)
-
生成代码和编解码层相互依赖,框架的编解码应当具备扩展任意编解码协议的能力
协议层
- 协议解析
网络通信层
关键指标
稳定性
- 保障策略
- 请求成功率:负载均衡、重试
- 长尾请求:backuprequest
易用性
扩展性
- Middleware:middleware 会被构造成一个有序调用链逐个执行,比如服务发现、路由、负载均衡、超时控制等
- Option:作为初始化参数
- 核心层是支持扩展的:编解码、协议、网络传输层
- 代码生成工具也支持插件扩展
观测性
高性能
企业实践
- Kitex
感受与总结
最开始知道rpc是在6.824里面,现在更全面且深入地了解了rpc的架构、分层以及关键指标。虽然感觉这次大项目由于和期末考试冲突无法尝试用kitex进行架构,但是可以之后尝试用kitex完善那个项目。加油加油~