架构系列二十一(RPC 还是 REST 下)

131 阅读6分钟

在远程服务调用领域,应用比较多的方案除了RPC,就是REST了。同时两者之间经常被用来进行相互比较,从根本上RPC 和 REST其实是两个东西,没有什么太多的关联性。这让REST觉得很受伤!

上一篇文章,我给你详细介绍了RPC;那么今天这篇文章,我尝试详细给你介绍一下REST,争取让你看完文章以后,能够清晰的知道什么是REST?以及不再将它和RPC混淆起来。

REST的概念,最早是2000年由Roy Fielding大神提出来的,关于这位大咖在计算机领域的地位,你这样来理解,就好比一提到微服务,你马上能想到Martin Flower。

当时这个概念的提出言简意赅,就一句话:表征状态转移(Representation State Transfer)

看懂了吗?肯定没有,简洁的简直不像人话!你告诉我

  • 什么是表征?
  • 什么是状态?
  • 从哪儿转移到哪儿?

为了搞清楚这一系列的问题,我们从一个例子开始。

今天在网络上生活,已经是一件非常稀松平常的事情了。举个正面一些的例子,你是一个有追求的程序员,爱学习,正在看我的上一篇文章:架构系列二十(RPC 还是 REST 上) 。并且看完文章,你将点击下一篇文章,继续学习:架构系列二十一(RPC 还是 REST 下)

于是,关于你学习的这些操作,你其实是在寻找资源,我专栏里的文章都是资源,注意这里第一个概念出场了:资源(Resource) 。在网络上,你获取的任何东西都是资源,不管文字、图片、还是视频,它们都是信息,都是资源。

关于资源,这一点非常好理解!

那么什么是表征?

表征,可以理解成资源的表现形式,比如你打开这篇文章,它是HTML格式;比如你通过屏幕截图,它是一张图片;比如你将它保存为PDF等等。

你会发现,不管是HTML,还是图片,或者说PDF,它们都是同一个资源的,不同表现形式。这就是表征!实际上表征状态转移,稍微可以这么来翻译一下,等于说是表现层资源状态转移

什么是状态?

我们经常说HTTP是无状态的,微服务系统在架构设计上最好做成无状态,方便扩缩容。你看等等这些都提到了状态两个字。

状态,可以理解成上下文信息。什么是上下文信息?你看完了文章:架构系列二十,通过下一篇操作,继续看架构系列二十一。

这里下一篇这个操作,就需要告诉服务器,上一篇文章是架构系列二十,这样一来,服务器就知道你要的是架构系列二十一这篇文章了。这就是上下文信息。

从哪儿转移到哪儿?

更好理解,从上一篇,转移到下一篇。

到这里,你应该能够理解REST的核心表达诉求了:表征状态转移!

在Fielding最初提出中,说明了REST风格的系统,需要具备这么几个特征

  • 前后端分离:这一条非常好理解,在微服务风潮的洗礼下,随处可见
  • 无状态:这一条不是稀奇事,分布式系统服务,无状态保障了足够的伸缩性
  • 可缓存:因为前后端分离了,服务无状态,需要具备可缓存的能力,提升性能
  • 分层系统:客户端在一次请求中,不需要知道经过了哪些中间系统,最终服务器是谁
  • 统一接口:这一条最重要,面向资源编程,关于面向资源编程,稍后我再详细给你娓娓道来
  • 按需代码:客户端在一次请求中,至于服务端返回什么,不做强制要求

到此,你对REST有一个基本的认识。回到我们最初的问题,为什么一定要将REST与RPC放到一起去做比较呢

它们本质上其实是两个不同的物种,唯一的关联关系是解决了相似的问题域:分布式系统中,远程服务的调用

从思想上,RPC是面向过程编程的思想,而REST是面向资源的编程思想。面向过程更加贴近计算机的思维方式,面向资源会更加抽象,但带来的收益是REST设计的服务,更具备通用性、扩展性。

从概念上,RPC是一种协议,有强制的规范和约束,而REST只是一种系统架构设计的风格。它没有任何的约束性,随你喜好。

所以,你看到了,从思想上,从概念上,RPC和REST是两个物种,它们唯一的联系就是解决分布式系统中,远程服务调用的问题。

最后,我们再来看一下,REST的成熟度模型

REST成熟度模型,是有Leonard Richardson(伦纳德.理查德森)提出的,因此叫做Richardson成熟度模型,它对于我们将未使用REST的服务,转换成REST风格的服务具有指导意义。

提到伦纳德,注意一下他不是NBA快船队的当家球星小卡,但是都不简单,当然小卡是我个人非常喜欢的球星,低调有实力,不管外面媒体有多少流言,你说你的,我过我的,罗老师说过:彪悍的人生不需要解释!

回到Richardson成熟度模型,从0到3提出了REST的四个层级

  • 第0级:无REST,完全不REST
  • 第1级:引入资源的概念,REST是面向资源编程思想的体现
  • 第2级:引入统一接口,对应的是映射到HTTP协议的请求方法上,注意:REST在使用上跟HTTP进行了一个绑定
  • 第3级:超文本驱动,超文本就是能对操作进行判断和响应的文本。等于是说,除了第一个客户端请求,是你在浏览器地址栏输入的,后续的其它请求都能够根据服务端的响应信息,以超文本方式驱动,来进行状态转移

当然在实际的REST实践中,我们目前绝大多数系统,都只到了第2级别,到3级别的,我还没有见到过。多少有点孤陋寡闻了!但这是事实,做人要诚实。

为了再直观一些的理解REST成熟度模型,文章的最后用一个图来收尾

image.png