REST(Representational State Transfer) 曾经被误解为只是CRUD(增删改查),从这个层面上,好像REST只是和RPC一个层面的东西,没有什么了不起,其实这些都是对REST误读。

理解REST需要从系统集成整合以及架构的伸缩性方面入手,这方面有一篇很重要的REST博文: I finally get REST. Wow.
http://www.pluralsight.com/community/blogs/tewald/archive/2007/04/26/46984.aspx

作者认为:每个通讯协议都有一个状态机,当你使用RPC时,你要做些方法来改变通讯的状态,但是这些状态是封装在服务器端或客户端的专门通讯模块中,比如通过Hessian/SOAP等Proxy技术进行RPC调用,虽然可以在客户端很方便地象调用本地服务一样,缺点总是伴随优点到来,由于Proxy封装了客户端和服务器的通讯,就很容易让客户端和服务器紧耦合。

这其实是C/S架构的一个本质问题,而B/S架构通过简单的浏览器则解耦了客户端和服务器的耦合,别小看丑丑的浏览器,特别是当初还没有AJAX辅助时,浏览器被很多传统C/S讥笑和不屑,但是他们不知道B/S架构后面蕴含的深刻朴实的设计道理,是真正大道至简。所以,当我们重新回归RIA富客户端代表的C/S架构时,必须吸取Web架构的本质优点,这样才是螺旋式上升。

回归话题,由于传统架构隐藏了通讯模块进而发生了紧耦合,而REST最大作用则是将通讯状态以URI显式表现出来,也就是将通讯状态的透明性,这样做最大的好处就可以在通讯环节引入伸缩性

REST核心思想就是:以URI形式将状态机表现为动态的节点图,我们就能引入动态负载平衡dynamic load-balancing, 数据重导向data-directed-routing, versioning 等其他正常的Web底层设计架构Web infrastructure,从而使客户端和服务器之间服务器之间享受Web架构的好处。

谈到系统集成,SOAP/Web服务/SOA被厂商吹嘘了很多年,很多应用也在使用SOAP,SOAP和REST无疑是相互竞争的,SOA其实也是一种的RPC,是一种基于XML的RPC,因此,同样存在通讯状态隐藏的致命问题。

上述博客作者写了另外一篇文章来比较(http://www.pluralsight.com/community/blogs/tewald/archive/2007/04/27/47031.aspx)
比如,两个城市之间航班看成一个协议,这个协议有下面几个状态:
<ready>
- searched (查询)
- retrieved details (获得细节)
- reserved (预订)

通过URI表现出来是:
<none>
- http://quuxTravel.com/searched
- ??? depends on previous state
- ??? depends on previous state

客户端通过get方式http://quuxTravel.com/searched?src=London&dest=NYC进行查询,得到结果如下:
<itineraries>
<itinerary src=“London“ dest=“NYC“ price=“400.03“>
<getDetails uri=“http://quuxTravel.com/details?itinerary=402“ />
<reserve uri=“http://reservations.bookingsunlimited.com/quuxTravel?itinerary=402“ />
</itinerary>
<itinerary src=“London“ dest=“NYC“ price=“109.88“>
<getDetails uri=“http://quuxTravel.com/details?itinerary=219“ />
<reserve uri=“http://reservations.bookingsunlimited.com/quuxTravel?itinerary=219“ />
</itinerary>
</itineraries>
客户端目前处于“查询”状态,通过遍历上述itineraries旅游线路结果集合,寻找出最便宜的一家,如果用户想查询一个不在上述结果的信息比如飞行总体时间,他能通过上述结果属性getDetails/@uri中保存的URI信息再次GET获得,这样就会切换到 retrieved details状态。然后又会回到searched状态。

当用户选择一条路线后,通过保存在reserve属性中的URI值就进入 reserved状态,客户端得到一些reserved方面的信息,至此,整个业务算完成了。

如果使用RPC如何来完成呢?我们必须创建一个接口如下:
interface IFlightSystem
{
Itineraries Search(string src, string dest);
Details GetDetails(int itineraryId);
Confirmation Reserve(itineraryId);
}
客户端可以通过调用这个接口的几个方面来完成上述一些业务.

在这里,接口表达了和前面REST同样的协议,所不同的是, RPC客户端依赖服务器端这个接口,也就是两者通过接口耦合了,更致命的是:searched (查询) retrieved details (获得细节) reserved三个状态耦合到同一个服务器中,如果我们想将这三个状态分离分散到多台服务器上,除非重写服务器端代码,否则无能为力。

而在前面REST调用中,每个状态都是通过URI重新定位,这样,我们可以在这三个状态中引入伸缩性,比如searched状态的URI在A服务器,而retrieved details的URI则是B服务器的网址,而reserved的URI则是c服务器,看看我们的业务不再是铁板一块了。

这就是REST本质魅力,REST和RPC/SOAP本质区别是透明性。REST透明性可以让我们以更细粒度引入伸缩性,这样以REST为主要形式可以组建一个分布式的大型架构,而这个目的恰恰是重量解决方案SOA提出的目标,现在我们有了另外一个轻量的选择。

REST架构实质(转)的更多相关文章

  1. 集成架构:对比 Web API 与面向服务的架构和企业应用程序集成(转)

    http://kb.cnblogs.com/page/521644/ 摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不 ...

  2. (转)集成架构:对比 Web API 与面向服务的架构和企业应用程序集成

    摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不同,以及如何将它们融入到一个不断演变的集成架构中.文中还将讨论 API ...

  3. [Docker]Docker与Linux ip_forward数据包转发

    背景 今天在一台新虚拟机上需要临时启动一个consul服务,安装Docker后使用docker启动,但是在执行启动命令后发现docker有一个警告: WARNING: IPv4 forwarding ...

  4. Hibernate(1)——数据访问层的架构模式

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设 ...

  5. 【转】XenServer的架构之Xenopsd组件架构与运行机制

    一.Xenopsd概述 Xenopsd是XenServer的虚拟机管理器. Xenopsd负责:启动,停止,暂停,恢复,迁移虚拟机:热插拔虚拟磁盘(VBD):热插拔虚拟网卡(VIF):热插拔虚拟PCI ...

  6. 5G系统架构

    原文标题:迈向5G之路,颠覆性的5G系统架构?   本文部分图片,资料摘自<迈向5G C-RAN:需求.架构与挑战> 突如一夜春风来,随着Polar码与LDPC码作为5G编码候选方案,通信 ...

  7. [I2C]I2C架构分析

    转自:http://blog.csdn.net/wangpengqi/article/details/17711165 1. I2C 概述 I2C是philips提出的外设总线. I2C只有两条线,一 ...

  8. Spark Streaming源码解读之Driver中ReceiverTracker架构设计以具体实现彻底研究

    本期内容 : ReceiverTracker的架构设计 消息循环系统 ReceiverTracker具体实现 一. ReceiverTracker的架构设计 1. ReceiverTracker可以以 ...

  9. Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)

    Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔)  Louis Rosenfeld(路易斯·罗森菲尔德) ...

