REST的SOA(SOA with REST)概念

发展

1992年网站(Web Sites)是在Web浏览器和Web服务器直接通过HTTP传输HTML。

2000年WS-* (Web Services)是在客户端和服务器之间基于HTTP传输SOAP XML格式的数据,服务端用WSDL来规定契约。

2007年RESTful (Web Services)是在客户端和服务器之间基于HTTP传输JSON、PO-XML、RSS格式的数据,服务端用WADL来规定契约。

Web services从哪来?

解决企业软件标准化的问题

企业计算的互用性标准

一个提供消息、描述、发现规范的分层架构

能够快速从底层构建提供解决方案

工具可以将复杂性屏蔽

处理异构(Heterogeneity)

Web应用(Web Applications)与 企业计算(Enterprise Computing)

庞然大物(Big Web Services)

  • 复杂难以理解(High perceived complexity)
  • 标准化存在问题
    • 斗争中(infighting)
    • 缺乏架构的一致性(architectural coherence)
    • 碎片化(fragmentation)
    • 设计委员会(committee)
    • 特性膨胀(feature bloat 主要提现在不断新增的文档)
    • 缺乏参考实现(reference implementations)
    • 标准的标准(Standardization of standards (WS-I))
  • 看似另一个CORBA?
  • Web services的互用性真的存在?
  • 我们真的需要采用XML来提升性能?

