`

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

 
阅读更多

对于运行在网络上的MIS系统而言,处理数据的是整个系统的主要任务,翻开程序我们可以看到,80%以上的代码都在处理数据的CRUD操作。采用一种什么样的框架结构,能够使得处理数据的操作变得简单且易理解,这是大部分开发者尤其是架构设计者一直以来思考的一个问题。

      REST(Representational State Transfer)是一种编程风格,特别是针对网络应用的设计和开发,采用REST可以显著降低开发的复杂性,提高系统的可伸缩性。

      REST是一种独特的编程风格,与MVC强调的角色分层概念不同,REST强调使用统一的规则来规范对资源的操作,两者互为补充,相符相成,使用MVC架构搭配REST编程风格构建基于网络的MIS系统将在不远的为未成为主流。本文着重介绍REST编程风格的核心规则,并且结合Spring MVC描述REST在实际应用中的代码形态。

 

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

语言生态环境

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

当系统可以在单一的生态环境中自给自足时,跨越生态环境的问题并不存在;但在多数互联网应用中,系统的各个部分通常既是生产者又是消费者,必须要打破生态环境的界限才能相互协作。比如,A公司的Service A,需要对外提供服务,而Service A又依赖于B公司的Service BC公司的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次选择题,每次可选AB两种答案,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的核心还是资源。 

分享到:
评论

相关推荐

    REST构架风格.doc

    REST构架风格

    REST构架风格

    REST构架风格

    基于 REST 的 Web 服务:基础

    基于 REST 的 Web 服务:基础部分

    REST-建筑风格:有关REST体系结构风格的文章

    REST-建筑风格:有关REST体系结构风格的文章

    Ajax和REST之1:Ajax REST架构风格对于融入式Web

    新兴的Ajax Web客户机架构风格让融入式Web应用程序与REST架构风格协调一致。使它们可以尽享REST那些出色的特性,同时又消除了应用程序违背REST准则时带来的不良特性。本文讨论了对于那些需要动态和个性化的用户界面...

    REST API.md

    REST是设计分布式网络服务或API时遵循的架构原则以及设计风格, 前后端分离最佳实践的开发标准或规范。本文为资料收藏的.md笔记,选取比较重要的资料,收集了以下内容: 重要概念介绍,如前述的第2-第4个关键词。 ...

    REST式架构及实践

    REST(Representational State Transfer):表述性状态转移,分布式超媒体软件的一种架构风格。源自2000年Roy Thomas Fielding的博士论文。 一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。 ...

    Rails上的API:使用Rails构建REST APIAPIs on Rails: Building REST APIs with Rails

    使用Rails构建可伸缩和可维护API的最佳方法

    SpringMVC构建REST接口:第四篇 第一个REST风格的接口的源代码

    SpringMVC构建REST接口:第四篇 第一个REST风格的接口的源代码

    用WCFWebAPI在MVC3.0下实现REST

    REST翻译成中文就是:“表述性状态转移”:Representational State Transfer,是网络服务接口的一种风格,并不是一个标准。 REST常用的四种HTTP命令,GET、DELETE、PUT和POST。 GET:是获取资源,DELETE: 是删除...

    rest api development with nodejs 英文版

    REST API Development with Node.js: Manage and Understand the Full Capabilities of Successful REST Development Manage and understand the full capabilities of successful REST development. REST API ...

    REST in Practice: Hypermedia and Systems Architecture

    Does the REST architectural style really present a viable alternative for building distributed systems and enterprise-class applications? In this insightful book, three SOA experts provide a down-to-...

    rest风格+jdbctemplate的CRUD操作.rar

    使用SpringMVC+jdbctemplate实现REST风格的CRUD功能 完成功能:能够对用户进行CRUD操作,界面粗糙,只做演示 运行环境:eclipse2019.03+JDK8+Tomcat9.0.41+MySQL5.5 运用到的技术:spring+springMVC+jdbctemplate+...

    REST架构风格详解

    但是近年来移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为 Web,iOS和Android提供服务。 另外对于广大平台来说,比如Facebook platform,微博开放平台,微信公共平台等,它们不需要...

    rest风格webservice框架

    RESTLET介绍 Restlet项目为“建立REST概念与Java类之间的映射”提供了一个轻量级而全面的框架。它可用于实现任何种类的REST式系统,而不仅仅是REST式Web服务。...该程序已经实现了rest风格的API,二次开发非常方便!

    java rest api入门实例

    REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,...

    REST结构全面解析手册

    REST(Representational State Transfer):表述性状态转移,分布式超媒体软件的一种架构风格。源自2000年Roy Thomas Fielding的博士论文。 一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。 ...

    设计 REST 风格的 MVC 框架

    设计 REST 风格的 MVC 框架

    REST_cn 中文版

    然后我介绍了表述性状态转移(Representational State Transfer,REST)的架构风格,并且描述了如何使用REST来指导现代Web架构的设计和开发。 REST强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来...

    REST与面向资源的Web开发

    REST(Representational State Transfer):表述性状态转移,分布式超媒体软件的一种架构风格。源自2000年Roy Thomas Fielding的博士论文。 一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。 ...

Global site tag (gtag.js) - Google Analytics