RPC技术入门知识
什么是RPC?
摘抄来自WIKI-RPC的一段解释,经过自己的理解翻译如下。
远程过程调用(remote procedure call)是指计算机程序执行一个在不同的地址空间(通常在共享网络的另一台计算机上)的程序或函数时,其编码方式就像是普通的(本地)函数调用一样,程序员无需为远程交互明确编码细节。即无论这个要运行的程序是本地程序还是远程程序,程序员都编写基本相同的代码。这是客户端-服务器交互的一种形式(调用者是客户端,执行者是服务器),通常是通过请求-响应消息传递系统来实现的。
直观的总结:这里的RPC泛指一种技术实现,程序员无需做过多交互细节,RPC能实现基本无感的跨进程函数调用。
RPC的关键技术
从简介上看,RPC本质上要解决也是跨进程通信的问题,但是要想跨不在同一系统的进程还需要进行更多的操作,这也就延伸出了一系列问题,RPC的关键技术就是解决了下面这些问题。
- 网络通信问题。
要想调用网络的另一台计算机上的程序,那么就不可避免的要发起网络通信,要想RPC的整体健壮稳定,良好的网络通信模型和应用层协议是必不可少的。这里的通信模型可以泛指IO模型,而应用层通信协议有在Web中最常用的HTTP协议。但是,一般RPC的实现都是采用基于TCP实现的自定义应用层协议,目的是有助于提高RPC的性能。
- 方法定位问题
调用者和服务提供者处于两个不同的环境当中,内存的方法信息是不可能相同的。调用者想直接调用是不可能的,要想远程调用像本地代码调用一样,那么就需要维护一个映射关系。每次调用时,提供目标方法对应的唯一识别码(ID),然后由服务者提供者进行ID识别,随后进行方法的映射,这样就能通过ID进行识别调用。
- 数据的序列化和反序列化。
网络通信的问题解决了、方法的定位也解决了。接下就从调用函数这个思想出发,调用一个函数就会有输入、输出这两种数据。那么,一个调用发起者想要发起一次调用,该怎么把存放在本地内存中的数据传输到远程的计算机上呢?而传输到远程计算机的数据又该如何将获取的数据转化为自己能识别的格式呢?这里就分别涉及到数据的序列化和反序列化问题。当然这里只是提到了基本的需求,而如果要高效、健壮的实现方法,这里就不能简单的一笔带过。每种语言都有自己独有的序列化格式,如果RPC想要一种跨语言通用的数据格式,那比较常见的就是JSON,它的通用性、兼容性、易读性都非常优秀,但是在性能上可能较差。这里就要提到一种性能优秀,同样也有跨语言平台支持的数据格式Protobuf,下一次会利用一篇文章来介绍这一个数据格式。
RPC的调用过程
基本上,解决完上述问题,一个简单的RPC框架就实现了。一个功能较为正常的RPC框架是在上述的技术基础上完成的,下面以一个图片为例说明一次远程调用的过程。
- 客户端的代码准备调用远程服务端的方法,客户端代码不会直接去执行一系列的操作进行远程调用,要知道我们强调的是无感操作。所以,这里调用的是一个client stub(这里stub可以理解为一个RPC框架的代码,它代替业务代码为RPC做好了准备),下面我们都称stub为RPC框架。这个时候RPC框架代替我们进行一系列的操作(封装数据和方法定位信息、序列化等)
- RPC框架将所有信息通过封装序列化后,调用系统内核,准备进行网络传输。
- 系统内核通过传输层协议进行网络传输,这里我们就认为它通过tcp协议传输。
- 服务端RPC框架收到数据后,将二进制的数据进行反序列化,将数据转化为本地应用能识别的数据格式。具体的转换方式,则需要具体分析,这里可以简略。
- 服务端RPC框架根据传入的数据,定位出需要调用的方法,并将参数传入。
- 方法调用完成,将方法的调用结果返回给服务端RPC框架。
- 服务端以同样的方式,将方法调用结果序列化以网络通信的形式返回给客户端。
- 该步骤与3类似。
- 客户端RPC框架以同样的方式读取远程调用的结果值。
- 客户端RPC框架将转化后的结果返回给本地方法。
为什么要使用RPC
了解了RPC技术的基本原理,你会发现,这种交互方式与日常的HTTP Api调用好像也是类似的,并且RPC会更加的复杂。那么,既然有了基于HTTP调用这种交互方式,那么为什么还会有RPC这种形式呢?什么时候使用RPC比较合适?在查找相关网站后,我也总结了一些比较合理的说法。
首先要搞清楚的一点是,RPC这个概念其实是比HTTP出现的要早的,甚至这两者都不是同一个层面上的东西,因为RPC的实现也可能利用HTTP协议。所以问题就集中在了,什么时候用广泛意义上的Web-API接口,什么时候用RPC框架进行远程调用。
-
RPC的优点
1.可以传输层TCP进行应用层协议的定制,避免了HTTP接口中大量的头部信息占用,简而言之就是网络延迟会更低,意味着有更快的速度。
2.注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理、发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
-
RPC 使用场景
主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。大型的网站,内部子系统较多、接口非常多的情况下适合使用 RPC。