一个关于Web Services文档的不完全统计(http://www.tbray.org/ongoing/When/200x/2004/09/21/WS-Research)

Group Spec Page Count
安全Security    
  Web Services Security (O) 56
  UsernameToken Profile (O) 15
  X.509 Certificate Token Profile (O) 16
  Policy Language (M) 13
  Trust Language (M) 41
  Secure Conversation Language (M) 17
  Web Services Federation Language(M) 28
  WS-Federation: Active Requestor Profile (M) 14
  WS-Federation: Passive Requestor Profile (M) 13
  Kerberos Binding (M) 17
     
可靠消息Reliable Messaging    
  Reliable Messaging (M) 21
     
事务Transactions    
  Coordination (M) 16
  Atomic Transaction (M) 10
  Business Activity Framework (M) 13
     
元数据Metadata    
  WSDL 1.1 (W) 32
  Policy Framework (M) 15
  Policy Attachment (M) 10
  Policy Assertions Language (M) 9
  Dynamic Discovery (M) 22
  Metadata Exchange (M) 23
     
消息Messaging    
  SOAP 1.2 Primer (W) 39
  SOAP 1.2 Messaging Framework (W) 47
  SOAP 1.2 Adjuncts (W) 25
  Addressing (M) 15
  MTOM (W) 13
  Enumeration (M) 27
  Eventing (M) 21
  Transfer (M) 17
  SOAP-over-UDP (M) 7
管理Management    
  Web Services for Management (M) 23
业务流程Business Process    
  BPEL4WS (M) 74
配置文档pecification Profiles    
  Devices Profile (O) 24
  WS-I Basic Profile (O) 50
     
  TOTAL PAGES:

783

正文目录

什么是REST?

RESTful的设计

WS-*与REST的比较

讨论

前瞻

表述性状态转移(REpresentational State Transfer)

REST为Web定义了一个架构风格

它的四个原则可以用HTTP协议来实现

  1. URI资源识别(Resource Identification)
  2. 所有资源统一接口(Uniform Interface)
    • GET(状态查询、幂等性、缓存)
    • POST(创建子资源)
    • PUT(更新、状态转换)
    • DELETE(删除资源)
  3. 自解释(Self-Describing),消息的元数据和多种资源表述
  4. 超链接(Hyperlinks),定义应用的状态转换和资源之间的关系

一个RESTful Web Service的例子

统一接口原则(CRUD的例子)

创建(POST《-》)——创建一个子资源

读取(GET《-)——获取当前资源的状态

更新(PUT -》)—— 初始化或更新一个URI对应的资源状态

删除(DELETE)——清除一个资源(在一个URI失效之后)

统一资源标识符URI(Uniform Resource Indentifier)是什么?

  • 因特网对于资源命名和标识的标准

例如:

http://tools.ietf.org/html/rfc3986

http——统一资源标识符方案(URI Scheme)

://tools.ietf.org——授权(Authority)通常是一个主机名

/html/rfc3986——路径(Path)

https://www.google.ch/search?q=rest&start=10#1

?q=rest&start=10——查询(Query)

#1——片段(Fragment)

  • REST并不拥护“好”的URI
  • 在多数HTTP栈中URI的长度不能大于4Kb

什么是“好”的URI?

URI的设计指南

  • 名词(Nouns)优于动词(Verbs)
  • URI保持简短

    GET /book?isbn=24&action=delete

    DELETE /book/24

  • 遵从位置通过参数传递的方案

    REST URI对于客户端透明的意思是它是由后续的链接提供,而不是通过客户端自行创建

  • 不要改变URI
  • 真的需要改变时,用重定向实现(redirection)

    注意:URI模板引入了客户端和服务端的耦合

高级REST 和 低级REST

关于REST实现的最佳实践有些区别(在本人实际工作中,很多技术实力雄厚的大型企业,对于REST最佳实践的方案也基本可以归为以下两种,而第一种“低级”REST比较普遍)

低级REST(Low REST)

  • 用HTTP GET实现幂等请求,其他所有请求都用POST(没有HTTP PUT DELETE等其他方法)
  • 响应格式(MIME Type)多种多样(e.g. XHTML, application/json, application/xml)

高级REST(High REST)

  • 推荐使用好的URI
  • 充分使用4个动词:GET、POST、PUT和DELETE(*)
  • 响应体用(Plain Old) XML(**)

补充说明:

(*)有些防火墙或者HTTP的代理可能丢弃PUT/DELETE请求

(**)XML可以被RDF、JSON、YAML或者ATOM(ATOM存在很大的争议)替代

资源表述的格式XML vs. JSON

XML JSON(JavaScript Object Notation)
—PO-XML 为AJAX Web应用引入格式供(浏览器-Web服务器通讯)
—SOAP(WS-*)  
—RSS,ATOM  
半结构化的数据和标准的文本语法 文本语法支持序列化非循环的数据结构
工具:XML Schema,DOM,SAX,Xpath,XSLT,Xquery 有很多语言支持(不仅仅JavaScript)
每个人都可以解析它(不需要理解) 不需要扩展
慢、臃肿 JSON已经成为AJAX中的X而不是XML

一个JSON的例子

REST 的优与劣

优势(Strengths) 劣势(Weakness)
简单
—统一接口不可变更
混乱(区分high REST和low
REST)
HTTP/POX 无处不在 在前后台系统设计中存在不匹配的情况(异步消息和事件驱动)
无状态/同步交互 除了HTTP/SSL不能实现其他的企业应用的风格(*)
可扩展  
易于理解并采用(轻量级)
—只需要一个浏览器,不需要WS中间件
对于合适的识别和定位所有应用中的资源时一个挑战
朴素的方法(grassroot approach) 缺乏标准(本人认为REST是一个设计风格而非标准)
被所有的Web2.0应用采用
—85%的客户都喜欢Amazon的RESTful API
—Google不再支持SOAP/WSDL API
语法和语义的描述是非正式的(面向用户的)
(本人认为这也恰恰是一个优势)

(*) 关于企业的应用风格(-ilities)参照文章http://www.cnblogs.com/richaaaard/articles/5006681.html

是否不能实现我们还有待探讨

关于RESTful Web Services的设计方法

  1. 识别资源并暴露成服务(例如,年度风险报表,图书分类,采购订单,缺陷,调查投票等)
  2. 定义好的URL供寻址
  3. 理解GET、POST、PUT、DELETE对于一个URI资源的意义
  4. 设计并记录资源的表述
  5. 用超链接(hyperlinks)为资源关系建模
  6. Web服务器实现与部署
  7. 用浏览器进行测试(当然这里还有其他一些好的辅助测试工具,后面可以专门开文章探讨)

一个简单的Doodle API例子

  • 创建一个投票
  • 查询一个投票

  • 参加投票并创建一个新的子投票资源

  • 更新一个一有投票(访问控制头没有显示)

  • 当投票结果和决定产生后,投票可以将其删除

更多的信息可以查看Doodle API: http://doodle.com/xsd1/RESTfulDoodle.pdf

(当然在RESTful下也有很多其他的API实现)

REST设计的相关小贴士

  • 理解GET、POST、PUT

    • GET 是一个只读操作。它可以重复执行多次而不影响资源的状态(幂等性),也可以被缓存
    • POST是一个读写操作,可以改变资源的状态,也会读服务器产生影响
    • PUT 是一个写操作,但问题是如何正确的使用PUT?因为 PUT /resource/{id}可以被多个客户端并发调用,如何保证资源{id}的唯一性?
  • 多种表述形式的妥协(Content-Type)
    • 通常客户端可以提供自己可以处理的格式列表 Accept: text/html, application/xml, application/json
    • 服务端则自己选择最合适的响应格式200 OK Content-Type: application/json
    • 服务端通常通过资源表述不同的后缀形式提供不同的内容格式(只是一个best practice而不是标准)

      • GET /resource.html
      • GET /resource.xml
      • GET /resource.json
  • 异常处理(Idempotent vs. Unsafe)

    主要体现在HTTP的标准响应码上

  

对于GET、PUT、DELETE这些幂等操作,可以执行多次而不会对服务端的状态产生其他影响,可以在服务器宕机或者出现内部错误而恢复过后,重新发起这些请求。对于POST这种非幂等操作就需要在出现异常之后特殊处理,在有些场景下,它也可以被设计成幂等操作来实现:

B = GetBalance()  // safe
B = B + 200$ // local
SetBalance(B) // safe

总而言之,对比WS-*和REST

就是一个苹果和一个橘子的对比。一个是中间件互用性的标准,另一个是Web架构的风格。

那我们还是来比较一下SOAP和REST吧

  • 先举例
  • 概念比较
    • REST作为链接
  • 技术性比较
    • 服务的表述
    • 安全
    • 状态管理
    • 异步消息

举一个RESTful Web 应用的栗子

同样的场景下WS是这样的

REST和SOAP最主要的区别在于

  • 对于REST而言,Web是一个任何人都能访问的信息

    —应用需要把它的信息通过URI发布到网络

  • 对于WS而言,Web是任何传输的消息

    —应用可以与网络交互,但是他们处于网络之外

REST是一种链接方式

他们(REST vs. SOAP)是如何描述服务的呢?

REST SOAP
REST是基于人类可读的文档,它定义了请求的URI和响应(XML,JSON) 客户端的stubs可以通过WSDL的描述用大多数语言生成
(实际上SOAP也是一种XML,也是可读的)
需要大量的测试和调试,因为URI是手工创建的
(是否有相关工具)
每个服务都根据自己的语法发布自己的接口
我们为什么需要强类型的消息?
(如果客户端和服务端都很清楚传输的内容是什么)
强类型
WADL WSDL1.1(整个开放端口对于GET和POST是统一的)
XML
足够了?(实际上有JSON、XML等其他)
WSDL2.0(更灵活,每个方法的GET
or POST可选)

REST和SOAP安全对比

REST SOAP
REST的安全就是HTTPs SOAP的安全定义在WS-Security中
被证明的(SSL1.0 自1994) XML加密
  XML签名
  —彻底的互用性没有意义
  —性能?
点到点安全(认证、完整和加密) 端到端安全,不需要HTTPs

一直争论的状态还是无状态

REST SOAP
显性的状态转换 隐性的状态转换
—通信是无状态的 —服务端可以保持状态
—资源数据包含了有效的状态链接 —消息只包含数据
—客户端根据链接来获取并维护状态 —客户端根据服务端的状态机逻辑来维护自己的状态
   
Session技术 Session技术
—Cookies(HTTP Headers) —Session Headers(非标准)
—URL Re-writing  
—表格字段隐藏  

异步可靠的消息

  • 对于REST来说,HTTP是一个同步的协议,但是它也可以模拟异步消息
POST /queue

202 Accepted
Location:
/queue/message/1230213
____________________________
GET   /queue/message/1230213
DELETE
/queue/message/1230213
  • SOAP消息可以通过异步协议传输(比如,JMS、MQ等)

    • WS-Addressing可以用来定义独立的传输点
    • WS-ReliableExchange定义了一个可靠的传输协议(SOAP headers)  

REST 和SOAP/WS*的相似点

REST SOAP
XML O/XML 绑定
  其他的方式JSON、YAML、RDF
   
XML Schema 数据格式的契约需要和接口一起定义
   
HTTP 尽管REST认为SOAP误用了POST
   
松耦合可扩展 SOAP提供同步异步方式
  SOAP认为统一的接口不会改变

揭露所谓的秘密

  • 许多REST的拥趸认为REST和Web service是不相兼容的
  • 实施上:SOAP和WSDL的新版本已经将Web services设计得更“RESTful”
  • SOAP1.2
    • Response MEP
    • Web Method
  • WSDL2.0
    • HTTP绑定新增了操作级别(per-operation)对于GET、POST指定
    • 增加对于safe/cacheable的属性标签
  • 但是想让RESTful完全使用Web services还是很困难

(然而市面上有些产品实际上可以支持他们的相兼容)

总结和前瞻

  • SOA可以用不同方式实现
  • 关注架构如何解决问题以及这些相关标准的价值,而非具体架构和技术的盲从
  • SOAP/WS-* 与 REST都有自己的优势和适合的应用场景
  • 未来会有融合两种技术优势的中间件技术出现(新SOAP和WSDL标准)

参考:

SOA设计模式》 由Thomas Erl及其他供稿者合著,作为Thomas Erl关于面向服务计算丛书的一部分,于2009年1月由Prentice Hall出版,ISBN 0136135161,版权所有2009 SOA System Inc.。

Web Services and Service Oriented Architectures@2009 Cesare Pautasso

SOA之(5)——REST的SOA(SOA with REST)概念的更多相关文章

  1. 服务治理要先于SOA

      讲在前面的话: 若企业缺乏对服务变更的控制和规则,那么一个服务在经过几个项目之后,就很有可能被随意更改成多个版本,将来变成什么样更是无法预测.久而久之,降低了服务重用的可能性,提高了服务利用的成本 ...

  2. SOA相关资料整理分享

    昨@幸福框架同学问能否推荐SOA一些资,.想想之前看过不少资料文档,就整理分享下,有需要的可以参考下. 文章链接 理解面向服务的体系结构中企业服务总线场景和解决方案,第 1 部分 SOA 和 web ...

  3. IDDD 实现领域驱动设计-SOA、REST 和六边形架构

    上一篇:<IDDD 实现领域驱动设计-架构之经典分层> 阅读目录: SOA-面向服务架构 REST 与 RESTful 资源(Resources) 状态(State) 六边形架构 DDD ...

  4. 企业 SOA 设计(1)–ESB 设计

    最近为公司完成了一个 ESB 的设计.下面简要说明一下具体的设计方案.   企业 SOA 整体方案 在前一篇<SOA.ESB.NServiceBus.云计算 总结>中说到,SOA 是面向服 ...

  5. SOA、ESB、NServiceBus、云计算 总结

    SOA SOA 是通过功能组件化.服务化,来实现系统集成.解决信息孤岛,这是其主要目标.而更进一步则是实现更快响应业务的变化.更快推出新的应用系统.与此同时,SOA 还实现了整合资源,资源复用. SO ...

  6. 异构SOA系统架构之Asp.net实现(兼容dubbo)

    我们公司技术部门情况比较复杂,分到多个集团,每个集团又可能分为几个部门,每个部门又可能分为多个小组,组织架构比较复杂,开发人员比较多. 使用的编程语言也有点复杂,主流语言有.net(C#).Java. ...

  7. SOA架构设计经验分享—架构、职责、数据一致性

    阅读目录: 1.背景介绍 2.SOA的架构层次 2.1.应用服务(原子服务) 2.2.组合服务 2.3.业务服务(编排服务) 3.SOA化的重构 3.1.保留服务空间,为了将来服务的组合 4.运用DD ...

  8. 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  9. SOA架构设计(转发)

    阅读目录: 1.背景介绍 2.SOA的架构层次 2.1.应用服务(原子服务) 2.2.组合服务 2.3.业务服务(编排服务) 3.SOA化的重构 3.1.保留服务空间,为了将来服务的组合 4.运用DD ...

  10. 千万用户级别应用系统背后的SOA组件化容器

    背景 在<我们的应用系统是如何支撑千万级别用户的>随笔中已经从“宏观”角度去介绍了整个应用系统的布局.组件化是整个系统由头到尾都始终坚持的一个设计原则,其中“SOA组件化容器”也是我们应用 ...

随机推荐

  1. java android 访问DELPHI 的DATASNAP

    最新版的DELPHI开发DATASNAP非常简单便捷,DataSnap的REST风格和对JSON的支持,使之成为服务器端开发的神器. 一.DATASNAP服务器中的方法: TServerMethods ...

  2. 下一代NoSQL:最终一致性的末日

    相比关系型数据库,NoSQL解决方案提供了shared-nothing.容错和可扩展的分布式架构等特性,同时也放弃了关系型数据库的强数据一致性和隔离性,美其名曰:"最终一致性". ...

  3. Python学习教程(learning Python)--3.3.1 Python下的布尔表达式

    简单的说就是if要判断condition是真是假,Python和C语言一样非0即真,所以如果if的condition是布尔表达式我们可以用True或者非0数(不可是浮点数)表示真,用False或者0表 ...

  4. ruby cookbook

    11.2 listing object's method Oject.methods/singleton_methods/instance_methods 指定类名定义的方法在 singleton_m ...

  5. bat隐藏文件夹

    在windows中隐藏文件是可以隐藏,但是下面红色区域一旦选中,那也就显示出来了 现在有如下代码,可以实现个性化隐藏 ========================================= ...

  6. Android--监听ListView滚动到最底部

    监听ListView滚动到最底部使用 onScrollStateChanged(AbsListView view, int scrollState) 方法,代码大致如下: // 监听listview滚 ...

  7. 使用VMDepot镜像快速部署CKAN开放数据门户

    最新发布的CKAN VMDepot镜像针对中国用户强化了中文支持,提升了与MS Office办公软件的互操作性,并集成了常用插件和最佳实践配置参数. 使得CKAN原本十分复杂繁琐的部署流程变得非常简单 ...

  8. Socket与TcpClient的区别(转载)

    Socket和TcpClient有什么区别 原文:http://wxwinter.spaces.live.com/blog/cns!C36588978AFC344A!322.entry 回答: &qu ...

  9. [转]40多个关于人脸检测/识别的API、库和软件

    [转]40多个关于人脸检测/识别的API.库和软件 http://news.cnblogs.com/n/185616/ 英文原文:List of 40+ Face Detection / Recogn ...

  10. Windows平台下Python2.7中pip的安装方法

    本文允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 文件下载 需要下载并运行ez_se ...