最近分析的这个系统,逻辑架构中有一层是RPC interface。之前对RPC不熟悉,就上网搜索了一下资料,在此总结一下:
RPC是Remote Procedure Calling,远程过程调用的缩写。并不是“远程进程调用”——Remote Process Calling。RPC总的来说是一个Client/Server的结构,提供服务的一方称为Server,消费服务的一方称为Client。 
下图是本地过程调用,所有的过程都在本地服务器上,依次调用即可。

下图则是所谓的远程过程调用,需要在Client和Server中交互。


因此,两种调用方式,会产生什么区别呢?

1、网络传输的开销和编程的额外复杂性。
2、本地过程调用中,过程在同一块物理内存中,因此就可以传递指针了。而远程过程调用则不能,因为远程过程与调用者运行在完全不同的地址空间中。 
3、远程过程不能共享调用者的环境,所以它就无法直接访问调用者的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要素:

1、server必须发布服务。 
2、在client和server两端都需要有模块来处理协议和连接。 
3、server发布的服务,需要将接口给到client。

当然,应用协议是什么样的,怎么连接,服务接口怎么给到client,是可以自行实现的,选择余地很大。但是RPC协议提供了一种标准的建议,如果没有特别的理由,我认为没有必要自行实现,但是清楚这个原理,总是好的。

最后回到我最近正在分析的系统上来说。本文一开始就提到,它的架构中有一个RPC Interface。

由于这不是一个开源系统,所以我并不清楚它的RPC Interface的实现,也就是说,我并不清楚它的应用协议和传输协议是什么。姑且假设它是用的标准RPC协议的。

但是它将server服务发布给client的方式,是向client提供了API,对JAVA平台的程序员来说,就是一个xxx.jar。

这个jar包里,有2部分内容:

1、client stub,包括接口和封装过的数据结构。即ServerService,和XXXForm、XXXFilter等。那对于client程序员来说,就只需要调用ServerService.xxxx()的方法,并组装XXXForm对象作为参数即可,类似

public interface ServerService{  

    public XXXFilter giveMeTheFilter(XXXForm form);  

}  

程序员只需要关心怎么封装合适的XXXForm,以及什么时候调用giveMeTheFilter()方法即可,底层的协议,server端的实现,对client程序员来说都是透明的。

2、RPC Interface层的实现。这部分就做了协议解析、连接处理、异常处理等,但这部分类,是不对client程序员开放的。这种通过API(SDK),向client发布服务的方式,我认为是有可取之处的。

参考:RPC和WebService的区别

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

RPC和WebService的区别的更多相关文章

  1. 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比

    总结这些概念都是易混淆,最基本概念定义复习和深入理解,同时也是架构师必备课程 RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到 ...

  2. 软件架构设计学习总结(15):远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比

    总结这些概念都是易混淆,最基本概念定义复习和深入理解,同时也是架构师必备课程   RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请 ...

  3. SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系

    SOA,Webservice,SOAP,REST,RPC,RMI的区别与联系 SOA面向服务的软件架构(Service Oriented Architecture) 是一种计算机软件的设计模式,主要应 ...

  4. RPC与RMI的区别

    分布式项目按照以下发展经历了以下技术: CORBA: RMI:基于远程接口的调用 RMI-RROP:这是RMI与CORBA的结合,用在了EJB技术上,EJB留给世界上是优秀的理论和糟糕的架构. WEB ...

  5. RPC和RMI的区别(Difference Between RPC and RMI)

    RPC和RMI的区别(Difference Between RPC and RMI) RPC vs RMI RPC (Remote Procedure Call) and RMI (Remote Me ...

  6. WebAPI和WebService的区别

    WebAPI和WebService的区别 WebAPI用的是http协议,WebService用的是soap协议 WebAPI无状态,相对WebService更轻量级.WebAPI支持如get,pos ...

  7. 几种常用远程通信技术(RPC,Webservice,RMI,JMS)的区别

    原文链接:http://blog.csdn.net/shan9liang/article/details/8995023 RPC(Remote Procedure Call Protocol) RPC ...

  8. 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)

    RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成&qu ...

  9. JAVA远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)

    RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成&qu ...

随机推荐

  1. 【8086汇编-Day1】预备知识

    菜鸟的8086汇编入门之旅,偶有错处恭请大佬们指正. Ⅰ· 闲说一下 我为什么学汇编?相对于晦涩难懂的01010101011010机器语言(高低电平变化驱动机器做出不同反应),汇编语言用更便于记忆和使 ...

  2. 20155233 《Java程序设计》 实验三 敏捷开发与XP实践

    20155233 <Java程序设计> 实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤与内容 1.在IDEA中使用工具(Code->Reformat ...

  3. 《Java 程序设计》课堂实践一

    由于我的IDEA在课堂上临时崩坏导致当时无法编程,修了很长一段时间解决了诸多问题才修好 现将三个题目解答如下 一.MySort 模拟实现Linux下Sort -t : -k 2的功能.参考 Sort的 ...

  4. XML2JSON 的【net.sf.json.JSONException: nu.xom.ParsingException must be followed by either attribute specifications, ">" or "/>"】问题解决办法

    在使用JSon-Lib库进行XML2JSon的转换时,在JUnit测试时没有什么问题,但是在Tomcat里面跑的时候,抛出了下面的异常,查找了google,发现关于这方便的文章比较少,即使有,也需要F ...

  5. 10_SpringBoot集成TkMybatis插件

    10_SpringBoot集成TkMybatis插件 明天你好向前奔跑 关注  0.5 2018.09.11 11:15 字数 163 阅读 3794评论 0喜欢 3 @Author Jacky Wa ...

  6. cf 448c Painting Fence

    http://codeforces.com/problemset/problem/448/C 题目大意:给你一个栅栏,每次选一横排或竖排染色,求把全部染色的最少次数,一个点不能重复染色. 和这道题有点 ...

  7. TPO 02 - Desert Formation

    TPO 02 - Desert Formation NOTE: 主要意思(大概就是主谓宾)用粗体标出:重要的其它用斜体: []中的是大致意思,可能与原文有关也可能无关,但不会离题 目的为训练句子/段落 ...

  8. Adobe InDesign CS6自学入门到高级视频教程

    关键字:Adobe InDesign 视频教程 点击获取视频教程 教程目录 第1章/1.卸载InDesign CS6.avi 第1章/2.安装InDesign CS6.avi 第2章/1.创建并编辑自 ...

  9. hive on hbase 数据表关联

    有时,数据可以容易的存储在hive中,但是要导入到hbase里,可以不用写MR程序来操作,可以使用hive on hbase方式来创建相应的表关联关系来将hive中的数据导入到对应的hbase的表里, ...

  10. 提升Android ListView性能的几个技巧

    ListView如何运作的? ListView是设计应用于对可扩展性和高性能要求的地方.实际上,这就意味着ListView有以下2个要求: 尽可能少的创建View: 只是绘制和布局在屏幕上可见的子Vi ...