RPC和WebService的区别

 

最近分析的这个系统,逻辑架构中有一层是RPC interface。以前对RPC不熟悉,就上网搜索了一下资料,在此总结一下:
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发布服务的方式,我认为是有可取之处的。

 

参考:RPC和WebService的区别程序员

参考:web service与远程调用(RPC)的区别web

相关文章
相关标签/搜索