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风格构架设计之体味,错误不足之处欢迎批评指正。

言语生态环境

计算机发展至今,产生了许许多多见仁见智的言语,每种语言都定义了协调独特之生态环境。在同生态环境内的次第共享相同之种系统、运行时环境、并发模型等。虽然持有程序的本来面目是均等之:从问题领域及机械领域的投射,但无能为力逃脱的凡差生态条件之顺序非常为难跨越彼此的境界。同样是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结构表达结果:

<sum>3</sum>

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的状态表述转移模型也指导,我们见面自然地查获这样设计:

图片 1

 

各国一个页面表示一个态(存在让客户端),页面包含了至下一个页面的超链接,每当用户选a或选b时分别转移到下一个应和的状态。这样,所有的对话状态其实都是经过url的形式保留于了客户端,服务器端实现了无状态。另外,需要征的凡,虽然上图有7只状态,但绝不必然要在服务器预先生化作7单静态页面,它们统统好是动态页面,这不影响状态转移的概念模型以及服务器无状态的性状。

有构架设计经验的意中人应好知,与出状态服务统筹相比,无状态服务好实现系统性能的横向伸缩性。通过多硬件,部署多单无状态服务,并展开load
balance不会受到制裁;而发生状态服务模式,Session的贮存、共享都见面带来性能瓶颈,且无法通过增加硬件消除。无状态服务器的私自是来状态的客户端,由于REST将有所状态且保留于客户端,所以在必然的安全隐患,这为时业界对REST的严重性担忧。因此,在决定是否以REST风格构架前许由运本身的性状出发,综合伸缩性、交互性、安全性等元素综合考虑。

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的中坚还是资源,下一致节约将会延续就这个话题开展探讨,谢谢关心!

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图