RPC框架 | 青训营

211 阅读6分钟

RPC框架的基本概念

RPC(Remote Procedure Call,远程过程调用)框架是一种用于实现分布式系统中不同节点间通信和调用远程服务的技术。它允许开发人员像调用本地函数一样调用远程服务,使得分布式系统的开发更加简洁、高效。

RPC框架通常包括客户端和服务器两个主要组件。客户端通过远程调用请求调用服务器上的函数或方法,并接收返回结果。

一次 RPC 的完整过程

  • IDL (Interface description language) 文性IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
  • 生成代码通过编译器工具把 IDL 文件转换成语言对应的静态库
  • 编解码从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化
  • 通信协议规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
  • 网络传输
  • 通常基于成熟的网络库走 TCP/UDP 传输

image.png

分层设计

以Apache Thrift为例

image.png

RPC框架的设计通常采用分层结构,将整个通信过程划分为编码层、传输协议层和网络通信层,每一层负责不同的功能和处理。

# 编码层
def serialize_request(request):
    # 将函数调用和参数序列化为字节流
    serialized_data = serialize_to_bytes(request)
    return serialized_data

def deserialize_request(serialized_data):
    # 将字节流反序列化为函数调用和参数
    request = deserialize_from_bytes(serialized_data)
    return request

# 传输协议层
def send_data(data):
    # 通过网络发送数据
    network_send(data)

def receive_data():
    # 接收通过网络传输的数据
    data = network_receive()
    return data

# 网络通信层
def establish_connection():
    # 建立与服务器的连接
    connection = network_connect()
    return connection

def close_connection(connection):
    # 断开与服务器的连接
    network_close(connection)

def perform_rpc_request(request):
    # 进行RPC请求,包括建立连接、发送数据、接收数据等操作
    connection = establish_connection()
    serialized_request = serialize_request(request)
    send_data(serialized_request)
    serialized_response = receive_data()
    response = deserialize_response(serialized_response)
    close_connection(connection)
    return response

以上代码片段展示了一个简化的RPC框架的分层设计。serialize_requestdeserialize_request函数负责将请求对象进行序列化和反序列化。send_datareceive_data函数负责通过网络传输数据。establish_connectionclose_connection函数负责建立和断开与服务器的连接。perform_rpc_request函数是一个示例的RPC请求操作,它依次执行建立连接、序列化请求、发送数据、接收数据、反序列化响应和关闭连接等步骤。

编码层

编码层负责将函数调用及其参数序列化为字节流,并进行反序列化。它是实现RPC框架中数据传输的关键一环。

image.png

  1. 序列化:在客户端发送请求之前,需要将函数调用和参数转换成字节流。序列化的过程包括将参数结构化、编码为字节序列,并附加必要的元信息,如方法名、参数类型等。常用的序列化协议有JSON、Protobuf、Thrift等。
  2. 反序列化:在服务器端接收到请求时,需要将接收到的字节流反序列化为函数调用和参数。反序列化过程包括将字节流解析为参数结构,并还原为原始的数据类型,以便服务器端进行处理。

编码层的目标是提供通用的序列化和反序列化机制,使得不同节点间的数据能够以统一的格式进行传输。

传输协议层

传输协议层负责管理数据的传输和处理。它定义了数据在网络中的传递方式,包括数据的封装、压缩和解压缩、安全性等。

  1. 数据封装:传输协议层负责将经过编码的数据封装成数据包,以便在网络传输中进行传送。数据包通常包括数据的头部信息和有效载荷,用于标识数据的类型、大小等。
  2. 压缩和解压缩:为了降低网络传输的带宽消耗,传输协议层可以对数据进行压缩,减小数据包的大小。在接收端,需要对接收到的数据包进行解压缩,还原为原始的数据。
  3. 安全性和加密:为了保障数据的安全性,传输协议层可以采用加密算法对数据进行加密,以防止数据在传输过程中被恶意截取和篡改。

传输协议层提供了不同的协议选择,如TCP、HTTP、gRPC等,开发人员可根据需求选择合适的协议,以满足数据传输的性能和安全要求。

网络通信层

网络通信层是RPC框架的最底层,直接使用底层网络API与远程服务器进行通信。它负责建立与服务器的连接、发送和接收数据,并处理底层的网络相关问题转存失败,建议直接上传图片文件

image.png

  1. 连接管理:网络通信层负责建立与服务器的连接,并维护连接的状态。它处理连接的建立、断开和重连,以及连接的池化管理,以提高连接的稳定性和复用性。
  2. 数据传输:网络通信层负责将封装好的数据包发送给服务器,并接收服务器返回的数据。它使用底层的网络API,如Socket或HTTP客户端,实现数据的可靠传输。
  3. 异常处理和重试:网络通信层需要处理网络异常,例如连接超时、断开等情况,并进行错误处理和重试操作,以保证数据传输的可靠性。

网络通信层的目标是提供稳定可靠的网络连接和数据传输能力,使得不同节点之间能够进行准确的远程调用。

通过分层设计,RPC框架将不同功能模块划分到各个层中,使得每个层都有明确定义的职责,从而降低模块间的耦合度,提高系统的灵活性和可扩展性。同时,分层设计也使得开发人员能够更加专注于各个层的优化和适配,实现高性能、安全和可靠的RPC通信。

分层设计的优势和意义

采用分层设计的RPC框架具有以下优势和意义:

  1. 模块化和可扩展性:不同层之间的功能和职责清晰划分,使得整个框架易于维护和扩展。例如,如果需要更换编码方式或传输协议,只需修改对应层的实现而不影响其他层。
  2. 可复用性和跨语言支持:分层设计使得RPC框架中的各个组件可以独立使用,具备较高的可复用性。同时,不同层之间的接口定义清晰,使得RPC框架能够跨不同编程语言进行通信和调用。
  3. 性能和安全性:各层之间的职责划分合理,可以针对每个层进行优化,进而提升系统的性能和安全性。例如,网络通信层可以使用高效的底层网络库,传输协议层可以选择适合的压缩算法,编码层可以采用高效的序列化方案。

通过上述分层设计,RPC框架能够提供简洁高效的远程调用方式,解决了分布式系统中不同节点间的通信问题,为分布式应用的开发提供了便利。