`
xinklabi
  • 浏览: 1591505 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

Rest与RPC比较

阅读更多

基本概念

1. rest和rpc架构的概念

REST架构:
方法信息(method information)都在HTTP方法(HTTP method)里.

面向资源的架构(ROA): 作用域信息(scoping information)都在URI里.

如果一个系统架构的实现, 完全满足以上两条,则可以认为是一个纯正的rest架构, 如果都不满足,则是一个典型的rpc架构。通常来说,更常见的可能是一种rest-rpc 混合架构.

作者也指出:

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->许多只读的Web服务,尽管它们起初也许是按RPC风格设计的,但它们都可称得上是完全REST式和面向资源的! 但是,如果该服务允许客户端修改数据的话,就会出现客户端所使用的HTTP方法与真正的方法信息不一致的情况——这样它就不具备REST式服务的特征了。 像这样的服务,我称之为REST- RPC混合服务。



RPC式架构:方法信息和作用域信息都在信封(envelope)或报头(headers)里。 具体采用哪种信封,并不影响这里的分类,不过HTTP是一种常见信封格式. RPC将服务器看作是由一些过程组成,客户端调用这些过程来执行特定的任务。这种特定决定了rpc调用的高耦合性,不过就应用开发的角度来说,很多人不会去关心这个问题。

分布式对象架构:分布式对象架构将服务器看做远程对象的组合,通过代理调用远程对象来掩饰本地对象和远程对象的差别。分布式对象结构的主要缺点是粒度的控制问题,另外某种意义上分布式对象结构依然是rpc风格的,只不过做了更好的掩饰。

2. big soap webservice中的rpc和document的概念

顺手补习一下 ws * 中的rpc和document的概念。

常见两种编码绑定方式, rpc风格和document风格, 虽然后者理论上号称是非rpc方式的面向消息的封装,并具有一些理论上的优点,但实际情况仍然是rpc方式。

可以从xml文件的结构来看两种模式的差异

rpc风格
请求包

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><?xml version="1.0" ?>
<soapenv:Envelope
      
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
      xmlns:ns1
="http://item.service.soap.soajava.packt.com/">
  
<soapenv:Body>
    
<ns1:insert> // method name bingding
    
<arg0> // parameter
      
<code>XY</code>
      
<description>xy desc</description>
      
<id>26</id>
    
</arg0>
    
</ns1:insert>
  
</soapenv:Body>
</soapenv:Envelope>


一个rpc调用总是由4部分组成

  • A remote address
  • A method (or operation) name
  • A sequence of parameters
  • A synchronous response

这4部分基本和一个程序语言的方法调用一致。
rpc风格的wsdl文件描述

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->      <message name="insert">
         
<part name="itemParam" type="tns:item"></part>
         
<part name="categoryParam" type="xsd:string"></part>
      
</message>
      
<message name="insertResponse">
         
<part name="return" type="tns:outcome"></part>
      
</message>
      
<portType name="ItemWs">
         
<operation name="insert" parameterOrder
                                     "itemParam categoryParam"
>
            
<input message="tns:insert"></input>
            
<output message="tns:insertResponse"></output>
         
</operation>
      
</portType>
      
<binding name="ItemWsPortBinding" type="tns:ItemWs"> 
         
<soap:binding style="rpc" 
                    transport
="http://schemas.xmlsoap.org/soap/http">
         
</soap:binding>
         
<operation name="insert">
            
<soap:operation soapAction=""></soap:operation> 
            
<input> 
               
<soap:body use="literal" namespace
                       "http://item.service.soap.soajava.packt.com/"
>
               
</soap:body> 
            
</input> 


Document 风格
请求包

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->  <ns1:itemInsertRequestParam> // no method call here
            
<category>A</category>
            
<item>
               
<code>XY</code>
               
<description>xy desc</description>
               
<id>26</id>
            
</item>
  
</ns1:itemInsertRequestParam>


虽然看起来差别不大,但是此处已经没有所谓明显的方法调用特征,无方法名和参数绑定,即请求包是以所谓document为处理核心的,而document可以理解为一种resouce或者message。(呵呵,有点自欺欺人)。

更大的差别在wsdl的描述上

<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->  <message name="insert"> 
         
<part element="tns:itemInsertRequestParam"
                  name
="itemInsertRequestParam"></part>  // no type attribute here.
 
</message>
      
      
<binding name="ItemWsPortBinding" type="tns:ItemWs">
         
<soap:binding style="document"

message里只包含一个part,也不再使用type熟悉申明。据说这样的差别决定了可以用xsd对文档进行校验(我没完全明白)。


虽然实际上rpc和document差别不大,但是理论上存在2个重大差异
1. document风格不直接和方法绑定,所以方法变化时,比如增加一个属性时,不一定会影响客户端代码。
2. document风格能提供对文档的校验模式。

但实际上, webservice中的 document风格绑定,其实还是rpc的。从这可以看出big web service是多么的无聊。

实际应用中,这2种风格的差别会引起很多问题, 一些传统的老旧应用基本是rpc风格的,而某些应用和webservice实现则只提供document的支持。这会部分导致兼容性问题,虽然理论上,新的总是兼容旧的,但实际问题多多。

顺便说一个实际工作中碰到的问题,在使用domino7将服务发布成document风格的web service时,我们有时候(牛就牛在这有时候)会出现服务调用乱窜的问题, 客户端提交的服务调用会乱窜到同参数的其他服务中,充分体现了document风格不以方法名绑定的实质,nnd。

另外,是否正是因为soap这种先天性的rpc架构缺陷,导致了必然的兼容性和复杂性问题?

为什么要使用rest架构

对此问题我其实长期以来一直存在一个本质的误解。 我之所以喜欢用restful 的web service,其实更直接的原因是我实在讨厌soap的big web service。 使用rest我至少得到了2个好处。
1. 开发效率和执行效率的显著提高
2. 回避了兼容性问题,特别是异构系统间。

好吧,但是象ror那样,把所有内容都发布成了CRUD的操作的rest,我还是一直比较反感的,实在看不出其中的好处。我一直觉得,远程服务应该是比较大粒度的东西,不应该将所有的资源都服务化。 而旺财同学曾经给我看过infoq上一篇文章,关于rest的那10个问题,看完以后我还是继续迷糊,好像一个问题都没有解释清楚。

不过今天突然明白了。rest的意义在于通过将数据操作的资源化,给客户端的使用提供了足够的灵活性,这是传统结构难以比拟的。这其实是一个视角变换的问题。

静态网页比动态的bbs更容易被检索使用也是由于这种信息的资源化,资源化的结果是给客户端的玩法提供近乎无限的可能性。rest其实是一种以客户端使用为主要核心的结构。


其实想想自己平时在应用开发中对数据的操作也能对应起来。一般来说做一个业务系统开发,对数据我会干2件事。

1. 使用技巧实现一个万能dao,或者通过模板工具,将所有数据表映射到对象并创建对应的CRUD操作甚至关联操作。

这样做的目的并不在于系统中所有的表都需要做crud操作,而是试图把对数据库的操作释放为标准的对象操作,屏蔽掉数据库操作,提高程序员操作的灵活性。

2. 对应非CRUD的操作, 则重新编写专门的代码实现。

而对应的 REST 的 过程

1. 将数据的CRUD操作资源化发布。

   可以考虑c/s结构的开发, 如果未有此种资源化会增加客户端和服务器多少工作量?

2. 对于复杂的操作需求,编写专门服务实现。
   这个操作有可能是rpc风格的。
   

这2种做法基本一致, 都是按2,8 原则对粗粒度和细粒度进行组合。 而我之前的迷糊,其实来源于以往分布式对象架构经验的困扰,EJB/RMI方面的苦难经历已经给我们洗脑,分布式结构,细粒度总是不好的,灵活总是难以控制的,所以我们习惯于限制客户端的可操作性。

REST的架构, 某种意义应该理解为客户端应用导向的架构,关心的是能给予客户端更多的灵活性而不是更多的限制。

服务和客户的对应关系,总是1对n的关系。 从这个角度看,rest是天生更适合SOA的, 比SOAP 要合适的多。

但是如何有效又简洁而且便宜的解决安全问题? 这个还需要继续研究。

分享到:
评论
1 楼 BruceXX 2011-07-27  
不错,一直不了解webservice这几种风格。。。

相关推荐

    REST与RPC的区别.pdf

    ### REST与RPC的区别详解 #### 一、概述 在现代软件开发中,特别是分布式系统设计领域,REST(Representational State Transfer)与RPC(Remote Procedure Call)是两种非常重要的服务调用方式。这两种方法各有...

    rest-rpc 简单易用的rpc框架 C++11

    `rest_rpc`是一个基于C++11开发的轻量级RPC(Remote Procedure Call)框架,它将RESTful API的设计理念与RPC技术相结合,为开发者提供了一种简单且高效的远程调用解决方案。本文将深入探讨`rest_rpc`的核心特性、...

    rest_rpc:现代C ++(C ++ 11),简单易用的rpc框架

    rest_rpc c++11, high performance, cross platform, easy to use rpc framework. It's so easy to love RPC. Modern C++开发的RPC库就是这么简单好用! rest_rpc简介 rest_rpc是一个高性能、易用、跨平台、header ...

    dubbo rest rpc相关jar包

    在标题和描述中提到的“dubbo rest rpc相关jar包”是指Dubbo支持RESTful API调用的扩展模块,这使得Dubbo能够与更广泛的Web服务和微服务生态系统集成。 首先,我们来详细了解一下`dubbo-2.8.4.jar`。这是Dubbo的...

    smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具

    smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中

    armeria,异步RPC/REST库构建在Java 8、NETY、HTTP/2、节俭和GRPC之上.zip

    Armeria是一个强大的开源项目,专门设计用于构建高性能、异步的RPC(远程过程调用)和REST(Representational State Transfer)服务。它基于Java 8、Netty、HTTP/2和gRPC技术栈,提供了现代化的网络应用开发框架。...

    dubbo-rpc-rest-2.8.4.jar

    java运行依赖jar包

    REST API.md

    REST与CORBA、SNMP、SOAP比较 腾讯开放平台REST API 示例 通过URL来设计系统结构,抽象的是资源,而不是对象、过程,完成的是用户接口 REST API的开发框架介绍:JSR-311,REST Web Services框架 JAX-RS,java接口;...

    dubbo提供 rest 服务接口

    Dubbo 是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架,它极大地简化了分布式服务开发的流程,使得服务提供者和服务消费者之间的通信变得简单。在现代微服务架构中,REST(Representational State Transfer)...

    php rpc远程过程调用

    - **异构系统集成**:PHP RPC可以用于连接不同编程语言的系统,如PHP与Python、Java等。 **文件内容** - **AUTHORS**:列出项目的主要作者和贡献者,提供了关于开发者的相关信息。 - **INSTALL**:包含了安装和...

    白话REST-识别真假REST

    在理解REST时,应避免将其与RPC(Remote Procedure Call)简单等同,因为REST不仅仅是一系列HTTP方法的简单应用。 REST的核心理念在于资源的抽象、统一的接口以及状态的无状态传输。其中,“资源”指的是通过网络可...

    java rest api入门实例

    目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找...

    rpc-client

    1. **微服务架构**:微服务架构的核心思想是将单一应用程序分解为一组小型服务,每个服务都在其自身的进程中运行,服务之间通过轻量级的方式(如 HTTP/REST 或者 RPC)进行通信。这种解耦的设计提高了系统的可扩展性...

    使用 XML-RPC 为 C++ 应用程序启用 Web 服务

    Web 服务协议如 SOAP、REST 和 XML-RPC 提供了将这些遗留应用程序与网络集成的途径。本文主要关注 XML-RPC,这是一种简单且轻量级的消息传递协议,支持基于 XML 的跨平台通信,特别适合 C++ 应用程序。 **为什么要...

    REST与面向资源的Web开发

    ### REST与面向资源的Web开发 #### REST简介 REST(Representational State Transfer)代表了一种分布式超媒体软件架构风格,最初由Roy Thomas Fielding在他的2000年博士论文中提出。REST并不是一种具体的标准或者...

    json-rpc2rest:Json-Rpc 到 Rest 机架中间件

    gem install json-rpc2rest 或将以下行添加到 Gemfile: gem 'json-rpc2rest' 并从您的 shell 运行bundle install 。 之后添加行到config/application.rb config . middleware . use 'Json-Rpc2Rest' 您也...

    RPC:通过TCPDDSREST进行RPC

    REST上的eProsima RPC通过RESTful范式提供RPC通信。建造该存储库提供脚本来构建和安装RPC库。 同样在您可以找到使用自动工具Linux软件包和Windows的二进制文件。 以下小节解释了如何使用 CMake 为每个 RPC 库进行树...

Global site tag (gtag.js) - Google Analytics