REST的主要优势到底是什么?

本文探讨了REST架构的主要优势,即其作为一种对服务器的有效抽象方式,能够显著提高Web应用的交互效率和可伸缩性。相较于RPC和分布式对象架构,REST通过以名词为中心的建模方式,简化了开发流程并提升了性能。
在JavaEye论坛上回答网友joyjiang的疑问:“REST的优势到底是什么?开发效率?文档的管理?url的直观?还是其它的什么优势呢?”

REST的主要优势在我看来其实在于它是一种对于服务器的更加有效的抽象方式。

对于基于网络的应用来说,你怎么样看待服务器,就会产生什么样的架构风格,随之产生与该架构风格相关的交互模式。

RPC架构风格将服务器看作是由一些过程组成,客户端调用这些过程来执行特定的任务。SOAP就是RPC风格的一种架构。过程是动词性的(做某件事),因此RPC建模是以动词为中心的。

分布式对象架构风格认为服务器是由一些对象和对象上的方法组成,客户端通过调用这些对象上的方法来执行特定的任务。并且客户端调用这些对象上的方法应该就像是调用本地对象上的方法一样,这样开发就可以完全按照统一的面向对象方法来做。但是很可惜,这样的抽象并不是很有效,因为分布式对象与本地对象存在着巨大的本质差别,想要掩盖这些差别很多时候甚至是有害无益的。

REST架构风格并没有试图掩盖这些差别,而是将服务器抽象为一组离散资源的集合。资源是一个抽象的概念,而不是代表某个具体的东西。注意:要真正理解REST,就一定要增强自己的抽象思维能力,充分理解到资源是抽象的。如果完全不具有抽象思维的能力,一定要将资源与数据库中的一张表或服务器端的一个文件(HTML、Servlet、JSP、etc.)一一挂起钩来,就无法真正理解REST了。资源是名词性的,因此REST建模是以名词为中心的。

上述是目前基于网络的应用的主要的三种抽象方式。这三种不同的抽象方式会严重影响客户端与服务器的交互模式,而不同交互模式的交互效率差别相当大。分布式对象的交互模式很多时候效率很低,因为掩盖了分布式对象与本地对象的差别,很多时候都会导致细粒度的API(需要一再强调才能让一些不明就里的架构初哥按照正确的方式来做设计)。实践已经证明,与RPC和分布式对象相比,REST是一种对于服务器更加有效的抽象方式,将会带来粒度更大和更有效率的交互模式。这样的效果与Fielding设计REST的初衷是吻合的,REST就是专门为交互的性能和可伸缩性进行过优化的一种架构风格。而SOAP在设计的时候优先考虑的从来不是性能和可伸缩性,而是互操作性。除非出现奇迹,否则你种什么,就应该长出来什么。你种的是瓜,长出来的就是瓜;你种的是豆,长出来的就是豆。

Fielding写到:“ REST提供了一组架构约束,当作为一个整体来应用时,强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互延迟、增强安全性、封装遗留系统的中间组件。

有人认为REST不是面向对象的,其实REST虽然没有分布式对象那么面向对象,在我看来至少比RPC更加面向对象。按照《企业应用架构模式》,以动词为中心建模是什么?是不是就是事务脚本?以名词为中心建模是什么?是不是就是领域模型?这就扯远了,网络通信是否一定需要实现为面向对象的形式,我认为是不需要的。

“REST的主要优势在我看来其实在于它是一种对于服务器的更加有效的抽象方式。”
这句话等于是,我先把一个骨架放在这里,还没有用血肉来充实它,也就是还没有举出具体的实例来。具体的实例以后我们还需要来详细讨论。REST是非常简练的,同时又是一种非常强大的抽象方式,在我看来就是从根本上简化Web开发的一味良药。
### 优势 - **精确的数据获取**:GraphQL允许客户端精确指定需要的数据,避免了REST中常见的“过度获取”或“不足获取”问题。例如在REST中,一个请求可能返回包含大量不需要字段的数据,而GraphQL客户端可以只请求所需的字段,减少数据传输量和处理时间[^1]。 ```graphql { user(id: "123") { name email } } ``` - **减少请求次数**:在REST架构中,为了获取多个资源或关联数据,可能需要发起多个请求。而GraphQL可以通过一个请求获取多个相关资源的数据,提高了性能和效率。比如要获取用户及其发布的文章信息,REST可能需要分别请求用户信息和文章信息,而GraphQL一个请求就能搞定[^1]。 ```graphql { user(id: "123") { name posts { title content } } } ``` - **强类型系统**:GraphQL有一个强类型系统,这使得API的文档更加清晰和准确。开发者可以根据类型定义来理解API的结构和使用方式,同时也方便进行静态类型检查,提前发现代码中的错误[^1]。 - **版本管理更灵活**:REST API通常需要通过URL、请求参数或请求头来进行版本管理,这会导致API变得复杂。而GraphQL由于客户端精确指定所需数据,无需进行版本管理,当需要修改API时,只需在服务端进行相应调整,不会影响现有客户端的使用[^1]。 ### 劣势 - **学习曲线较陡**:GraphQL有自己的查询语言和类型系统,对于初学者来说,学习和理解这些概念需要花费一定的时间和精力。相比之下,REST的概念和使用方式更加直观和简单,更容易上手[^1]。 - **缓存困难**:REST架构可以利用HTTP的缓存机制(如ETag、Cache - Control等)对响应进行缓存,提高性能。而GraphQL的查询语句通常是动态的,很难直接利用HTTP缓存,需要开发者自己实现复杂的缓存策略[^1]。 - **服务端实现复杂**:实现一个GraphQL服务端需要处理查询解析、验证、执行等多个步骤,相比REST服务端的实现更加复杂。开发者需要编写更多的代码来处理GraphQL的查询逻辑,并且要处理好数据的获取和关联[^1]。 - **性能问题**:虽然GraphQL可以减少请求次数,但在某些情况下,由于需要处理复杂的查询逻辑和关联数据,可能会导致服务端性能下降。特别是在处理大量数据或复杂查询时,服务端的负载会增加[^1]。
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值