RPC原理与实践(上)丨青训营笔记
这是我参与「第五届青训营」笔记创作活动的第 17 天。
一、本堂课重点内容
本堂课由浅入深介绍有关框架的内部原理,重点讲解 RPC 框架的基本概念,并从编码层、传输协议层和网络通信层分析其分层设计,接着围绕构建 RPC 框架的准备工作展开,逐步分析其五大关键指标,同时分享字节内部有关 RPC 框架的实现情况。
二、详细知识点介绍
1. RPC 的基本概念
RPC是远程过程调用(Remote Procedure Call)的缩写,它是一种机制,允许一个计算机程序在不需要程序员明确编写两个程序之间通信细节的情况下,在另一个计算机程序中执行过程或函数。
在RPC体系结构中,客户端发送一个请求到服务器,请求执行特定的函数或过程,同时包括任何必要的输入参数。服务器接收到请求后,执行所请求的操作,并将结果返回给客户端。
RPC的关键优势在于它抽象出了网络通信的复杂性,并使开发人员能够轻松构建分布式系统。RPC广泛应用于客户端-服务器应用程序中,其中客户端和服务器运行在不同的计算机上,并需要通过网络进行通信。示例包括Web服务、微服务以及Apache Thrift、gRPC和CORBA等分布式计算框架。
RPC的概念模型
User、User-Stub、RPC-Runtime、Server-Stub、Server
IDL(Interface Definition Language) 文件
IDL(Interface Definition Language)是一种描述服务接口和消息格式的语言。它通常用于RPC(Remote Procedure Call)框架中,用于定义服务接口和数据结构,以实现跨网络的通信。
常用的IDL包括Thrift、Protocol Buffers等。在RPC框架中,IDL通常与协议一起使用,例如gRPC使用的就是Protocol Buffers。使用IDL可以大大简化服务接口的定义和通信协议的实现,提高系统的可维护性和可扩展性。
生成代码
通过编译工具把IDL文件转换成语言对应的静态库。
编码器
从内存中表示到字节序列的转换称为编码,反之为解码。
序列化将数据结构转换为字节流,以便在网络上传输或存储到磁盘上。在序列化的过程中,数据结构被编码为一系列的字节,其中包括数据类型、长度以及具体的数据内容。
反序列化是将字节流转换回原始的数据结构,以便在程序中进行处理。在反序列化的过程中,程序将字节流解码为对应的数据类型,并将其重新组合为原始的数据结构。
通信协议
规范了数据在网络中的传输内容和格式,除必须响应的请求/响应数据外,通常还会包含额外的元数据。
网络传输
IO(Input/Output)网络模型是计算机网络编程中常用的一种编程模型,用于描述数据在网络中的传输和处理过程。
- 阻塞IO模型:在阻塞IO模型中,IO操作会阻塞应用程序的执行,直到数据传输完毕才会返回结果。
- 非阻塞IO模型:在非阻塞IO模型中,IO操作不会阻塞应用程序的执行,可以在数据传输的过程中进行其他操作。但是应用程序需要轮询IO操作的状态,以便及时地处理IO操作的结果。
- 同步IO模型:在同步IO模型中,IO操作由应用程序主动发起,并等待数据传输完毕后再进行下一步操作。
- 异步IO模型:在异步IO模型中,IO操作由操作系统或IO库负责处理,并在数据传输完毕后通知应用程序进行处理。应用程序可以继续执行其他操作,不需要等待IO操作的完成。
传输层协议:主要用于网络中不同主机之间的数据传输,例如TCP、UDP等。
RPC 的优势和不足
RPC 的优势包括:
- 简化编程模型:RPC 可以让分布式应用程序开发更简单。开发人员只需要关注业务逻辑,而不需要处理底层网络通信细节。
- 提高代码复用性:RPC 可以让多个应用程序共享相同的代码库和服务。这可以提高代码复用性,并减少代码冗余。
- 支持跨平台:RPC 可以支持不同的编程语言和操作系统之间的通信,这使得不同平台之间的集成变得更加容易。
- 提高系统性能:通过将计算任务分发到不同的服务器上,RPC 可以提高系统的性能和可扩展性。
虽然 RPC 技术可以带来许多好处,但同时也会带来一些问题,其中一些问题包括:
- 网络通信带来的延迟和开销:RPC 技术需要进行网络通信,这会带来一些延迟和开销。因此,在设计和使用 RPC 技术时,需要考虑如何最小化网络通信带来的延迟和开销。
- 系统复杂性:RPC 技术可以让系统变得更加复杂。例如,如果使用了多个 RPC 协议和框架,那么系统可能需要处理多种不同的协议和框架。这会增加系统的复杂性,从而增加系统的维护成本和故障排除难度。
- 安全性问题:由于 RPC 技术需要将服务暴露在网络上,因此需要采取一些措施来保护服务的安全性,例如加密和身份验证等。如果安全性措施不到位,可能会导致系统被攻击。
- 版本控制和兼容性问题:在 RPC 技术中,服务的接口是通过 IDL(接口定义语言)来定义的。如果接口发生变化,可能会导致客户端和服务器之间的兼容性问题。因此,需要对接口进行版本控制,并考虑如何处理接口变化带来的兼容性问题。
- 可靠性问题:由于 RPC 技术需要进行网络通信,因此可能会遇到网络故障、节点故障等问题。如果不恰当地处理这些问题,可能会导致系统的可靠性下降。因此,需要考虑如何处理网络故障和节点故障等问题,以确保系统的可靠性。
2. RPC 框架分层设计
编解码层
RPC 框架的编解码层是实现 RPC 协议的关键组成部分,它用于将数据转换为二进制格式,以便在网络上进行传输。
-
生成代码
-
数据格式:
-
语言特定格式
-
文本格式
-
二进制编码
- TLV 编码:Thrift 使用 TLV 编码
- Varint 编码:Protobuf 使用 Varint 编码
-
-
选型:
- 兼容性
- 通用型
- 性能
协议层
RPC 框架的协议层是实现 RPC 协议的重要组成部分,主要负责定义和实现 RPC 协议。
-
传输协议层
-
消息切分
- 特殊结束符
- 变长协议:length+body
-
协议构造
- 以 Thrift 的 THeader 协议为例讲解
-
-
网络通信层
-
网络库
-
提供易用 API
封装底层 Socket API,链接管理和事件分发
-
功能
协议支持:TCP、UDP 和 UDS 等,优雅退出和异常处理等
-
性能 应用层 buffer 减少 copy,高性能定时器、对象池等
-
-
核心指标
- 吞吐高
- 延迟低
-
三、课后个人总结
通过学习本堂课,我对 RPC 的基本概念和框架设计有了更进一步的认识和理解,深刻地认识到了RPC在分布式系统中的重要性。RPC技术可以帮助我们实现跨进程或者跨网络的函数调用,从而方便我们实现分布式应用程序。
在学习RPC的框架设计中,我发现需要考虑到很多方面的因素,如IDL协议的定义、编解码层的序列化和反序列化、协议层的路由和负载均衡、网络传输层的处理等等。这些因素相互作用,决定了RPC技术的性能、可靠性和安全性等重要特性。
虽然RPC技术可以带来很多好处,如提高分布式系统的性能和可扩展性,但是我们也需要面对一些挑战和问题,例如可靠性和安全性的考虑,以及RPC技术在大规模应用时的扩展性限制等。
总之,我认为学习RPC技术对于我们的未来发展非常重要。我们需要深入了解RPC技术的原理和应用场景,不断地提高自己的技能和能力,以应对日益复杂的分布式系统。