RPC学习笔记

48 阅读6分钟

RPC学习笔记

什么是RPC?

RPC 的全称是 Remote Procedure Call Protocol,中文名是远程过程调用协议。 一句话概括就是:像调用本地方法一样调用远程服务.

因此:

  • RPC 是一种通信机制
  • RPC 实现了客户端/服务器通信模型

RPC解决的问题

  1. 分布式系统的复杂性:在分布式系统中,应用程序的各个部分可能运行在不同的计算机上。传统的网络编程方式(如套接字编程)要求开发者处理许多底层细节,如消息格式化、网络传输、错误处理等。这使得分布式系统的开发变得复杂且容易出错。RPC通过提供抽象接口,使得开发者可以像调用本地函数一样调用远程服务,从而简化了分布式系统的开发。(✔简化分布式服务的调用方式)
  2. 减少网络编程的负担:使用RPC,开发者不需要关心底层的网络通信细节。RPC框架负责参数序列化、消息传输、结果反序列化等工作。这样,开发者可以专注于业务逻辑的实现,而不是网络编程的细节。(✔封装具体实现)
  3. 提高代码的可读性和可维护性:通过RPC,远程服务调用的代码看起来和本地函数调用几乎没有区别,这提高了代码的可读性和可维护性。开发者可以更直观地理解代码逻辑,而不用被复杂的网络通信代码所困扰。(✔简化使用复杂度)
  4. 促进模块化和服务化:RPC支持不同模块和服务之间的调用,使得系统更容易模块化和服务化.(✔模块化)
  5. 提供标准化的通信方式:RPC框架通常提供标准化的通信协议和数据格式,确保不同系统和服务之间能够互操作。这对于跨语言、跨平台的系统尤为重要。例如,gRPC使用Protocol Buffers作为其接口定义语言(IDL)和数据序列化格式,使得不同语言实现的服务可以无缝互操作。(✔跨语言和跨平台通信能力)

RPC的工作原理

RPC框架

image.png RPC框架包括四个核心组件,分别是Client、Client Stub、Server和Server Stub。Stub可理解为存根,Client是客户端,它负责发起远程调用请求。

  1. Client是客户端,它负责发起远程调用请求。
  2. Client Stub是客户端存根,它负责将客户端的调用请求序列化为能够进行网络传输的消息体,并通过网络发送给服务端。
  3. Server是服务端,它负责处理客户端的调用请求并返回结果。
  4. Server Stub是服务端存根,它负责接收客户端发送的消息并进行反序列化操作,然后调用本地服务进行处理,并将处理结果序列化后通过网络返回给客户端.

RPC调用的具体流程

客户端

  1. 客户端通过调用本地方法接口发起对服务方的远程调用。
  2. 客户端存根在接收到请求后,将被调用的方法信息和方法的参数信息等进行序列化。
  3. 客户端存根找到远程服务地址,将消息通过网络(TCP或者HTTP)发送给服务端。

服务端

  1. 服务端收到客户端发来的消息之后对消息进行反序列化。
  2. 服务端存根根据反序列化结果调用本地的服务进行相关处理。
  3. 服务端调用具体的方法并获取返回值。
  4. 服务端存根对方法执行的结果进行序列化,并通过网络发送给客户端

客户端

  1. 客户端存根收到消息,并对收到的内容进行反序列化。
  2. 客户端调用方获取到最终结果。

RPC主流的调用方式

同步调用

在同步调用中,客户端发送请求后会等待服务器返回结果。在此期间,客户端会被阻塞,直到接收到服务器的响应。 具有简单直接的特点,适用于需要实时响应的场景image.png 优点

  1. 简单直观
  2. 容易调试
  3. 适合实时响应的场景

缺点

  1. 客户端阻塞⌛️(等待服务器期间客户端会阻塞,造成资源浪费和性能瓶颈
  2. 不适合长时间操作

总结

同步调用因其简单直观的编程模型,适合需要实时响应的场景。然而,在高并发或长时间操作的场景中,同步调用的阻塞性和资源占用问题可能导致性能瓶颈。开发者需要根据具体应用场景权衡利弊,选择合适的调用方式。在需要非阻塞操作或处理高并发的场景中,异步调用可能是更好的选择。

异步调用

异步调用是一种非阻塞的RPC(远程过程调用)方式,允许客户端在发送请求后立即返回,并在稍后通过回调函数、Future对象或其他机制获取服务器的响应。

异步调用的实现方式
  1. 回调函数

    客户端在发送请求时提供一个回调函数,当服务器返回响应时,回调函数被调用以处理结果。

  2. Future对象

    Future对象表示一个未来完成的异步操作,客户端可以在Future对象上注册回调函数,等待操作完成后处理结果。

  3. 事件驱动模型

    事件驱动模型通过事件和处理器实现异步调用,客户端在发送请求时注册事件处理器,当操作完成时触发相应事件。

优点

  • 非阻塞:异步调用不会阻塞客户端线程,允许客户端在等待响应时继续执行其他任务,提高并发性能。

  • 高效:适用于需要处理大量并发请求或长时间操作的场景。

  • 用户体验:在用户界面中,异步调用可以提高响应速度,避免界面卡顿。

缺点

  • 复杂性:异步编程模型比同步编程复杂,特别是在处理回调地狱或错误处理时。

  • 调试困难:由于异步操作的非线性执行顺序,调试和错误追踪可能更加困难。

  • 资源管理:异步操作需要额外的资源管理,如事件循环或线程池,可能增加系统复杂性。

总结 异步调用通过非阻塞操作提高了系统的并发性和响应速度,适用于需要处理大量并发请求或长时间操作的场景。常见的实现方式包括回调函数、Future对象和事件驱动模型。根据具体需求选择合适的异步调用方式,可以显著提高系统性能和用户体验。

参考文献