REST – 善,恶,丑

2009 年 5 月 26 日

在他一篇新博文中,Arnon Rotem-Gal-Oz 表达了他关于 REST 的意见 (来自 Arnon 的关于 REST 更一进步的讨论可参见这里)

根据 Arnon 的说法,使用的 REST 最主要的三大优势是:

  • 相对容易的集成: > …一个好的 RESTful API 从前面最初的 URI 就可以发现。这并不意味着任何一个调用你的服务的应用都能神奇地知道该做什么。而是意味着读取你的 API 以试图集成它的开发者能过得很轻松。特别是有了多媒体为你提供下一步要做什么的路线图。
  • 使用普适的标准 -HTTP 是最普遍的 REST 实现: > 说到 HTTP 这一 web 协议,发出 JSON 或者 ATOMPub 意味着找到一个在任何语言任何平台都能连接到你的库变得非常容易了。
  • 伸缩性: > …无状态的通讯,复制存储带来了良好的伸缩性潜质。

Arnon 同时讨论了一些 REST 的劣势。在他看来,REST 的两大主要劣势是:

  • “低端 REST”(仅仅使用 GET 和 POST) 实现,又特指 REST over HTTP: > 虽然从技术上来说它应当是 RESTful,但对于我而言二个动词的统一接口也未免太小了以致于起不到什么真正的作用 (事实上导致了不少非 RESTful 的实现)
  • 现今编程语言的局限: > …编程语言并非是面向资源的,所以映射 URI 的处理代码可能会变得一团乱麻。另一方面,相对而言很难使得 REST API 是超文本驱动的 (这也是 REST 的一个限制)

最后,Arnon 指出了 REST 一些糟糕的例子,这大部分是由于对 REST 的滥用而造成的:

  • 狂热的追随者 (Arnon 所用的措辞 - 再次证明 REST 的争论经常会上升成信仰) > 这并非仅只针对 REST,任何好的技术 / 思想 (Agile,TDD 等等) 都会有一部分追随者认为它 [加入最喜爱的相法] 是有史以来最好的东西,任何人都应该像他们一样去做或者差不多。
  • 对于 REST 的误解: > …构建一个 GETsful 的实现 (比如,用 http GET 去完成所有的事情) 或者使用原始的 RPC,URI 即是命令,使用 HTTP 动词进行 CRUD 操作,等等。

Arnon 以这样陈述总结了他的文章:

REST 看似容易实则不然 - 它要求转换思路 (比如,认定资源,外部化状态转移等等。)…做得好的可以成为你工具集当中重要而有用的工具之一,[否则]…就像任何架构 / 技术一样 - 一个拙劣的实现可以抵消掉所有的益处

关于 WS* vs. REST 的 SOA 争论看似无穷无尽。实际上任中一个都不是“万金油”(要小心"大锤" 综合症)。

…当你全盘的考虑整个业务的时候你必然会发现某些地方不一样的架构原则非常合适。架构风格 (以及架构模式) 是你用于解决挑战的工具。有些地方使用锤子非常合适,但保证你的工具集中不仅仅只有一把锤子也是非常明智的。

例如:大多数 REST 实现不支持异步调用和事件。因此,事件驱动架构风格对于 REST 来说可能就是不合适的。另一个例子,SOAP 信封提供的业务与基础设施影响相分离现在留给了 REST 的实现者来处理。所以,要求对基础设施影响进行大量潜在变更的实现恐怕对于 REST 就不太合适了。

由于 Web 2.0 的进步,特别是 Mashup 和 AJAX,REST 最近获得了更多的拥护。这些情况下,REST 通常是使用 Javascript 来访问并使用 JSON 作为编配机制。基于此,许多 REST 的支持者声称 REST 比起大量的 WS* 标准而言更易于消费。诚然,如果你“手工”实现消费者的话,确实如此。换个角度来看,许多编程语言里都有由 WSDL 产生服务消费者的工具,使得这一工作微不足道了。

REST vs.[某某某] 的清单永远也列不完,而且完全取决于这一清单的作者。Arnon 在他的文章里为实施方案选择合适的架构提供了一个很好的借鉴。

查看英文原文: REST – The Good, the Bad and the Ugly

2009 年 5 月 26 日 09:312094
用户头像

发布了 133 篇内容, 共 26.2 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

架构建模总结

任鉴非

人工智能之机械基

码农神说

人工智能 程序员 加班

架构师 week 1 作业一

iLeGeND

【架构思维-学习总结】week01

chun1123

学习 架构 思维方式

UML作业

王志祥

极客大学架构师训练营

食堂就餐卡系统设计

慢慢来的比较快

食堂就餐卡系统设计

Thrine

作业一:食堂就餐卡系统设计

晨光

架构师如何做架构-开篇

铁血杰克

架构师训练营Week1总结

sunnywhy

UML用例图组件图部署图

熊威

架构作业-UML图

铁血杰克

食堂就餐卡系统设计(第一周作业)

Geek_237932

【架构思维学习】week01

chun1123

软件架构 UML

【架构】— 一个简单系统的UML模型

不二架构

极客大学架构师训练营 UML 架构总结

学习总结--Week1

吴炳华

极客大学架构师训练营

架构师成长心得

熊威

GitHub 热榜:轻量级无 Agent 的自动化运维平台!

JackTian

GitHub spug 运维自动化 开源项目 监控管理平台

第一章作业

李白

第一章作业-学习总结

李白

架构师训练营 第一周 命题作业

RZC

作业一:食堂就餐卡系统设计

carol

食堂就餐卡 最用心

一篇文章快速搞懂 Atomic(原子整数/原子引用/原子数组/LongAdder)

学习Java的小姐姐

Java 并发编程 并发 synchronized Atomic

Week1命题作业

星河寒水

部署图 时序图 组件图 用例图

食堂就餐卡系统设计

Young

week1学习总结

慢慢来的比较快

食堂就餐卡系统设计

Linkin

孤狼王兴 | 互联网大佬往事

刘燕

AI 企业管理 美团

架构师训练营 第一周 学习总结

RZC

【架构师训练营】1 - 食堂就餐卡系统设计

悬浮

架构 UML 部署图

第一周学习总结

Young

REST – 善,恶,丑-InfoQ