REST构架风格介绍:状态表述转移

本文总结了一些REST风格构架设计的经验,介绍了REST架构的语言生态环境,状态表述转移,无状态服务器等特点,并通过举例Google来说明REST风格的味道。

AD:

REST(Representational State Transfer)是HTTP协议的作者Roy Fielding博士在其博士论文中提出的一种互联网应用构架风格。与以远程对象为核心的ORB和以服务为核心的SOA相比,以资源为核心的REST让我们从崭新的视角审视互联网应用。REST为互联网应用量身定做的简洁模型、与HTTP协议的完美结合、构架的高扩展性,为互联网应用构架设计和异构系统集成设计带来了一股清新的空气。

语言生态环境

计算机发展至今,产生了许许多多不同的语言,每种语言都定义了自己独特的生态环境。在这个生态环境内的程序共享相同的类型系统、运行时环境、并发模型等。虽然所有程序的本质是相同的:从问题领域到机器领域的映射,但无法回避的是不同生态环境的程序很难跨越彼此的边界。同样是int,在A和B语言通常截然不同(CLR和JVM能部分解决类型共享问题),更不用说A语言具有但B语言不具有的某些语言特性(CLR和JVM没法解决)。

当系统可以在单一的生态环境中自给自足时,跨越生态环境的问题并不存在;但在多数互联网应用中,系统的各个部分通常既是生产者又是消费者,必须要打破生态环境的界限才能相互协作。比如,A公司的Service A,需要对外提供服务,而Service A又依赖于B公司的Service B和C公司的Service C;由于无法保证不同公司都采用同样的语言,因此各服务的接口必须保证语言无关性。在我所了解的范围内,有3种跨域生态环境的方式:

1.      ORB(Object Request Broker)

以CORBA为代表,其核心概念是远程对象(remote object)。熟悉.Net Remoting的朋友应该能体会其风格(需要说明的是.Net Remoting只跨越微软的生态环境)。不同生态环境的程序可以像调用本地对象一样调用远程对象代理的方法,ORB会负责连接到远程的对象,并处理数据的序列化与反序列化。

2.      SOA

其核心概念是服务(Service)。比如:我们要提供整数加法Web服务,我们会很自然地想到通过类似下面的url来表达服务接口:

http://www.example.com/add?a=1&b=2

并通过xml结构表达结果:

3.      REST

其核心概念是资源(Resource)。在REST的世界中,没有服务的概念,同样是上面的例子,在REST的世界中,http://www.example.com/add?a=1&b=2是一个xml网页资源的id,而非服务的接口。所以,REST让我们从资源的角度来审视互联网应用并指导我们的设计,这是它与ORB和SOA最本质的区别。下面我们将更详细的介绍,REST以资源为核心的模型和相应的设计风格。

状态表述转移

在REST的世界中,资源即状态,而互联网就是一个巨大的状态机:每个网页是其一个状态;url是状态的表述;REST风格的应用则是从一个状态迁移到下一个状态的状态转移过程。早期互联网只有静态页面的时候,通过超链接在静态网页间浏览跳转的page->link->page->link…模式就是一种典型的状态转移过程。

无状态服务器

REST风格应用可以实现交互,但它却天然地具有服务器无状态的特征。在状态迁移的过程中,服务器不需要记录任何Session,所有的状态都通过url的形式记录在了客户端。PS:更准确地说,这里的无状态服务器,是指服务器不保存会话状态(Session);而资源本身则是天然的状态,通常是需要被保存的;本文提到的无状态服务器均指无会话状态服务器。

举个例子:一个心理测试的应用,需要用户做2次选择题,每次可选A、B两种答案,2次选择完毕之后将告知用户属于何种心理类型。

如果按ORB或SOA的服务思维,很容易想到在服务器端保存Session,每次选择以后修改Session,根据Session产生结果。但如果以REST的状态表述转移模型为指导,我们会自然地得出这样设计:

每一个页面表示一个状态(存在于客户端),页面包含了到下一个页面的超链接,每当用户选a或选b时分别转移到下一个相应的状态。这样,所有的会话状态其实都是通过url的形式保存在了客户端,服务器端实现了无状态。另外,需要说明的是,虽然上图有7个状态,但并非一定需要在服务器预先生成7个静态页面,它们完全可以是动态页面,这不影响状态转移的概念模型以及服务器无状态的特征。

有构架设计经验的朋友应该很清楚,与有状态服务设计相比,无状态服务容易实现系统性能的横向扩展。通过增加硬件,部署多个无状态服务,并进行load balance不会受到制约;而有状态服务模式,Session的存储、共享都会带来性能瓶颈,且无法通过增加硬件消除。

Google搜索就是一个典型的无状态服务。试想一下,当你搜索“周杰伦”以后,Google提示你有数百万的结果,并每10条一页分成若干页,Google会把结果保存进服务器Session吗,然后当你翻页的时候,再从Session中取吗?显然这样庞大的Session,即使是Google也无法承受。来看看Google的url:

第一页:http://www.google.cn/search?q=%E5%91%A8%E6%9D%B0%E4%BC%A6&hl=zh-CN&newwindow=1&start=0&sa=N

第二页:http://www.google.cn/search?q=%E5%91%A8%E6%9D%B0%E4%BC%A6&hl=zh-CN&newwindow=1&start=10&sa=N

Google把搜索结果的每一页视为资源(状态),并通过url来表示,同一搜索关键字的不同分页通过start参数来进行区分。当你从第一页点击第二页的链接时,只是从一个状态跳到了下一个状态而已;对于Google而言,其实是一条新的查询(按REST的观点,获取新的资源),而两次查询很可能是由不同的服务器在处理,而用户却感觉Google似乎记住了会话。