随机推荐

  1. [BZOJ 3622]已经没有什么好害怕的了

    世萌萌王都拿到了,已经没有什么好害怕的了——    (作死) 笑看哪里都有学姐,真是不知说什么好喵~ 话说此题是不是输 0 能骗不少分啊,不然若学姐赢了,那么有头的学姐还能叫学姐吗?  (作大死) 这 ...

  2. DuiLib——xml配置项

    DUILibxml配置项 根节点 子类 属性 类型 Window  |--------Image 图片信息 | o------name string | o------restype string | ...

  3. 论文笔记之:DeepCAMP: Deep Convolutional Action & Attribute Mid-Level Patterns

    DeepCAMP: Deep Convolutional Action & Attribute Mid-Level Patterns CVPR 2016 本文提出一种 分割图像 patch 的 ...

  4. Qt事件和信号的区别 .

    仔细来看,事件与信号其实并无多大差别,从我们对其需求上来说,都只要能注册事件或信号响应函数,在事件或信号产生时能够被通知到即可.但有一项区别在于,事件处理函数的返回值是有意义的,我们要根据这个返回值来 ...

  5. 对象的引用和clone

    $a=new s(); $b=$a; 这是引用,两者为同一个实例 $a=new s(); $b=$a; $b=clone $a; 这是clone,两者不是同一个实例,但拥有相同的属性 如果需要不相同的 ...

  6. 动态加载dll,并创建类对象放入到list中。

    private List<IVisualControlsPlug> visualPlugs = new List<IVisualControlsPlug>(); public ...

  7. C# 数组,ArrayList与List对象的区别

    在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...

  8. python--web.py使用

    web.py 是一个轻量级Python web框架. 下面我将使用web.py框架,创建一个简单的html页面示例. 1.项目的目录结构如下所示: exweb2\  uniqueenv\  app.p ...

  9. JavaScript常用表单验证正则表达式(身份证、电话号码、邮编、日期、IP等)

    身份证正则表达式 //身份证正则表达式(15位)isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;//身份证正则表达式 ...

  10. Android记录11-控制ExpandableListView展开和关闭

    Android记录11-控制ExpandableListView展开和关闭 2013年12月5日 工作记录 我们在使用ExpandableListView可能会遇到各种问题,比如说只展开一个组,关闭其 ...