当前位置: 代码迷 >> Web前端 >> Web设计之REST架构作派
  详细解决方案

Web设计之REST架构作派

热度:425   发布时间:2012-11-04 10:42:41.0
Web设计之REST架构风格
REST架构风格是全新的针对Web应用的开发风格,是当今世界最成功的互联网超媒体分布式系统架构,它使得人们真正理解了Http协议本来面貌。随着 REST架构成为主流技术,一种全新的互联网网络应用开发的思维方式开始流行。
! _) i5 P! T1 r2 I3 d% _( W! w7 m0 e
     REST是什么
1 `8 h% H5 D5 {# J$ d/ k3 Y1 `8 [( @) y$ f5 ~
     REST是英文Representational State Transfer的缩写,中文翻译为“表述性状态转移”,他是由Roy Thomas Fielding博士在他的论文 《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。REST本身只是为分布式超媒体系统设计的一种架构风格,而不是标准。 / H3 Z8 T; Y- H) a; J/ t1 }5 R

) R9 h" @( d# O; C3 }2 j     基于Web的架构,实际上就是各种规范的集合,这些规范共同组成了Web架构。比如Http协议,比如客户端服务器模式,这些都是规范。每当我们在原有规 范的基础上增加新的规范,就会形成新的架构。而REST正是这样一种架构,他结合了一系列的规范,而形成了一种新的基于Web的架构风格。
6 g% H. ]' z! l5 {6 m+ _) O! z  ?. K
0 s5 Z! y. m; M) |' D3 Z     传统的Web应用大都是B/S架构,它包括了如下一些规范 。
+ K( _& r! c& b( L$ T  u# U1 c: k! U
     客户-服务器
; L- O8 M! v! Q5 X8 ]2 f# u$ ~3 V- u9 g( \* o
这种规范的提出,改善了用户接口跨多个平台的可移植性,并且通过简化服务器组件,改善了系统的可伸缩性。最为关键的是通过分离用户接口和数据存储这两个关注点,使得不同用户终端享受相同数据成为了可能。
& x. O2 O: l+ R  k. L3 u" v     无状态性   j3 X. ], r5 J/ X+ P2 S. z  Z% K
; k4 q5 h* p. K( O' c" H
无 状态性是在客户-服务器约束的基础上添加的又一层规范。他要求通信必须在本质上是无状态的,即从客户到服务器的每个request都必须包含理解该 request所必须的所有信息。这个规范改善了系统的可见性(无状态性使得客户端和服务器端不必保存对方的详细信息,服务器只需要处理当前 request,而不必了解所有的request历史),可靠性(无状态性减少了服务器从局部错误中恢复的任务量),可伸缩性(无状态性使得服务器端可以 很容易的释放资源,因为服务器端不必在多个request中保存状态)。同时,这种规范的缺点也是显而易见得,由于不能将状态数据保存在服务器上的共享上 下文中,因此增加了在一系列request中发送重复数据的开销,严重的降低了效率。 ; q( S. y% o4 N8 S
     缓存 6 _' z1 u% s6 g5 M. _- ~
( @) y  j! l# Y1 z- a
为 了改善无状态性带来的网络的低效性,我们填加了缓存约束。缓存约束允许隐式或显式地标记一个response中的数据,这样就赋予了客户端缓存 response数据的功能,这样就可以为以后的request共用缓存的数据,部分或全部的消除一部分交互,增加了网络的效率。但是用于客户端缓存了信 息,也就同时增加了客户端与服务器数据不一致的可能,从而降低了可靠性。
  c% k9 F5 m3 M     B/S架构的优点是其部署非常方便,但在用户体验方面却不是很理想。为了改善这种情况,我们引入了REST。 ! {# D: I+ K$ S* ^

6 i% U  B) \1 ]( [4 L     REST在原有的架构上增加了三个新规范:统一接口,分层系统和按需代码。 6 A! H- E! W0 b1 L/ \' c
3 |- U% v. ]; R; B8 ]3 z
     统一接口 0 M+ k& a: @, M( m. }- }

3 ^7 U1 E3 k6 u! Y# [REST 架构风格的核心特征就是强调组件之间有一个统一的接口,这表现在REST世界里,网络上所有的事物都被抽象为资源,而REST就是通过通用的链接器接口对 资源进行操作。这样设计的好处是保证系统提供的服务都是解耦的,极大的简化了系统,从而改善了系统的交互性和可重用性。并且REST针对Web的常见情况 做了优化,使得REST接口被设计为可以高效的转移大粒度的超媒体数据,这也就导致了REST接口对其它的架构并不是最优的。 7 x$ X% F! a& ~0 W2 M
      分层系统
( ~  p: U" ^; x! v" K' D9 T) @7 P* q/ E/ P
分层系统规则的加入提高了各种层次之间的独立性,为整个系统的复杂性设置了边界,通过封装遗留的服务,使新的服务器免受遗留客户端的影响,这也就提高了系统的可伸缩性。 : ~9 k- L, \# T2 T0 d3 r
     按需代码 2 s8 _, A* c+ c' L! l$ {) k, e
7 ?9 `, w$ T: ^2 {' _
REST允许对客户端功能进行扩展。比如,通过下载并执行applet或脚本形式的代码,来扩展客户端功能。但这在改善系统可扩展性的同时,也降低了可见性。所以它只是REST的一个可选的约束。
4 A5 L9 W; y6 u$ }
5 J2 x) X2 A' q. z/ ~, x     REST的设计准则
" W: O. p7 }6 K3 _% b) P
& I1 A- {% I1 L% X2 I/ `      REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则: + p+ m) l' K$ x3 c+ n9 Z
! R0 E4 B" h4 H/ `& E4 x; h
网络上的所有事物都被抽象为资源(resource);
/ r1 [6 S& k1 D' [每个资源对应一个唯一的资源标识符(resource identifier);
( ?: q! x. |( s8 [) J% m3 R" P通过通用的连接器接口(generic connector interface)对资源进行操作; 4 K& a3 w) F- l/ O7 }
对资源的各种操作不会改变资源标识符; ' A- P* h) n8 h. n- Z
所有的操作都是无状态的(stateless)。 ' ~. h4 }2 T( r$ y7 w3 e
     REST中的资源所指的不是数据,而是数据和表现形式的组合,比如“最新访问的10位会员”和“最活跃的10为会员”在数据上可能有重叠或者完全相同,而 由于他们的表现形式不同,所以被归为不同的资源,这也就是为什么REST的全名是Representational State Transfer的原因。资源标识符就是URI(Uniform Resource Identifier),不管是图片,Word还是视频文件,甚至只是一种虚拟的服务,也不管你是xml格式,txt文件格式还是其它文件格式,全部通过 URI对资源进行唯一的标识。 1 ]8 S8 F8 }9 P+ m; l3 x5 t" n! Y$ `
, G* I0 M6 f) B8 v2 N
     REST是基于Http协议的,任何对资源的操作行为都是通过Http协议来实现。以往的Web开发大多数用的都是Http协议中的GET和 POST方 法,对其他方法很少使用,这实际上是因为对Http协议认识片面的理解造成的。Http不仅仅是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软 件的协议。他不仅仅能对互联网资源进行唯一定位,而且还能告诉我们如何对该资源进行操作。Http把对一个资源的操作限制在4个方法以内:GET, POST,PUT和DELETE,这正是对资源CRUD操作的实现。由于资源和URI是一一对应的,执行这些操作的时候URI是没有变化的,这和以往的 Web开发有很大的区别。正由于这一点,极大的简化了Web开发,也使得URI可以被设计成更为直观的反映资源的结构,这种URI的设计被称作 RESTful的URI。这位开发人员引入了一种新的思维方式:通过URL来设计系统结构。当然了,这种设计方式对一些特定情况也是不适用的,也就是说不 是所有的URI都可以RESTful的。 / ~  e6 V, ]3 U% @4 c1 f/ [# P
0 s# F, B# O5 l, n
      REST 之所以可以提高系统的可伸缩性,就是因为它要求所有的操作都是无状态的。由于没有了上下文(Context)的约束,做分布式和集群的时候就更为简单,也 可以让系统更为有效的利用缓冲池(Pool)。并且由于服务器端不需要记录客户端的一系列访问,也减少了服务器端的性能。 # d9 p1 v8 j, C* A7 I2 Q4 K+ d
4 o1 c! Y  ?+ h6 q$ r) N& T
     ( Z* j) o3 ^- h2 M: p2 B

