RPC是Remote Procedure Calling,远程过程调用的缩写。并非“远程进程调用”——Remote Process Calling。RPC总的来讲是一个Client/Server的结构,提供服务的一方称为Server,消费服务的一方称为Client。
下图是本地过程调用,全部的过程都在本地服务器上,依次调用便可。
下图则是所谓的远程过程调用,须要在Client和Server中交互。
所以,两种调用方式,会产生什么区别呢?
一、网络传输的开销和编程的额外复杂性。
二、本地过程调用中,过程在同一块物理内存中,所以就能够传递指针了。而远程过程调用则不能,由于远程过程与调用者运行在彻底不一样的地址空间中。
三、远程过程不能共享调用者的环境,因此它就没法直接访问调用者的I/O和操做系统API。
简单来讲,就是远程过程调用会比本地过程调用复杂。除了性能的额外开销以外,编程也复杂得多。
至少能够想到,交互双方须要可以封装数据结构,理解协议,处理链接等等,确实是很麻烦的。可能一个很简单的调用,却须要作不少的编程工做。因此,为了简化RPC调用的编程,就提出了一个RPC的标准模型。
下面是RPC的原理草图。
能够看到,该模型中多了一个stub的组件,这个是约定的接口,也就是server提供的服务。注意这里的“接口”,不是指JAVA中的interface,由于RPC是跨平台跨语言的,用JAVA写的客户端,应该可以调用用C语言提供的过程。
对客户端来讲,有了这个stub,RPC调用过程对client code来讲就变成透明的了,客户端代码不须要关心沟通的协议是什么,网络链接是怎么创建的。对客户端来讲,它甚至不知道本身调用的是一个远程过程,仍是一个本地过程。
而后,前面说的理解协议,处理链接的工做,老是要有人作的,这个工做就是在下面的RPC Interface里完成的。
最近几年,遇到这种场景(须要调用远程机器上的服务),每每会考虑用web service来完成,其实我认为web service和RPC是很是相像的,下面是web service的原理草图
对比一下RPC草图,就会发现很是的接近。在组件层次,和交互时序上彻底没有差异,只是方框内的字不同,可是实际上承担的职责倒是彻底对应的。
web service接口就是RPC中的stub组件,规定了server可以提供的服务(web service),这在server和client上是一致的,可是也是跨语言跨平台的。同时,因为web service规范中的WSDL文件的存在,如今各平台的web service框架,均可以基于WSDL文件,自动生成web service接口。
下面的web service框架,根据所选的平台有所不一样,好比在JAVA平台中,如今最流行的是apache的cxf框架。它作的事情也和RPC Interface是同样的,负责解析协议(SOAP协议),负责处理链接(创建HTTP链接)。
所以,我认为RPC和web service很是得接近,只是RPC的传输层协议,以及应用层协议,能够自行实现,因此选择的余地更大一点。可能会在性能和传输效率上,有更大的优点(不必定) 。
和web service有不少成熟框架可供选择同样,RPC也有不少现成的框架可供选择,好比在JAVA平台上有nfs-rpc等。
总结来讲,要实现远程过程调用,须要有3要素:
一、server必须发布服务。
二、在client和server两端都须要有模块来处理协议和链接。
三、server发布的服务,须要将接口给到client。
固然,应用协议是什么样的,怎么链接,服务接口怎么给到client,是能够自行实现的,选择余地很大。可是RPC协议提供了一种标准的建议,若是没有特别的理由,我认为没有必要自行实现,可是清楚这个原理,老是好的。
最后回到我最近正在分析的系统上来讲。本文一开始就提到,它的架构中有一个RPC Interface。
因为这不是一个开源系统,因此我并不清楚它的RPC Interface的实现,也就是说,我并不清楚它的应用协议和传输协议是什么。姑且假设它是用的标准RPC协议的。
可是它将server服务发布给client的方式,是向client提供了API,对JAVA平台的程序员来讲,就是一个xxx.jar。
这个jar包里,有2部份内容:
一、client stub,包括接口和封装过的数据结构。即ServerService,和XXXForm、XXXFilter等。那对于client程序员来讲,就只须要调用ServerService.xxxx()的方法,并组装XXXForm对象做为参数便可,相似
public interface ServerService{
public XXXFilter giveMeTheFilter(XXXForm form);
}
程序员只须要关心怎么封装合适的XXXForm,以及何时调用giveMeTheFilter()方法便可,底层的协议,server端的实现,对client程序员来讲都是透明的。
二、RPC Interface层的实现。这部分就作了协议解析、链接处理、异常处理等,但这部分类,是不对client程序员开放的。这种经过API(SDK),向client发布服务的方式,我认为是有可取之处的。