七的博客

手写RPC框架系列(一) - RPC基础理论与架构

RPC手写系列

手写RPC框架系列(一) - RPC基础理论与架构

本章节的大概内容如下:

  • RPC 是什么
  • RPC 的应用场景
  • RPC 的基本工作原理
  • RPC 的关键组件
  • 流行的 RPC 框架介绍
  • RPC 的优势以及挑战

1. 什么是 RPC?

RPC(Remote Procedure Call)即远程过程调用,它允许像调用本地函数一样去调用其他服务器上的服务接口。RPC 屏蔽了底层通信细节,使得开发者可以更加专注于业务逻辑的实现。

这里需要注意 RPC并非规范或者协议,它是一种技术思想。RPC 的本质是为了解决应用间通信而产生的。通过 RPC,不同的应用可以像调用本地方法一样方便地进行交互和数据交换。

2. RPC 应用场景

RPC 的应用场景非常广泛,主要包括:

  • 企业内部应用间的服务调用:当应用进行功能划分和服务拆分后,不同服务之间可以使用 RPC 进行通信和数据交换。
  • 中间件与客户端之间的通信:中间件可以通过 RPC 与调用客户端进行交互。
  • 分布式系统中的服务间通信:在分布式系统中,不同节点上的服务可以通过 RPC 进行远程调用和数据传输。

总的来说,只要涉及到网络通信,就有可能会用到 RPC。RPC 为应用间通信提供了一种简单、高效的解决方案。

3. RPC 的基本工作原理

RPC 工作的基本流程如下:

  1. 客户端发起调用: 客户端程序调用本地的代码 ( stub ),这个调用包含了要执行的函数以及参数。
  2. 服务端接收请求: 服务端接收到请求后,解包得到请求的详细信息,然后调用本地的方法。
  3. 执行服务并响应: 服务端将本地方法的返回结果应答给客户端。
  4. 客户端接收响应: 客户端收到服务端的响应后,解包得到结果,返回给调用方。

下面是一个简化的时序图,展示了 RPC 的基本工作流程:

RPC基本工作原理

4. RPC 关键组件

动手前还是得先了解下 RPC 的几个关键组件,以免写完后稀里糊涂。

主要关键组件:

  • 客户端代理 ( Client Stub ): 封装网络通信细节,负责将调用请求发送到服务端,并接收服务端的响应结果。
  • 服务端代理 ( Server Stub ): 接收客户端的请求,调用对应的本地服务,并将执行结果返回给客户端。
  • 通信协议: 定义客户端和服务端之间数据传输的格式,常见的协议有 HTTP、TCP 等。
  • 序列化以及反序列化: 将对象转换成可以传输的格式,将传输的数据转回对象,对数据的传输很重要。
  • 服务注册以及发现: 跨系统通信时,服务提供者将自己的网络地址以及提供访问的服务注册到注册中心中,客户端则通过注册中心获取可以调用的服务实例信息。

5. 流行的 Rpc 框架一览

目前业界有许多优秀的 RPC 框架,下面简单介绍几个流行的 RPC 框架:

5.1 Apache Dubbo

  • 官网: https://dubbo.apache.org/zh/

  • 阿里巴巴开源的 RPC 框架,国内使用最广泛的 RPC 框架之一。

  • 面向接口代理的高性能RPC调用。

  • 提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。

  • 支持多种协议以及序列化方式,可扩展性强。

5.2 Weibo Motan

  • 官网:https://github.com/weibocom/motan

  • 新浪微博开源的 RPC 框架,基于 Java 语言开发。

  • 支持服务高可用以及负载均衡。

  • 目前支持 Java、Go 语言的客户端。

5.3 Sofa Rpc

5.4 Google gRpc

  • 官网: https://grpc.io/

  • Google 开源的 RPC 框架。

  • 基于 Protobuf 以及 Http/2 协议的跨语言 RPC 框架。

  • 支持多种通信协议、多语言。

  • 提供服务注册、服务发现以及服务治理能力。

5.5 Baidu Brpc

  • 官网: https://brpc.apache.org/

  • 百度开源的工业级 RPC 通信框架,主要用于 C++ 语言。

  • 具有高性能、多协议、易扩展的特点。

  • 在百度内部广泛用于各种业务场景。

6. 优势以及挑战

RPC 可以带来很多优点,包括但不限于:

  • 调用方无需关心服务的具体地址,使得服务的部署更加灵活。
  • 客户端和服务端可以使用不同的编程语言进行通信,提高了系统的异构性。
  • 通过高效的网络通信和序列化机制,提升了系统的性能。

同时我们也应该注意到,引入 RPC 也会带来额外的挑战,例如:

  • 服务的可用性:由于 RPC 调用涉及网络通信,因此需要考虑服务的高可用性,避免单点故障对整个系统造成影响。

  • 调试和排错:分布式系统中的 RPC 调用错误可能更难定位和排查,我们需要通过日志来快速分析问题。

  • 服务治理: 随着系统规模的增大,需要引入服务治理措施,如服务注册、服务发现、负载均衡、熔断等,以保证系统的稳定性和可扩展性。

  • 性能优化:RPC 调用涉及网络通信和数据序列化,因此需要对性能进行优化,如减小传输数据量、使用高效的序列化协议等。

7.总结

本章为后续章节的实践部分奠定了理论基础。在接下来的章节中,我们将基于这些理论知识,手写一个简单的 RPC 框架,深入理解 RPC 的实现原理。