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. Tyvj 9.10 总结 (其实只是发一下心情)

    原以为能拿200的,然而看到成绩彻底方了,60滚粗,连100都不到 这种成绩连一等都拿不到,我tm还谈什么省选,更别说NOI了 目前还没有部分分版本的,也没有数据,不知道问题出在哪里 tyvj群里好多 ...

  2. Linux系统编程@多线程与多进程GDB调试

    博客内容参考自 http://www.cnblogs.com/xuxm2007/archive/2011/04/01/2002162.html http://blog.csdn.net/pbymw8i ...

  3. [AHOI 2006][BZOJ 1269]文本编辑器editor

    好吧,我承认这是我用来刷随笔数的喵~ 这是一道 splay 裸题,但还是有想本傻 X 一样根本不会写 splay 的,于是乎又用 treap 水过了 splay 的常数我还是知道的,所以真是不知道那些 ...

  4. Java——函数

     ------- <a href="http://www.itheima.com" target="blank">android培训</a ...

  5. (6)java的内存泄露问题

    一:什么是内存泄露--->Java的一个最显著的优势是内存管理.你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收.然而,情况并不是这样简单,内存泄露还是经常会 ...

  6. How to Configure the Gradient Boosting Algorithm

    How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...

  7. apply通过实例理解

    测试->运行环境chrom console >var aaa = {a:1,b:2,c:function(){console.log(this.a)}} 运行结果:undefined &g ...

  8. __LINE__ __DATE__ __FILE__ __TIME__ 等宏定义解释

    Names the predefined ANSI C and Microsoft C++ implementation macros. The compiler recognizes predefi ...

  9. CentOS下添加新硬盘

    1.查看新硬盘     #fdisk –l      新添加的硬盘的编号为/dev/sdb 2.硬盘分区     1)进入fdisk模式 #/sbin/fdisk  /dev/sdb 2)输入n进行分 ...

  10. MSSQL中建立分区表(转载备忘)

    转载自CSDN地址:http://bbs.csdn.net/topics/330087045 SQL Server 2005 分区表实践——建立分区表(partition table) 问题:有一个订 ...