周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

09 | RESTful服务(上):从面向过程编程到面向资源编程

你好,我是周志明。前面两节课,我们学习了远程方法调用 RPC,今天我们接着学习另一种主流的远程服务访问风格:RESTful 服务。

REST 与 RPC 的对比

很多人都会拿 REST 来跟 RPC 对比优劣,其实,无论是思想上、概念上,还是使用范围上,REST 与 RPC 都不完全一样,它们在本质上并不是同一个类型的东西,充其量只算是有一些相似,在应用中会有一部分功能重合的地方。
REST 与 RPC 在思想上存在差异的核心,是抽象的目标不一样,也就是面向资源的编程思想与面向过程的编程思想之间的区别。
面向过程编程和面向对象编程,想必你应该都听说过,但什么是面向资源编程呢?这个问题等我一会儿介绍完 REST 的特征之后,再回头细说。
那么,二者在概念上的不同,是指 REST 并不是一种远程服务调用协议,甚至我们可以把定语也去掉,它就不是一种协议。
因为协议都带有一定的规范性和强制性,最起码也该有个规约文档,比如 JSON-RPC,它哪怕再简单,也要有个《JSON-RPC Specification》来规定协议的格式细节、异常、响应码等信息。但是 REST 并没有定义这些内容,虽然它有一些指导原则,但实际上并不受任何强制的约束。
经常会有人批评说,某个系统接口“设计得不够 RESTful”,其实这句话本身就有些争议。因为 REST 只能说是一种风格,而不是规范、协议,并且能完全达到 REST 所有指导原则的系统,也是很少见的。这个问题我们会在下一讲中详细讨论。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RESTful服务是一种面向资源的编程思想,与RPC有着根本的差异。REST并非一种远程服务调用协议,而是一种架构风格与网络的软件架构设计。其核心特征包括统一接口、超文本驱动和自描述消息。REST适用于移动端、桌面端或分布式服务端的节点之间通讯,但在追求传输效率和简化调用的场景中,REST的潜力有限。RESTful服务的概念和特点使其成为一种主流的远程服务访问风格,与RPC有着不同的思想和概念。REST的特征包括服务端与客户端分离、无状态、可缓存、分层系统、统一接口和按需代码。这些特征使得REST成为一种具有高抽象程度和通用性的编程思想,尽管在实际应用中仍存在一些挑战和争议。 在REST提出以前,人们设计分布式系统服务的唯一方案就只有RPC,RPC是将本地的方法调用思路迁移到远程方法调用上,开发者是围绕着“远程方法”去设计两个系统间的交互的,比如CORBA、RMI、DCOM,等等。而REST提出以资源为主体进行服务设计的风格,为它带来了不少好处。REST的重要标志是统一接口,它把对资源的标准操作都映射到了标准的HTTP方法上去,降低了服务接口的学习成本。此外,资源天然具有集合与层次结构,而REST绑定于HTTP协议,使得它能更好地匹配在HTTP基础上构建的互联网,在效率与扩展性方面也会有可观的收益。 总的来说,REST的面向资源的设计风格为服务设计带来了许多优势,但是否选用REST的API设计风格,需要权衡的是需求场景、团队的设计,以及开发人员是否能够适应面向资源的思想来设计软件、来编写代码。REST通常能够更好地匹配在HTTP基础上构建的互联网,在效率与扩展性方面也会有可观的收益。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(33)

  • 最新
  • 精选
  • lmdcx
    这是我见过对 REST 描述最透彻的文章(尽管老师的主要目的可能并非此意) 多说无益,我其实就想点个赞,可惜没有点赞按钮~

    作者回复: 感谢认可,谢谢你的赞。

    2020-12-07
    7
    105
  • 术子米德
    🤔☕️🤔☕️🤔 REST的Stateless,是指业务无状态,并不是资源无状态 对于资源的操作引起的资源状态切换,还是在服务端 只是基于资源的业务的状态,不由服务端保持和维护,就是所谓的Stateless REST风格的对资源操作,带来的最大益处就是业务的组合性极其方便,而且因为业务状态不在服务端,因此服务端在只需维护资源状态的情况下,非常容易实现横向扩展

    作者回复: 对的

    2020-12-07
    37
  • tt
    这节课的启发好大。 对于REST,之前的第一印象就是服务端无状态,有利于水平扩展,但更多的是停留于具体的技术层面。 过程如果有意义的话,一定会产生一个结果,这个结果就是资源的状态发生了转移(幂等前提下的重试不算),但是过程细节更多,所以抽象程度无法做到向面向资源看齐。 在一个过程中,可以对有关联关系的不同层次与结构的资源同时进行处理。但是面向资源却不容易做到。 我能想到的例子是转账操作,同时操作两个资源即账户,而且要保证事务的ACID。在转账的过程中要处理很多异常情况,尤其是涉及到多方交易的时候,所以写这样的交易就非常复杂,容易出错。 如果用面向资源的角度去考察,可以看成是对三个资源的操作:转出账户、转入账户以及事务。这里把事务列为单独的资源,是为了呼应上面提到的一个资源状态变化引起的关联资源的变化。 如果转账操作利用TCC(try-confirm-cancel)的方法,我觉得就是一种更偏向于面向资源的做法,每次只改变一个资源的状态。如果某个关联资源的状态改变失败,就对它发起一个逆操作(比如冲正)。这样可以做到很高的并发,在做到保序性的前提下,做差错处理也很简单。相当于把一个复杂操作分解成了多个简单操作,这样开发起来也很快,很容易复用。有点类似CISC和RISC指令集的关系。

    作者回复: 很好的思考,希望后面的课程也能对你有用。

    2020-12-07
    2
    26
  • 公众号:业余草
    谷歌的QUIC有没有未来

    作者回复: 谷歌的gQUIC不会再有什么发展了,但谷歌捐献给IETF的iQUIC,现在都成了HTTP/3,当然会有未来。后面介绍链路传输的课程中会讨论到这个问题。 另外,QUIC的低延迟特性,现在在很多视频直播中都有重要的应用。

    2020-12-07
    2
    10
  • 閃電ㄢ奇±κλ`
    周老师,GraphQL有没有未来

    作者回复: 预言家会被狼人刀的,我不敢随意下结论。 不过,既然它已经不温不火地存在了几年,未来大概率应该也不会消失但同时火不起来吧。

    2020-12-10
    5
  • 刘智恒
    讲的非常详细!点赞!同时我对于超文本驱动这一部分内容有一个问题 在CSR/SSR场景下由ajax获取资源+javascript渲染资源的方式属于超文本驱动吗? 在这种模式下转换页面这个操作有可能是完全由客户端js决定的,似乎和超文本关系不大?如果与超文本关系不大的话,超文本驱动还能作为REST的核心特征吗?

    作者回复: 超文本驱动中的“驱动”,是指“使资源发生变化的信息来源”,这些信息是随着前一次资源请求返回下来的。至于后续这些信息是在client还是在server去使用,是被JS或者什么其他途径使用并不重要。 如果仍然觉得抽象,可以在google上以“HATEOAS”为关键词搜索一下,看一两个例子很容易就明白了。

    2020-12-10
    3
    4
  • 相信你的直觉
    周老师对于架构的设计讲得非常通俗易懂 并且老师讲架构之时,通常都有比较之处,联系贴近生活,各有优缺点。让人茅塞顿开 突然发现软件架构设计已经不仅仅是科学了 已经上升成哲学了 我在想,面向机器,面向过程,面向对象,面向资源,各种思想层出不穷,没有孰优孰劣,应用场景不同,那么适应的思想就不同,我想老师同大家一样,一定是有那么自己擅长的架构和编程思想 思想和技术的路没有尽头,只有不断的演变和进化……

    作者回复: 感谢认可。

    2020-12-07
    3
  • zhanyd
    REST和RPC,如果效率上没要求的话,哪个简单就用哪个,貌似REST方式更简单啊。

    作者回复: rest更简单是因为rest绑定于http,几乎在所有场景中都可用,而且都有天然的client。使用门槛比大部分rpc低 但另一方面,rest抽象程度通常更高,说白了就是有可能通过更少的接口来表达出相同的语义。这个角度的“用”并不会比rpc简单。

    2020-12-07
    2
  • J.Smile
    说实话,这么多年用rest的时候非常少。从功能开发实现的角度来说,非rest跟rest都可以做到。但区别恰恰就在于rest的一个缺点(这里相对来说,其实不够准确)---理解上不够直观。Rest是一种面向资源的架构设计风格,既然是风格,那就具备了可选性这一点,对于习惯了像springmvc传统请求方式来说,并不觉得Rest style有什么实现的必要性。所以,一般面试的时候,还是不要轻易说自己使用过rest,对rest熟悉、精通之类的。😄

    作者回复: 根据团队的实际情况去做决策,不拘泥与纸上谈兵的“最好”或“最佳实践”,也是架构师应有的思维。

    2020-12-07
    2
  • 书生
    REST这种风格确实让接口变的更可读,但是在网关层面更难管理,尤其是path parameter,请教下老师是怎么处理的。(比如说灰度的时候按照路径去匹配灰度名单,有路径参数就很麻烦)

    作者回复: 有参数更加便于网关去路由才对,等后面关于服务网关的课程更新后看看能否解答你的疑问。

    2020-12-08
    2
    1
收起评论
显示
设置
留言
33
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部