这是我参与「第五届青训营」伴学笔记创作活动的第 15 天
前言
RPC指远程调用,能够让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。本文将对RPC做简要介绍。
详细知识点介绍
基本概念
定义
RPC,也就是远程调用,例如两台服务器A、B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
一次RPC的完成过程
-
IDL(Interface description language)文件
IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。
-
生成代码
通过编译器工具把IDL文件转换成语言对应的静态库。
-
编解码
从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化。
-
通信协议
规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据。
-
网络传输
通常基于成熟的网络库走TCP/UDP传输。
与本地调用的区别
主要在函数映射、数据转成字节流、网络传输等方面存在区别。
优势
- 单一职责,有利于分工协作和运维开发。
- 可扩展性强,资源使用率更优。
- 故障隔离,服务的整体可靠性更高。
分层设计
RPC的分层设计主要包括编解码层、协议层和网络通信层。
编解码层
-
生成代码
生成代码主要是指客户端和服务端依据相同的IDL文件生成不同语言的代码。
-
数据格式
数据的格式类型主要包括语言的特定格式、文本格式和二进制编码等。语言的特定格式主要指编程语言内建的将内存编码为字节序列的支持;文本格式具有人类可读性,如JSON、XML、CSV等;二进制编码具备跨语言和高性能等优点,常见的有 Thrift 的 BinaryProtocol,Protobuf 等。
-
选型
-
兼容性
移动互联网时代,业务需求的更新周期变得更快,新的需求不断涌现,而老的系统需要继续维护。
序列化协议应当具有良好的可扩展性,支持自动增加新的业务字段,且不影响老的服务。
-
通用性
技术层面,支持跨平台。
流行程度,支持跨语言
-
性能
空间开销,序列化需要在原有的数据上加上描述字段,要控制编码后的数据大小。
时间开销,复杂的序列化协议会导致较长的解析时间,要控制编码耗费的时长。
-
网络通信层
- API:简单易用,封装底层的Socket API,连接管理和事件分发。
- 功能:实现协议支持(tcp、udp和uds等),完善的退出机制和异常处理。
- 性能:应用层buffer减少copy,提供高性能定时器和对象池。
关键指标
RPC性能的关键指标主要包括稳定性、易用性、扩展性、观测性和高性能。
- 稳定性:框架通过中间件来注入各种服务治理策略。
- 易用性:通过提供合理的默认配置和方便的命令行工具提升框架的易用性。
- 扩展性:框架应当提供丰富的扩展点,例如核心的传输层和协议层。
- 观测性:观测性除了传统的Log、Metric 和 Tracing 之外,内置状态暴露服务也很有必要。
- 高性能:性能可以从多个层面去优化,例如选择高性能的编解码协议和网络库。
总结
本文从RPC的主要概念、各层次设计以及RPC关键指标角度简要介绍了RPC相关知识。