RPC 框架
基本概念
RPC(远程函数的调用)
在本地的函数调用中,程序是通过指针实现一个函数的调用,显然这种方式在远程调用中是不适用的,所以我们就必须要有一种方式能够使用远程的函数,对远程函数的调用就是 RPC
所以 RPC 就面临需要接解决的三个问题
- 函数的映射
- 将数据流进行转换形成字节流
- 网络传输
1984年 Nelson 发表了关于 RPC 的过程的 5 个模型组成
- User
- User-Stub
- RPC-Runtime
- Server-Stub
- Server
这是五个模型之间的RPC调用的过程
RPC 的过程
- IDL (interfa description language)
- 生成代码
- 编解码
- 通信协议
- 网络传输
我们通过 IDL 描述有关方法的签名信息,以便调用者进行使用,然后 编译工具对 IDL 文件进行一个编译,双方都依赖同一份 IDL ,然后对数据进行一个编码,双方通过约定的协议进行通信( 基于TCP/UDP )实现函数的调用
RPC 好处
- 单一职责,利于团队的开发和维护
- 灵活性高,易于扩展,资源的利用率高
- 故障隔离,服务可靠性高
而 RPC 也面临着一些问题
- 服务宕机的解决
- 调用过程的网络异常,如何保证消息可靠到达
- 突发性访问量加大如何处理
分区设计
编解码层
生成代码
Clien & Server 依赖的同一份 IDL 文件会根据不同的语言生成不同的语言的 GodeGen
数据格式
- 语言的特定格式(对数据实现序列化)
- 文本格式(Json XMl CSV 利于阅读的文本格式)
- 二进制编码(具有跨语言&高性能:Thrift 的BinaryProtocol protobuf)
选型
- 兼容性 - 可以自动增加field,不影响当前存在的服务,提高系统的灵活性
- 通用性 - 支持跨平台 跨语言
- 性能 - 数据编码所需的时间以及空间情况
协议层
概念
- 特殊结束字符 - 作为每个协议单元结束的标识
- 变长协议 - 以定长加不定长的部分构成(定长内容描述不定长内容)
特殊字符
变长协议
协议包构成
- legngth - 数据包大小(不包括自身)
- HEADER MAGIC - 版本号标识(在协议解析时快速校验)
- SEQUENCE NUMBER - 数据包的 seqID 可以使用在多路复用中,在单个链接中是递增的
- HEADER SIZE - 头部的长度 从 14 字节开始计算到 PAYLOAD
- PROTOCOL ID - 编码方式 - Binary & Compact
- TRANSFORM ID - 压缩方式 -zlib & snappy
- INFO ID - 传递一些元数据
- PAYLOAD - 消息体内容
网络通信层
网络库
- 提供易用的 API - 对底层 socket API 进行封装,以及对连接的管理和事件的分发
- 支持tcp udp uds 等协议和异常处理的功能
- 在应用层减少buffer 的拷贝提升性能 高性能的定时器和对象池