RPC(Remote Procedure Calls)
- RPC = 远程函数调用
- 例如:网上支付
- 本地函数调用通过指针来解决,但是远程函数调用需要解决以下问题
- 函数映射
- 每个都有ip
- 数据转换成字节流
- 客户端转换成字节流,再传给服务端
- 网络运输
- 函数映射
- RPC的优点
- 单一职责,有利于分工和维护,故障隔离
- 可扩展性强:压力大的时候可以扩展
- RPC的弊端
- 网络异常,服务宕机,如何处理?
- 可以通过RPC框架解决
RPC概念模型
RPC完整过程
- IDL(Interface description language) 文件
- 通过中立方式描述接口,使在不同平台运行的对象和用不同语言编写的程序互相通信
- 可以预计算并且分配内存,来达成优化
- 生成代码(GenCode)
- 通过编译工具把IDL文件转换成语言对应静态库
- 编解码(Encoder/Decoder)
- 从内存中的表示到字节序列的转换称为编码(序列化),反过来是解码(反序列化)
- 通讯协议(Protocol)
- 规范了数据在网络中的传输内容和格式
- 网络传输(Transfer)
- 使用 TCP/UDP protocol
RPC框架
分层设计
编解码层
- 依赖同一份IDL文件
- IDL数据格式
- 语言特定编码格式
- ex:java.io.Serializable
- 文本格式
- JSON,XML,CSV
- human readable,但是性能不高
- 二进制
- 跨语言,高性能
- Thrift BinaryProtocol: TLV(Tag, Length, Value)编码
- 语言特定编码格式
- 编解码选型要考虑的要素
- 兼容性
- 支持自动增加新字段,不影响老服务
- 通用性
- 跨平台,跨语言
- 性能
- 空间和时间
- 兼容性
框架协议层
- 特殊结束符:一个特殊字符作为每个协议单元结束的表示
- '\r','\n'
- 变长协议:在每个内容前面加上固定长度的部分,用来表示长度
- length+message body
- 协议构造
- 协议解析过程
- 读取 magic number 获得协议
- 读取 编码方式
- 解码
网络通信层
Sockets API
- between Application and Transport layer
网络库
- 提供易用API
- 封装底层的Socket API
- 功能
- 支持TCP,UDP...
- 优雅退出以及异常处理
- 性能
-
use application layer buffer to reduce copy
-
高性能定时器以及对象池
-