an introduction article about Rest Web service

By bresiva

转:REST 的口水正在泄洪-劳虎’s Blog -欢迎来到BEA dev2dev在线

最近几个月,互联网上 REST vs. SOAP 的口角甚嚣尘上,实在看不下去了。就连在 SOA 和 Web services 界的重量级人物 — Burton Group 的分析总监 Anne Thomas Manes (ATM),也开始加入炒作 REST 的行列

自 J2EE 草创期以来,我对 ATM 一直非常推崇,但这篇报导着实让我有些惊讶!或许其中难免有几分媒体的加油添醋,但大胆宣称“SOA 的未来在 REST”,实在是太过火了。很仔细地看完相关的几篇报导,仍感觉里面有几分炒作!犹记得大约在两年前,通过一个 podcast,听过一场 ATM 关于 SOA 的讲演。在 Q&A 过程中,有人问到 REST,ATM 当时很坚定地表示,尽管 REST 更适合一些非常大访问量的场景,是 Google, Yahoo, Amazon 等互联网公司所必须,但在企业应用的领域,ATM 说,许多需求,例如安全、policy、事务处理… 等, 还是只有 SOAP 和 WS-* 做得来,REST 是不够的。但三个月前的这场宣告,加上几分渲染,让人感觉她似乎完全推翻了过去的立场。ATM 的其他同僚,当然不忘趁机一拥而上,大炒 REST 概念股,口气往往比 ATM 本人更加露骨许多(她还是比较中肯的;稍后再谈)- 有的 (Peter Lacey) 说目前的 Web services 标准远远不足,正妨害着 SOA 发展,只有从 REST 开发带来的约束力中,才能得到救赎。这位仁兄上周在谈数据服务(data services,美国今年 SOA 界的热门主题)时,更大言 REST 与数据服务是天作之和, 尽管基本上的确有几分道理,但同时似乎也有意无意地避谈或淡化可行性的问题,包括目前不管在数据服务相关工具、中间件等领域对 REST 的支持程度,更忽略了广大对面向对象已经根深蒂固的架构师和开发人员,需要多久的适应期,来对 REST 这种需要改采面向资源的新设计观念来进行“换脑”工程。简单地说,觉得他讲的不够务实。

到底什么是 REST?这个问题太好、太重要了!因为目前 REST 和 SOAP 的争论中,存在很多将 REST 扩大解释的现象。不少人其实连 REST 真正的精神还本质根本都还搞不清楚,就以 “RESTafarian”(网上对实行“REST 主义”者的特殊称号)自居,以为自己做的是 REST 应用,但很多其实不是(REST 的名气大多是被这帮人所炒起来)。REST 全名 “Representational State Transfer” 。它的名称由来、概念、理论基础,和原则,源于 Roy Fielding 2000 年的博士论文。简单地说,只要掌握几个关键原则,便可巧妙地运用 WWW 的先天机制,藉而设计出许多简单而且极为 scalable 的应用。这是一种“面向资源”的设计哲学,将应用所处理的对象用“资源”的观念来规划,应用只需利用 HTTP 内置的 GET, POST, DELETE, PUT 等,作为统一而简单的 “API”,对这些资源的表示形式和状态(REST 中的 “RES”)做修改和转变(REST 的 “T”),来达到维护和处理数据的目的。

