什么是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有如下几层:
- 用户编写的业务逻辑代码层
- IDL文件转码层
- 框架的编解码层
- 框架协议层
- ……略过中间众多层
- 框架网络通信层
其中IDL文件编解码层就是将IDL文件转化为不同语言的实现,这样就可以让不同的语言来共同完成一个项目。
另外在数据传输方面,虽然许多语言都支持将其序列化的功能,但是这些一般只能在语言内部使用,无法跨语言通信。因此更常见的做法是转化为JSON或者XML等格式;也可以使用Protobuf等转化为二进制编码。
RPC的关键指标
稳定性
首先是提供了熔断功能,防止一个服务不可用导致全链路崩溃;
其次是提供限流功能,防止过多请求压垮服务;
第三是提供了超时控制。
易用性
PRC框架作为一个体系,其应当提供丰富的文档和一定的代码生成工具。
扩展性
在RPC框架的不同组件中,通过使得不同组件遵守一定接口标准,这样任何符合标准的组件都可以自由替换修改现有体系,实现高拓展性。
可观测性
这里指的是RPC框架会提供一些检测工具来观测服务状况,如注册中心服务就可以检查服务健康状况等。
高性能
RPC框架天然适配分布式服务。通过分布式实现多机架构,可以轻松实现高吞吐和低延迟。