文档章节

RPC简介,及与web service的对比

添仔哥哥
 添仔哥哥
发布于 2017/06/02 15:05
字数 1483
阅读 17
收藏 2
点赞 0
评论 0

  最近分析的这个系统,逻辑架构中有一层是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要素:

  • server必须发布服务。
  • 在client和server两端都需要有模块来处理协议和连接。
  • 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发布服务的方式,我认为是有可取之处的。

本文转载自:http://blog.csdn.net/tanga842428/article/details/52159757

共有 人打赏支持
添仔哥哥
粉丝 3
博文 105
码字总数 41550
作品 0
广州
程序员
轻量级MVC框架--Struts4RCP

简介 Struts(for)RCP是一个适用 于RCP/RIA应用的轻量级MVC框架,与Struts功能相似,提供远程MVC控制器支持,简化模型与视图的交互过程。 MVC: Model View Controller RCP: Rich Client Plat...

匿名 ⋅ 2010/03/10 ⋅ 0

Web Service简介

1.定义 由两部分组成 ·SOAP--Web Service之间的基本通信协议。 ·WSDL--Web Service描述语言,它定义了Web Service做什么,怎么做和查询的信息。 2.简单的Web Service实现 包含四个基本步骤...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

【2016-05-08】Jersey vs. SpringMVC

当前Web Service 常用的风格有两种,RESTful风格和RPC风格。 一、RESTful与RPC简介 RPC的中心是方法,REST的中心是资源。 RPC:其中RPC风格中常见的有XML-RPC和JSON-RPC,JSON以其简洁、传输...

rathan0 ⋅ 2016/05/08 ⋅ 0

rest .soap 和xml-RPC 简单描述

REST、SOAP和XML-RPC简单描述! 目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。X...

phacks ⋅ 2014/07/07 ⋅ 0

REST(ful)框架--RichRest

简介 RichRest是一个适用于 RCP/RIA应用的REST(ful)框架,提供远程资源管理接口,以及远程MVC控制器支持,简化模型与视图的交互过程。 REST: Representational State Transfer (http://zh.w...

匿名 ⋅ 2010/03/10 ⋅ 0

Spring+Netty+Protostuff+ZooKeeper实现轻量级RPC服务

RPC简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样。 RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协...

Listen_ing ⋅ 2016/05/26 ⋅ 12

分布式服务框架

转公司wiki博客. 分布式服务框架是面向服务架构的基石,是解耦子系统的利刃。核心实现是RPC(远程过程调用),但又不仅限于RPC,因为一个系统的高效、稳定、可靠的运行还需要依赖于服务管理发...

郭恩洲_OSC博客 ⋅ 2015/09/11 ⋅ 0

谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解

SOA: 维基百科解释:SOA:面向服务的软件架构(Service Oriented Architecture),是一种计算机软件的设计模式,主要应用于不通应用组件中通过某种协议来互操作,例如典型的通过网络协议。因此...

tantexian ⋅ 2016/04/11 ⋅ 0

herowjun/jfinal-wxmall

一直以来找不到合适的开源微信商城,本人最终自主研发,基于jfinal web框架开发出微信商城,微信分销商城,并经过客户锤炼,源码拿来即可对项目进行实施,节省大部分时间去陪老婆。。。创业维...

herowjun ⋅ 2017/03/17 ⋅ 0

开源微信商城--jfinal-wxmall

一直以来找不到合适的开源微信商城,本人最终自主研发,基于jfinal web框架开发出微信商城,微信分销商城,并经过客户锤炼,源码拿来即可对项目进行实施,节省大部分时间去陪老婆。。。创业维...

广州点步 ⋅ 2017/03/18 ⋅ 6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

阿里云云栖社区 ⋅ 20分钟前 ⋅ 0

Ubuntu部署django问题汇总

使用Anaconda3的Python3.6的pip安装UWSGI报错 原因是gcc版本不兼容,安装4.7并修改gccsudo apt-get install gcc-4.7sudo mv /usr/bin/gcc /usr/bin/gcc.baksudo ln -s /usr/bin/gcc-4.......

wuyaSama ⋅ 23分钟前 ⋅ 0

从方法论到零售客户实践 解码阿里巴巴数据中台——2018上海云栖大会

摘要: 一、数据中台之道 6月8日,上海云栖大会进入了第二天的议程,数据中台专场论坛座无虚席,数据中台总架构师邓中华女士向在场的观众介绍了数据中台的衍生发展之道。 基于OneID、OneData...

猫耳m ⋅ 23分钟前 ⋅ 0

Docker减肥小记

如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察 如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无用的镜像、容器、网络和数据卷… 1、查看...

寰宇01 ⋅ 34分钟前 ⋅ 0

微信小程序中如何使用WebSocket实现长连接(含完整源码)

本文由腾讯云技术团队原创,感谢作者的分享。 1、前言 微信小程序提供了一套在微信上运行小程序的解决方案,有比较完整的框架、组件以及 API,在这个平台上面的想象空间很大。腾讯云研究了一...

JackJiang- ⋅ 41分钟前 ⋅ 0

定制库到Maven本地资源库

1.如果只有定制库的JAR文件 下载链接如下:pdf.jar 2.使用命令转换成Maven本地资源 mvn install:install-file -Dfile=/Users/manager/Downloads/clj-pdf-2.2.33.jar -DgroupId=clj-pdf -Dar......

年少爱追梦 ⋅ 46分钟前 ⋅ 0

高仿springmvc之xuchen-mvc

package org.mvc.framework.servlet; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.......

徐志 ⋅ 48分钟前 ⋅ 0

关于自定义URLStreamHandler的一次踩坑

关于自定义URLStreamHandler的一次踩坑 20180625 lambo init 说明 一般自定义实现url的协议解析.方案为实现URLStreamHandler.实现其 openConnection 就可以了, 如果我们执行 new URL("xx://...

林小宝 ⋅ 49分钟前 ⋅ 0

【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书

演示证书文件 链接: https://pan.baidu.com/s/1ijHNnMQJj7jzW-jXEVd6Gg 密码: vfva 所需jar包 <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on --> <dependenc......

小帅帅丶 ⋅ 50分钟前 ⋅ 0

用Calendar 实现 计算 一段时间的毫秒值

Calendar c=Calendar.getInstance();c.add(Calendar.MONTH, -1);int lastMonthMaxDay=c.getActualMaximum(Calendar.DAY_OF_MONTH);c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH)......

岸芷汀兰 ⋅ 53分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部