$ m9 C1 b( Z, R" ~1 x! P' q6 b7 F# G    使用REST架构 . C, p* m1 l+ L( p& ^4 U

. q: D( S. o$ T. k- W# P, U- q     对于开发人员来 说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST不仅仅是一种崭新的架构,它带来的更是一种全新的Web开发过程中的思维方式: 通过URL来设计系统结构。在REST中,所有的URL都对应着资源,只要URL的设计是良好的,那么其呈现的系统结构也就是良好的。这点和TDD (Test Driven Development)很相似,他是通过测试用例来设计系统的接口,每一个测试用例都表示一系列用户的需求。开发人员不需要一开始就编写功能,而只需要 把需要实现的功能通过测试用例的形式表现出来即可。这个和REST中通过URL设计系统结构的方式类似,我们只需要根据需求设计出合理地URL,这些 URL不一定非要链接到指定的页面或者完成一些行为,只要它们能够直观的表现出系统的用户接口。根据这些URL,我们就可以方便的设计系统结构。从 REST架构的概念上来看,所有能够被抽象成资源的东西都可以被指定为一个URL,而开发人员所需要做的工作就是如何能把用户需求抽象为资源,以及如何抽 象的精确。因为对资源抽象的越为精确,对REST的应用来说就越好。这个和传统MVC开发模式中基于Action的思想差别就非常大。设计良好的URL, 不但对于开发人员来说可以更明确的认识系统结构,对使用者来说也方便记忆和识别资源,因为URL足够简单和有意义。按照以往的设计模式,很多URL后面都 是一堆参数,对于使用者来说也是很不方便的。
6 F% g4 Y- q: @2 [( o+ M9 `
" Q8 Q5 V/ e' T5 M" X, O. y     既然REST这 么好用,那么是不是所有的Web应用都能采取此种架构呢?答案是否定的。我们知道,直到现在为止,MVC(Model-View-Controller) 模式依然是Web开发最普遍的模式,绝大多数的公司和开发人员都采取此种架构来开发Web应用,并且其思维方式也停留于此。MVC模式由数据,视图和控制 器构成,通过事件(Event)触发Controller来改变Model和View。加上Webwork,Struts等开源框架的加入,MVC开发模 式已经相当成熟,其思想根本就是基于Action来驱动。从开发人员角度上来说,贸然接受一个新的架构会带来风险,其中的不确定因素太多。并且REST新 的思维方式是把所有用户需求抽象为资源,这在实际开发中是比较难做到的,因为并不是所有的用户需求都能被抽象为资源,这样也就是说不是整个系统的结构都能 通过REST的来表现。所以在开发中,我们需要根据以上2点来在REST和MVC中做出选择。我们认为比较好的办法是混用REST和MVC,因为这适合绝 大多数的Web应用开发,开发人员只需要对比较容易能够抽象为资源的用户需求采取REST的开发模式,而对其它需求采取MVC开发即可。这里需要提到的就 是ROR(Ruby on Rails)框架,这是一个基于Ruby语言的越来越流行的Web开发框架,它极大的提高了Web开发的速度。更为重要的是,ROR(从1.2版本起)框 架是第一个引入REST做为核心思想的Web开发框架,它提供了对REST最好的支持,也是当今最成功的应用REST的Web开发框架。实际上,ROR的 REST实现就是REST和MVC混用,开发人员采用ROR框架,可以更快更好的构建Web应用。 . ]5 u; Z1 \" r0 y1 F

, g. g# y" ?$ f/ D' O8 c! T
  J( _0 b, H# r% v, t    对开发人员来说,REST不仅仅在Web开发上贡献了自己的力量,同时也让我们学到了如何把软件工程原则系统地应用于对一个真实软件的设计和评估上。