RPC是什么?原理是什么?
什么是 RPC 框架
RPC 的全称是 Remote Procedure Call,即远程过程调用。
从字面意思可以知道,远程肯定是指要跨机器而非本机,需要网络编程才能实现。但是不是只要通过网络通信访问到另一台机器的应用程序,就可以称之为 RPC 调用了?
其实 RPC 是帮助我们用来屏蔽网络编程细节,实现调用远程方法就跟调用本地方法(同一个项目中的方法)一样的简单,不需要因为网络编程而写很多与业务无关的代码。总之,RPC 的作用体现在两方面:
- 屏蔽远程调用根本地调用的区别,调用远程方法就像调用本地方法一样简单
- 隐藏底层网络通信的复杂性,让我们更专注于业务逻辑
为什么需要 RPC 呢?
两个不同的服务器上的服务提供的方法不在一个内存空间,所以,需要通过网络编程才能传递方法调用所需要的参数。并且,方法调用的结果也需要通过网络编程来接收。但是,如果我们自己手动网络编程来实现这个调用过程的话工作量是非常大的,因为,我们需要考虑底层传输方式(TCP还是UDP)、序列化方式等等方面。RPC 就能很好的帮助我们解决这个问题。
RPC 的原理
我们先来看看一个 RPC 框架的基本架构:
RPC 框架包含三个最重要的组件,分别是客户端、服务端和注册中心。在一次 RPC 调用流程中,这三个组件是这样交互的:
- 服务端在启动后,会将它提供的服务列表发布到注册中心,客户端向注册中心订阅服务地址;
- 客户端会通过本地代理模块 Proxy 调用服务端,Proxy 模块收到负责将方法、参数等数据转化成网络字节流;
- 客户端从服务列表中选取其中一个的服务地址,并将数据通过网络发送给服务端;
- 服务端接收到数据后进行解码,得到请求信息;
- 服务端根据解码后的请求信息调用对应的服务,然后将调用结果返回给客户端。
上面是 RPC 框架的一个基本结构,下面我们再将这个架构图详细一点:
从图中我们可以知道 RPC 框架一般有这些组件:服务治理(注册发现)、负载均衡、容错、序列化/反序列化、编解码、网络传输、线程池、动态代理等角色,当然有的RPC框架还会有连接池、日志、安全等角色。
接下来我们看看一次 RPC 调用的流程:
- 服务消费方(Client)以本地调用方式调用服务。
- Client stub 接收到调用后负责将方法、参数等封装成能够进行网络传输的消息体。
- Client stub 将消息进行编码并发送到服务端。
- Server stub 收到消息后进行解码。
- Server stub 根据解码结果调用本地的服务。
- 本地服务执行并将结果返回给 Server stub。
- Server stub 将返回导入结果进行编码并发送至消费方。
- Client stub 接收到消息并进行解码。
- 服务消费方(Client)得到结果。
至此,一次RPC框架的调用过程就完了。好啦,我们的RPC基本介绍和原理完了,里面还有很多的细节值得我们的探索,最重要的还是将这个 RPC 实现出来,敬请期待后面的内容吧。