写点什么

REST 的缺点是什么?

  • 2013 年 6 月 05 日
  • 本文字数:1792 字

    阅读完需:约 6 分钟

几年前,Ganesh Prasad 问道, Internet 比 REST 更基本吗?这些年,他不断围绕 REST SOA、以及更时新的云计算提出相关讨论,并且钟情于REST 的指导原则。然而,最近有人在 LinkedIn REST 架构师讨论组中的一片帖子中问道,“REST 的缺点是什么?”Ganesh 对此做了回复,然后又在其个人博客中重申了自己的观点

我不能说 REST 有“缺点”。它说到的都做到了,而且做得很好。但是,请记住 REST 架构的实现唯一使用的协议是 HTTP。我们可以肯定地想象 REST 在另一种传输协议上的实现,而且其中还包含诸多方面的增强。

接着,他谈到了四个可能改进的方面。值得一提的是,Ganesh 和许多人一样,将 REST 等同于 REST/HTTP,即基于 HTTP 的 REST:

  1. HTTP 是一个同步的请求响应式协议。这意味着它不能天然地支持服务端发起的通知(点对点),但这又是经常需要的。这就解释了为什么 REST 风格的应用程序中的回调需要使用应用层的设计模式,如 Webhooks。现在,我们有了 WebSockets 这样的双向传输协议,也许工业界应该考虑在其之上根据 REST 原则设计一款新的应用协议。” 这一点非常有意思,因为就在差不多一年之前,我们看到有些人甚至在探讨 WebSockets 和 REST 是否能够兼容的问题。
  2. Ganesh 认为,REST 社区从 Web Service 协议栈中至少能够学到一些东西:“这些协议都是基于核心的 SOAP 和 WS-Addressing 消息机制能力之上的端到端的协议”。过去,也有人提到过类似的建议。Ganesh 接着做了一个类比,他说 Web Service 之于 WS-Addressing、WS-ReliableMessaging、WS-SecureConversation 和 WS-Policy 好比 Internet 之于 TCP、IP 和 IPSec 等。Ganesh 认为,REST 的应用幂等性可以更好地实现可靠性(尽管并没有提到如何更好),而且可以找到 REST 事务的替代方案,但是他仍然留下了一个问题:

剩下的问题是安全。WS-SecureConversation 和 WS-Security 是可路由的,它们不同于 SSL/TLS,而后者却是 REST 唯一的安全机制。有了 WS-Sec*,就可以对消息进行部分加密,留下一些明文用于基于内容的路由和分支切换。这是 REST 缺乏对应的优秀方案的地方。SSL 是点对点的,不受代理检测,并且违反了 REST 原则。REST 对此只能忍受。

这一说法也非常有意思,我们也看到了有的人提出了一些想法,如 Resteasy 的 Bill Burke ,他提议, REST 需要更好地实现安全的方法

Ganesh 继续谈到了 REST 对一般性 QoS 的问题:

REST 不能支持这些一般性 QoS 背后的原因是,它们都需要维护“会话状态”。有状态(statefulness)存在明显的缺陷(如,影响可伸缩性和错误恢复),但是随着 Redis 之类的宣称常数时间(即 O(1))和高性能的 NoSQL 存储的出现,就有可能将会话状态从内存中转移到这样的存储中,因而可支持在多个节点间共享会话,进而可以满足 QoS 的需要。

回到 Ganesh 谈到的另外两点:

  1. 他认为,HTTP 的动词太少,尤其对于需要做点对点交互的场景。他建议:“INCLUDE(将资源加入到某个资源集合中并返回服务端设定的 URI)、PLACE(使用客户端指定的 URI 向资源集合中添加资源)、REPLACE(全部替换)、FORCE(PLACE 或 REPLACE)、AMEND(部分更新,它是一个容器动词,为一个资源子集指定一个或多个动词)、MERGE(通过提供的表述合并部分资源)、RETIRE(比 DELETE 更好)和 SOLICIT(替换 GET,它也是一个容器动词,用于告知响应端对发起方的资源做些什么,因为现在是点对点的场景了)
  2. HTTP 合并了应用层和传输层的状态码(如,304 Not Modified[未修改] 和 400 Bad Request[无效请求];407 Proxy Authentication Required[需要代理认证] 和 502 Bad Gateway[无效网关])。 REST 在另一个协议上的实现应该更清晰地隔离应用层协议和传输层协议。HTTP 承担了双份工作,因此其结果也往往不尽完美。

参照一下 HTTP 2.0 的初始草案,就能发现它不可能完全采纳 Ganesh 的建议。然而,Ganesh 本人在过去 5 年里好像一直致力于提出一个新规约:

我正在编写一个称作 Internet Draft 的新应用协议,它可以绑定任何传输(发布 / 订阅、异步点对点或同步请求 / 响应)。该协议是被我称为 ROMA(面向资源 / 表述的消息传输架构)的新型分布式计算架构的一部分,它不仅包含数据模型和消息传输 API,还包含更高级的功能(QoS、描述和流程协作)

该规约发布之后,如何解决这些已知的问题?是否能够获得 REST 社区的积极响应?将是很有意思的看点。


查看英文原文: What Are The Drawbacks Of REST?

2013 年 6 月 05 日 01:5314088
用户头像

发布了 184 篇内容, 共 68.7 次阅读, 收获喜欢 5 次。

关注

评论

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

软件开发人员的软实力之一:精细度

boshi

职业 随笔

架构师训练营 1 期第 11 周:安全稳定 - 总结

piercebn

极客大学架构师训练营

冰河开源了全网首个完全开源的分布式全局有序序列号(分布式ID)框架!

冰河

分布式架构 雪花算法 分布式ID 全局序列号 全局唯一ID

极客时间架构 1 期:第 11 周 安全稳定 - 命题作业

Null

第二周学习总结

简简单单

Week7 性能优化学习总结

evildracula

学习 架构

一文彻底搞懂前端监控

执鸢者

大前端

架構師訓練營 week11 總結

ilake

架构词典:逻辑

lidaobing

架构 逻辑

架構師訓練營 week11 作業

ilake

第 7 周 系统架构作业

心在那片海

架构2期-第七周作业(1)

浮生一梦

极客大学架构师训练营 第七周 2组

极客时间架构 1 期:第 11 周 安全稳定 - 学习总结

Null

十一周总结

orchid9

架构师 01 期,第十一周课后作业

子文

架构师训练营第一期第十一周总结

Leo乐

极客大学架构师训练营

架构师训练营 2 期 - 第六周总结

Geek_no_one

极客大学架构师训练营

架构师训练营 3 期 第二周作业

ihiming

架构师训练营 2 期 - 第 7 周命题作业

Geek_no_one

极客大学架构师训练营

架构师训练营 2 期 - 第七周总结

Geek_no_one

极客大学架构师训练营

【第11周】安全稳定

云龙

架构师训练营1期 -- 第十一周作业

曾彪彪

极客大学架构师训练营

架构师训练营第一期第十一周作业

Leo乐

极客大学架构师训练营

软件设计的设计模式

简简单单

架构师训练营第七周作业一

韩儿

架构师训练营第十一周作业

月殇

极客大学架构师训练营

架构师训练营第十一周总结

月殇

极客大学架构师训练营

【第十一周】课后作业

云龙

安全稳定

wing

极客大学架构师训练营

nodejs事件和事件循环简介

程序那些事

事件驱动 nodejs 事件循环 异步编程 程序那些事

你真的理解什么是创新么?|技术人应知的创新思维模型 (1)

Alan

创新 思维模型 技术人应知的创新思维模型 28天写作

REST的缺点是什么?-InfoQ