关于对 REST 的快速入门,我推荐《SOA Using Java Web Services》这本书的第三章(试阅章节可由此免费下载), 这本书只用了第三章开始的短短两三页,便点出很多重点- 包括对 SOAP 和 RESTful 这两种 Web services 的 styles,做了一个务实的比较;此外并提到,许多被认为是 REST 的应用,包括 Amazon.com 发布的许多 Web services,还有一些使用 cookies 的 “REST” 应用,其实都违反 Fielding 所阐述的基本原则。另一本推荐的书 - O’Reilly 所出版的《RESTful Web Services》, 恰好可免费下载的章节,所谈的正是作者想提倡的正统 REST 设计理念。他们采用了 ROA - Resource-Oriented Architecture 来阐述这个理念,藉以和号称 RESTful,但只是以 REST 之形,行 RPC 之实的做法作区隔。为什么要这么强调 Fielding 所揭橥的基本原则?就拿无状态性来讲,如果违背这个原则的话,例如在服务器端维护 session 数据,那么 REST 在 scalability 上的优势就不复存在。尽管许多 REST 拥护者在宣扬 REST 时不忘强调这些 REST 的优势,但实际上不少他们开发出来的 “RESTful 应用” 不见得享有这些优势。前面提到 ATM,尽管我感觉她多少有利用自己过去累积的SOA光环,短线操作 SOA 和 REST 话题之嫌,但很高兴看到她在其他许多场合(例如这个 InfoQ 专访和这个 blog) 所表达的消息和看法,仍是十分正确而铿锵有力,她强调许多号称 RESTful 的应用,其实只是 POX (Plain Old XML) - POX 只不过指消息的 payload 采用单纯的 XML,而不经 SOAP 或 Atom 那样的信封包装。很多 POX 应用其实不是 RESTful,而 RESTful 应用则也不见得必须是 POX。有的人说 REST 很简单,就是 XML over HTTP,其实不是这么回事。如同 ATM 和上述 O’Reilly 《RESTful…》一书作者所强调的,REST 内含一个架构的精神,或许可称之为 ROA,而它的设计哲学,不见得是面向对象已深化心中的人能在短时间内完全领略。OO 和 RPC 的设计方式往往通过方法或函数调用来达成一件事,而在 SOA 之下,某个业务功能可通过服务操作 (operation) 来建模,落到技术层面,则可很轻易地对应成以一个方法或函数来实现。例订单查询,可以通过一个幕后是 Java 方法的 Web service 来接受用户请求,用户端,也就是服务消费者,将订单序号作为参数,放在请求里面。在这种设计模式之下,主角是及物动词,也就是对订单(受词)的查询动作; 但如果要改用面向资源的观念、也就是 REST 理念来设计的话,主角会是那千千万万笔的订单,也就是名词 -每笔订单都有一个独特、专有的 URI/URL 来识别,据以对它们进行各别的查、增、删、改。ATM 也举过一个例子,她说如果用 REST 来设计灯光控制的应用,那你的房子里面的每一个灯泡都必须有一个独特的 URI,然后对每盏灯发送开/关的控制信号;而不是通过一个统一的灯光总控来进行控制。看一个自然语言的例子,要表达类似的意念,我们可以说:“我不 (太)同意你的看法”,但也可以说“我和你的看法不同”,前者以动词为重心的表达方式,较为强烈而单刀直入,后者以名词为主题的表达方式,让人的感觉较为 婉转,REST 在设计上的体现,也有这种婉转的味道。

至于 SOA 的未来,是否将如 Burton Group 所预测,逐渐将向 REST 倾斜,而带来 SOAP 和 WS-* 的逐渐式微?我的看法:REST 的无限上岗,绝对不是 IT 大众之福。不可讳言,REST 的确在某些领域非常有价值,尤其是在边际 (edge) 端的应用,像AJAX、mashups 等一般被归类在 Web 2.0 领域的应用,往往和用户有比较强的互动。至于在服务器对服务器的领域,像服务之间的自动化调用,需要服务能自动探索、自我描述的能力,REST 本身并无这种机制(也许以后会有,这是另一个我想稍后另篇探讨的话题),另外像需要配合 policy 做比较复杂的安全,这些还是交给 SOAP 和 WS-* 比较合适。

对科技概念扩大解释或模糊解释是一种很可怕的现象。SOA 被过分炒作,变成凡事都符合 SOA,凡事都支持 SOA 的情形,犹历历在目。真的很不想看到 REST 又走上这条路。看得更愤世嫉俗点,我们甚至可以说,有心炒作新东西,对其扩大解释,甚至不惜混淆视听的,幕后一定别有用心。不是分析师想提高自我声望,沽 名钓誉,就是可以从支持新技术的产品或服务中获利。至于那些看不清楚事情的本质,便随着旁人在口水战中起哄帮腔者,恐怕只是成了被有心人利用的炮灰。

 

Leave a Reply