RPC框架
本地函数调用 VS 远程函数调用(RPC - Remote Procedure Calls)
一、基本概念
要解决的问题:
- 函数映射
- 数据转换为字节流
- 网络传输
1.2 概念模型
五个模型:
- User
- User-Stub
- RPC-Runtime
- Server-Stub
- Server
1.3 基本概念
- IDL
- 生成代码:把IDL文件转换成不同语言的lib代码
- 编码解码(序列化反序列化)
- 通信协议:消息体以外的信息
- 网络传输
1.4 好处
- 单一职责,利于分工协作,可以用不同代码进行开发
- 功能可扩展性强,资源使用率更优
- 故障隔离
1.5 RPC 带来的问题
- 服务宕机
- 网络异常
- 请求量剧增难以处理
二、分层设计
- 编解码层
- 协议层
- 网络通信层
2.1 编解码层(紫色+绿色)
2.1.1 生成代码
把IDL文件转换成不同语言的lib代码
2.1.2 编码格式
- 编程语言编码成字节序列的特定格式
- JSON、XML、CSV等文本格式
- 二进制编码
二进制编码实现方式之一:TLV编码
- Tag(多余
- Length(多余
- Value
2.1.3 选一种编码格式
考虑:
- 兼容性:不同版本
- 通用性:跨平台跨语言
- 性能:空间时间开销
2.2 协议层
概念:
- 特殊结束符:标记每个协议单元结束
- 变长协议:定长+不定长,定长部分中描述不定长部分长度
协议构造
2.3 网络通信层-Sockets API
应用层和传输层(TCP)之间
一般用封装好的网络库
要考察的核心指标:
-
提供易用API
- 封装底层Socket API
- 连接管理和事件分发
-
功能:
- 协议支持(TCP、UDP、UDS等)
- 优雅退出、异常处理等
-
性能:
- 应用层 buffer 减少 copy
- 高性能定时器、对象池等
三、关键指标
-
稳定性
-
相关策略:降级:
- 熔断:保护调用方
- 限流:保护被调用方不被过大流量冲垮
- 超时控制
-
提高请求成功率相关方式:
- 负载均衡
- 重试
-
长尾请求:比较小的请求(1%小),比如网络抖动等
- 提高成功率方式:备份请求(Backup Request)
- 如果正常时间 t3 内没收到回复再发一次备份请求,t4 就能收到
- 提高成功率方式:备份请求(Backup Request)
-
具体实现:注册中间件(middleware、拦截器)
- 创建时通过可选方式带上这些策略
-
-
易用性
- 合理的默认参数选项、丰富的工作文档
- 周边工具:智能代码生成工具、脚手架工具,减少重复性工作
-
扩展性
-
观测性
-
传统三件套
- log日志
- Metric
- Tracing
-
内置状态暴露服务(往往是一个简单的HTTP服务)
- 观测平台
- 中间件使用
- 用户配置
- 等等
-
-
高性能
四、企业实践
4.1 整体架构
4.2 自研网络库 - Netpoll
4.3 扩展性设计
4.4 性能优化
-
网络库优化:
-
编解码优化:
4.5 微服务合并部署
亲和性强的服务实例尽可能调度到同一个物理机,远程RPC转为本地IPC调用
中心化定制化