将我的服务开放给用户:什么是RPC?| 豆包MarsCode AI刷题

118 阅读3分钟

什么是RPC

RPC, Remote Produe Calls, 即远程过程调用。

要提到RPC, 就需要先说说没有RPC的时候,人们是怎么做的。

在RPC之前只有本地过程调用,实际上可以把它理解为调用本地函数。如此以来RPC的作用就很清楚了,负责调用远程函数。

1984年Nelson的论文中提出了RPC过程的5个要素:User、User-Stub、RPC-Runtime、Server-Stub、Server. 在他的模型中,User负责发出调用和接收返回,Server负责处理请求,User-Stub负责封装参数和解除返回值封装,Server-Stub与此相反,RPC-RUntime则负责在两端间传递封装的请求包和返回包。

相比于本地函数调用,我们并不知道远程提供的方法参数和返回值是什么样的,因此我们需要有一个统一的接口描述文档,也就是IDL(Interface description laguage)文件。

为什么使用RPC

首先第一点,将原本耦合的模块分开来开发,可以使得不同人可以独立地并行开发不同的模块,只要对方遵守接口文档即可。

其次,因为相同模块遵守一样的接口,因此可以方便地实现服务扩容和切换,只需要将服务注册到注册中心即可。

最后是降低了故障率,如果有一台服务器死机了,我们也可以方便的把服务转移到其它机器上。

不过这特点靠自己不太好实现,目前市面上已经有了非常多的封装好的RPC框架,可以实现开箱即用,如Java的SpringCloud等。

RPC分层设计

在Apache Thrift中,RPC有如下几层:

  1. 用户编写的业务逻辑代码层
  2. IDL文件转码层
  3. 框架的编解码层
  4. 框架协议层
  5. ……略过中间众多层
  6. 框架网络通信层

其中IDL文件编解码层就是将IDL文件转化为不同语言的实现,这样就可以让不同的语言来共同完成一个项目。

另外在数据传输方面,虽然许多语言都支持将其序列化的功能,但是这些一般只能在语言内部使用,无法跨语言通信。因此更常见的做法是转化为JSON或者XML等格式;也可以使用Protobuf等转化为二进制编码。

RPC的关键指标

稳定性

首先是提供了熔断功能,防止一个服务不可用导致全链路崩溃;

其次是提供限流功能,防止过多请求压垮服务;

第三是提供了超时控制。

易用性

PRC框架作为一个体系,其应当提供丰富的文档和一定的代码生成工具。

扩展性

在RPC框架的不同组件中,通过使得不同组件遵守一定接口标准,这样任何符合标准的组件都可以自由替换修改现有体系,实现高拓展性。

可观测性

这里指的是RPC框架会提供一些检测工具来观测服务状况,如注册中心服务就可以检查服务健康状况等。

高性能

RPC框架天然适配分布式服务。通过分布式实现多机架构,可以轻松实现高吞吐和低延迟。