什么是RPC?什么是Restful?它们有什么区别?( 三 )


(1)每个统一资源标识符(Uniform Resource Identifier,URI)代表一种资源 。任何事物只要有被引用的必要,它就是一个资源;要让一个资源可以被识别,需要有一个唯一标识,在Web中这个唯一标识就是URI 。
(2)客户端使用GET、POST、PUT、DELETE这4个表示操作方式的动词对服务器端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源 。
(3)通过操作资源的表述形式来操作资源,资源在外部的具体呈现可以有多种表述形式(例如文本资源可以采用html、XML、json等格式,图片可以使用PNG或JPG格式展现出来),在客户端和服务器端之间传送的也是资源的表述,而不是资源本身 。
(4)客户端与服务器端之间的交互在请求之间是无状态的,从客户端到服务器端的每个请求都必须包含理解请求所必需的信息 。这里说的无状态通信原则,并不是说客户端应用不能有状态,而是指服务器端不应该保存客户端状态 。
很多开发人员表示他们的代码是基于HTTP的API进行开发的,那么用了HTTP就叫REST风格吗?答案是否定的 。Leonard Richardson曾提出过一个RESTful成熟度模型,模型中从level 0到level 3,数字越大,表示采用RESTful的成熟度越高,如图6-15所示 。成熟度模型并不是什么工业标准,这里仅作为参考来讲解RESTful思想 。读者可以对比思考自己项目中是如何使用RESTful API的 。

什么是RPC?什么是Restful?它们有什么区别?

文章插图
 
▲图6-15 Leonard Richardson提出的RESTful成熟度模型
在此简单说明RESTful成熟度模型的4个等级 。
level 0:没有明确的资源概念,仅作为通道,只有一个URL,只使用单个HTTP方法 。这个阶段还称不上使用了RESTful,HTTP仅作为RPC的传输通道 。想象一下,在本地调用某个方法时,它可能需要一个输入对象,处理完成后返回另一个结果对象 。这个阶段的HTTP只是用在请求调用远程方法时,传递输入对象给服务器端,并在方法执行结束后,传递结果对象给客户端 。
level 1:有明确的资源概念,存在很多URL,只使用单个HTTP方法 。客户端每次请求都是对服务器端某个或某一类资源的操作 。服务器端一切可被标识的事物都可以称为资源,例如,一张图片、一个订单、一个产品、一个流程、最活跃的10个用户等 。每个资源都可以用URI来表示 。所以从现在开始,URI用来标识一个资源 。
level 2:有明确的资源操作,有很多URL,使用HTTP作为操作资源的统一接口 。通常将对于资源的CRUD式操作分别映射到4个HTTP方法(有时也会使用新增的PATCH方法),这里的每一个动词都有它自身的语义 。
level 3:这一阶段的RESTful API具备了自描述的能力,从而实现服务自动发现 。自描述是指告诉用户当前状态以及下一步可能的各种操作 。如果将应用想象成一个大的状态引擎,那么我们每次针对URI的操作,都是将应用从一种状态转变为另一种状态 。而当前状态(可表述的)里又包含了下一步可进行的操作,一步一步地传输状态,直至完成所有的操作 。一般达到level 3成熟度模型的应用,使用超媒体作为应用状态的引擎(Hypermedia as the Engine of Application State,HATEOAS) 。
REST风格具有开放、标准、通用的特点,尤其在跨语言的异构环境下系统的互联互通具有天然的优势 。对于REST风格的应用开发模式,有两点值得注意 。
(1)RESTful API并不是十全十美的 。由于HTTP是应用层协议,本身比TCP慢一些;加之数据本身是自描述的文本格式,需要占用更多的带宽,因此相比于RPC,RESTful API的速度会稍慢一些 。但是,速度可以通过技术手段弥补,例如HTTP/2、CDN、七层负载均衡等 。在某些对速度要求不严苛的场景下,RESTful API带来的灵活性和伸缩性更具有价值 。
(2)并不是所有业务场景都适合采用RESTful API 。也不是在设计API时就一定要遵守所有规则,如何取舍还要看具体业务需求,适合的才是最好的,毕竟架构也是伴随业务的发展而不断演进的 。
优缺点对比RPC和RESTful是目前两种主流的微服务之间的通信协议风格,两者各有利弊,分别适用于不同的场景 。表6-2是这两种风格的主要技术指标对比 。
表6-2 RPC与RESTful两种协议风格对比
协议
主要技术指标
RPC
RESTful
通信协议
TCP
HTTP
数据传输
二进制
json字符串
提供服务层次
service


推荐阅读