一、基本概念
1.1 远程函数调用
RPC需要解决的问题:
- 函数映射
- 数据转换成字节流
- 网络传输
1.2 RPC概念模型
1.3 RPC过程
- IDL文件:接口描述,不同平台、不同语言运行的对象可以相互通信
- 生成代码:通过编译工具把IDL文件转换成语言对应静态库
- 编解码:序列化与反序列化
- 通信协议:规范数据的网络传输格式
- 网络传输:通常基于成熟的网络库走TCP/UDP传输
1.4 RPC的好处
- 单一职责,利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
1.5 RPC带来的问题
- 服务宕机,对方如何处理?
- 网络异常,如何保证消息可达?
- 请求量突增服务无法及时处理,有哪些应对措施?
二、分层设计
2.1 分层设计
2.2 编解码层
- 数据格式:语言特定的格式、文本格式、二进制编码
- 选型:兼容性、通用性、性能
2.3 协议层
- 特殊结束符:表示协议单元结束的标识
- 变长协议:定长部分需要描述不定长的内容长度
2.4 网络通信层
- Sockets API
- 网络库:提供易用
Sockets API、协议支持、异常处理、性能优化
三、关键指标
3.1 稳定性
保障策略:
- 熔断:保护调用方,防止被调用的服务出现问题而影响整个链路
- 限流:保护被调用方,防止大流量把服务压垮
- 超时控制:避免浪费资源在不可用节点上
请求成功率:
- 一个服务多机器的负载均衡
- 重试
具体措施 - 注册相应功能的中间件:
3.2 易用性
- 合理的默认参数选项、丰富的文档
- 提供生成代码、脚手架等周边工具
3.3 扩展性
- 中间件
- Option
- 编解码层
- 协议层
- 网络传输层
- 代码生成工具插件扩展
3.4 观测性
- 传统三件套:
Log、Metric、Tracing- 内置观测性服务
3.5 高性能
- 目标:高吞吐、低延迟
- 手段:连接池、多路复用、高性能编解码协议、高性能网络库