RPC基本概念
Remote Procedure Calls,远程函数调用
RPC的过程由5个模型组成:
- User
- User-Stub
- RPC-Runtime
- Server-Stub
- Server
RPC解决的问题:
- 函数映射
- 数据转换成字节流
- 网络传输
一次完整的RPC过程
- 调用方将请求参数对象序列化(EnCode)成二进制数据,通过TCP协议(protocol)传输到服务提供方
- 服务提供方从TCP协议通道里面接收到二进制数据
- 根据RPC协议,服务提供方将二进制数据分割出不同请求数据,根据反序列化(DeCode)将二进制数据逆向还原出请求对象,找到对应的实现类,完成真正的方法调用
- 服务提供方再将执行结果序列化,回写到对应的TCP通道内
- 调用方获取到应答的数据包后,再反序列化为应答对象
| 当用户希望进行远程调用时,它实际上进行了一个完全正常的本地调用,该调用调用 user-stub 中的相应过程。User-stub 负责将目标过程和参数的规范放入一个或多个数据包中,并请求 RPCRuntime 将这些数据包可靠地传输到被调用计算机。在接收到这些数据包后,被调用机器中的 RPCRuntime 将它们传递给 server-stub。服务器存根将它们解包,然后再次执行一个完全正常的本地调用,这将调用服务器中的适当过程。同时,调用者机器中的调用进程暂停,等待结果数据包。当服务器中的调用完成时,它返回到 serverstub,并将结果传递回调用方机器中的挂起进程。在那里,它们被解压缩,用户存根将它们返回给用户。 |
|---|
为什么需要RPC
对大型项目进行服务化拆分
RPC的优点:
- 单一职责,利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
RPC的缺点(调用方和被调用方每次都要关注底层的调用细节):
- 服务宕机
- 在调用过程中发生网络异常
- 请求量突增导致服务无法及时处理
这些问题将由RPC框架来解决:让调用方像调用本地函数一样调用远端的函数(服务)
RPC框架的职责
- Client:序列化、连接池管理、负载均衡,路由策略,故障转移、超时处理、异步管理
- Sever:网络通信事件处理、反序列化、手法队列、优雅退出、超时处理
RPC框架分层设计
主要核心层分为:编解码层、协议层、网络通信层
编解码层
Client和Sever依赖于同一份IDL(Interface Description Language)文件去生成不同编程语言的CodeGen IDL文件数据
- 数据格式
- 语言特定格式:使用较少的额外代码实现内存对象的保存与恢复,与特定编程语言深度绑定,兼容性差。
- 文本格式:具有人类可读性,数字编码多有歧义(XML和CSV不能区分数字和字符串;JSON不区分整数和浮点数)
- 二进制编码:跨语言和高性能,常见有TLV编码、Varint编码
- 选项
- 兼容性:提高灵活度
- 通用性:跨平台、跨语言
- 性能
协议层
-
消息切分
- 特殊结束符
- 变长协议
-
协议构造
- LENGTH:数据包大小
- HEADER MAGIC:标识版本信息
- SEQUENCE NUMBER:数据包的seqID,可用于多路复用,单联接内递增
- HEADER SIZE:头部长度
- PROTOCOL ID:编解码方式,Binary或Compact
- TRANSFORM ID:压缩方式
- INFO ID:传递特定meta信息
- PAYLOAD:消息体
-
协议解析
网络通信层
- 网络库
- 提供易用API
- 封装底层Socket API
- 连接管理和事件分发
- 功能
- 协议支持
- 退出、异常处理
- 性能
- 应用层buffer减少copy
- 高性能定时器、对象池
- 提供易用API
- 核心指标
RPC框架需要解决的问题
- 确定Client和Sever之间的通信协议
- 高效进行网络通信
- Sever提供的服务给到Client
- Client发现Sever提供的服务
- 高效的对请求对象和响应结果进行序列化和反序列化操作
http(s)与RPC都是进行数据传输交互的,不过http(s)是协议,RPC是一种技术思想,二者各有应用场景和优缺点,在传输数据方面可以进行对比学习。