RPC框架分层设计
一、基本概念
① 本地函数调用
② 远程函数调用(RPC:Remote Procedure Calls)
RPC需要解决的问题:①函数映射 ②数据转换成字节流 ③网络传输
③ RPC概念模型
④ 一次RPC的完整过程
⑤ RPC的好处
(1) 单一职责,有利于分工协作和运维开发
(2) 可扩展性强,资源使用率更优
(3) 故障隔离,服务的整体可靠性更高
⑥ RPC带来的问题
(1) 服务宕机,对方应该如何处理?
(2) 在调用过程中发生网络异常,如何保证消息的可达性?
(3) 请求量突增导致服务无法及时处理,有哪些应对措施?
上述问题的解决方法只有一个:由RPC框架来解决!!!
二、分层设计
实例(以Apache Thrift为例):
① 编解码层
(1) 生成代码
(2) 数据格式
1. 语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持,例如Java有java.io.Serializable
2. 文本格式:JSON、XML、CSV等文本格式,具有人类可读性
3. 具备跨语言和高性能等优点,常见有Thrift的BinaryProtocol、Protobuf等
(3) 二进制编码
(4) 选型
1. 兼容性:支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
2. 通用性:支持跨平台、跨语言
3. 性能:从时间和空间两个维度来考虑,也就是编码后数据大小和编码耗费时长
② 协议层
(1) 概念
1. 特殊结束符:一个特殊字符作为每个协议单元结束的标示
2. 变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
(2) 协议构造
1. LENGTH:数据包大小,不包含自身
2. HEADER MAGIC:标识版本信息,协议解析时快速校验
3. SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内递增
4. HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前
5. PROTOCOL ID:编解码方式,有Binary和Compact两种
6. TRANSFORM ID:压缩方式,如zlib和snappy
7. INFO ID:传递一些定制的meta信息
8. PAYLOAD:消息体
(3) 协议解析
③ 网络通信层
(1) Sockets API
(2) 网络库
1. 提供易用API:①封装底层Socket API ②连接管理和事件分发
2. 功能:①协议支持(支持tcp、udp和uds等) ②优雅退出、异常处理等
3. 性能:①应用层buffer减少copy ②高性能定时器、对象池等