从上面的例子中,我们初步体会到了一点REST风格的味道。但需要说明,REST风格包含了无状态服务器的特征;但反过来,并非具有无状态服务器特征的都是REST。SOA同样可以是无状态的,REST的核心还是资源。

时间: 2024-12-27 11:25:56

REST构架风格介绍:状态表述转移的相关文章

REST构架风格介绍之一:状态表述转移

转载自:Todd Wei   http://www.cnblogs.com/weidagang2046/archive/2009/05/08/1452322.html REST(Representational State Transfer)是HTTP协议的作者Roy Fielding博士在其博士论文中提出的一种互联网应用构架风格.与以远程对象为核心的ORB和以服务为核心的SOA相比,以资源为核心的REST让我们从崭新的视角审视互联网应用.REST为互联网应用量身定做的简洁模型.与HTTP协议的

REST构架风格介绍之二:CRUD

转载自:Todd  Wei    http://www.cnblogs.com/weidagang2046/archive/2009/05/09/1453065.html 上一节我们通过两个例子初步体会了REST状态表述转移的味道,但应该指出这两个例子还仅仅是简单的资源获取.REST是以资源为核心的,没有服务的概念,这的确让人怀疑REST能否像ORB或SOA一样支持复杂的应用?在回答这个问题之前,让我们先暂时离开REST,把眼光转向基于关系数据库的3层构架. 通常业务逻辑层对外提供若干的功能接口

人际沟通风格介绍一

沟通中解决编码和解码过程中的偏差,需要了解影响沟通的重要因素之---- 人际沟通风格.不同的人说同样的事会用不同的方式,原因是人们拥有不同的人际沟通风格.人际沟通风格可以简化为四种类型: 理想型.实践型(操纵型).表现型(亲和型).理性型(分析型). 四种风格有各自的表现特征.了解自己及他人在工作生活中的行事风格,有益于找出与他人和谐相处的方式. 可以通过进行简单的测试了解自己和他人的沟通风格.如:实践型沟通风格的人往往关注的是"这件事谁是老板,利益是什么,最核心的目标是什么",而理想

系统构架风格---数据抽象与面向对象风格

抽象数据类型概念对软件系统有着重要作用,目前软件界已普遍转向使用面向对象系统.这种风格建立在数据抽象和面向对象的基础上,数据的表示方法和它们的相应操作封装在一个抽象数据类型或对象中.这种风格的构件是对象,或者说是抽象数据类型的实例.对象是一种被称作管理者的构件,因为它负责保持资源的完整性.对象是通过函数和过程的调用来交互的. 图 数据抽象和面向对象风格的体系结构 面向对象的系统有许多的优点,并早已为人所知: (1)      因为对象对其它对象隐藏它的表示,所以可以改变一个对象的表示,而不影响其

Asp.Net构架(Http请求处理流程)、Asp.Net 构架(Http Handler 介绍)、Asp.Net 构架(HttpModule 介绍)

转载: HttpHaddler,HttpModule http://blog.csdn.net/jiuqiyuliang/article/details/18713451 http://www.cnblogs.com/Charles2008/archive/2009/02/17/1392101.html WCF rest http://blog.csdn.net/jiuqiyuliang/article/details/18713451 http://www.cnblogs.com/lanvig

JavaEE Spring

1.  Spring以一己之力撼动了Sun公司的JavaEE传统重量级框架(EJB),逐渐成为使用最多的JavaEE企业应用开发框架. 2.  Spring是分层的JavaEE应用一站式的轻量级开源框架,以控制反转(Ioc)和面向切面编程(Aspect Oriented Programming AOP)为内核,提供了表现层SpringMVC.持久层SpringJDBC以及业务层事务管理等众多的企业级应用技术. 3.  Spring的使命:简化Java开发.目标是实现一个易于开发.便于测试而又功能

iptables ip报文 tcp报文 tcp三次握手四次端口 有限状态机 状态转移

linux 网络防火墙 netfilter :是内核的一个frame :框架 iptables :数据报文过滤:nat mangle等规则生成工具 网络知识: IP报文首部   tcp报文首部 hdr len   报头首部长度  给出的字节需要乘以横向 32/8 = 4字节 Type of Service(服务类型)    服务类型 Total Length(总长度)          报文总长度    包括表头与内容 (Data) 部分.最大可达 65535 bytes.   注: 报文总长度

《概率统计》状态转移:初识马尔科夫链

回顾两类重要的随机过程 在上一篇随机过程的概述中,我们提到过两类非常非常典型且重要的随机过程,一类是:伯努利过程和泊松过程,这一类随机过程是无记忆性的,也就是说未来的状态不依赖于过去的状态--新的"成功"或"到达"不依赖于该过程过去的历史情况. 而另一类则正好相反,未来的情况会依赖于过去的情况,并且能够在某种程度上通过过去发生的情况去预测未来,例如这一篇我们的核心内容--马尔科夫过程,它在许许多多的领域都有深入和广泛的应用. 离散时间的马尔科夫链 马尔科夫链三要素

SaaS系列介绍之十四: SaaS软件开发分析

1 引言 真正的问题,不是电脑是否具备思考能力,而是人类是否具备这种能力                     ________B.F.Skinner<计算机科学> SaaS模式不同于传统软件不仅仅体现在运营的服务上,同时在软件开发的方式和技术上也有很大的不同. 如何开发SaaS软件,开发SaaS软件将用到哪些技术这都是我们要研究的主要内容. 2 实现SaaS软件的关键技术 l SOA技术 SOA与SaaS被被称作挛生姐妹确实并不为过,SOA与SaaS是现代软件服务领域的二架马车,它们奔蹄狂