为什么有些面试官很喜欢问这个 Restful、SOAP、RPC、SOA 之间的区别,而回答的时候,总是回答的没有那么的好,于是就想让阿粉给她解答一下这个内容,于是阿粉专门来写一篇文章来进行这个解答。
什么是 Restful
Restful(Representational State Transfer)是⼀种架构设计⻛格,提供了设计原则和约束条件,⽽不是架构,⽽满⾜这些约束条件和原则的 应⽤程序或设计就是 Restful架构或服务。
也就是说,他并不是说是一种架构,而是一种设计上的风格,就类似那种约定俗成的,阿粉最早知道这个 Restful 的时候,还是之前看过大神阮一峰的博客才学习到的。
其实想要理解Restful,那么你得先知道 Restful 的主要设计原则,那么 Restful 的主要设计原则都有哪些?
- 资源与URI
- 统⼀资源接⼝(HTTP⽅法如GET,PUT和POST)
- 资源的表述
- 资源的链接
- 状态的转移
实际上,REST全称是表述性状态转移,那究竟指的是什么的表述? 其实指的就是资源。
**资源与URI
这时候就会有读者问,那这个资源又是怎么定义的呢?
这个资源实际上就相当于是一个抽象的概念,只要你这个事物,有被引用到的地方,那么他就可以定义成为一个资源,就比如我们的姓名,手机号,
- 警察落户需要你的姓名
- 办理某些会员卡需要你的姓名
- 你在办理会员卡的时候,需要绑定一下手机号
也就是说,你的姓名和你的手机号,都有被引用得到的地方,那么他就可以称之为资源。
那么什么又是URI呢?
要让一个资源可以被识别,需要有个唯一标识,在Web中这个唯一标识就是URI(Uniform Resource Identifier)。
这个对开发来说就很容易理解了,URI 就是地址
- https://www.baidu.com/
- https://www.taobao.com/
- https://www.jd.com/
统⼀资源接⼝
那么什么是统一资源接口呢?
这就又得说到 Restful 架构设计⻛格的定义上来了,遵循的原则还是,遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。
如果这么说,大家我相信那是明白的非常透彻的,毕竟你看,你写接口的时候,直接来的不就是
@PostMapping(value = "/order/create", produces = MediaType.APPLICATION_JSON_VALUE)
public JsonObjcet createOrder(){
.....
}
是不是都是这么写的,实际上他就是一种 Restful 风格的。
至于请求的状态码,阿粉就不再多说什么了,相信只要是看阿粉文章的,百分之百也都明白状态码一般对应什么样子的含义。
资源的表述
那么什么是资源的描述呢?
这个理解就比较简单了,为什么这么说,你可以这样理解,只关心你给的返回内容,不关心你内部实现。
换成比较官方的语言就是:
客户端获取的只是资源的表述而已。资源在外界的具体呈现,可以有多种表述(或称为表现、表示)形式,在客户端和服务端之间传送的也是资源的表述,而不是资源本身。例如文本资源可以采用html、xml、json等格式,图片可以使用PNG或JPG展现出来。
其实资源的描述阿粉觉得他就是数据展示,但是很多人也不是这么理解,毕竟每个人的理解都是不一样的,也没有什么标准答案,毕竟不是 1+1=2 的数学问题,不是么?
资源的链接
资源的链接,这个相对来说,也挺容易理解的,一般的,我们在项目里面,很多都是从一个链接去到另外一个链接,获取我们的想要的资源信息,比如说,我们有一个活动,如果你想要获取这个活动的最新详情,那么就一定需要我们再去对这个资源进行一个获取,实际上如果简单来说,就是对资源做了个CRUD。
状态的转移
实际上,我们在看某些页面的时候,一直在默默的接受这个状态转移,比如,“下一页”,因为这个 “下一页” 就会表示,你从当前的这个状态,转到下一个未知的状态, 这实际上就是状态的转移。
**什么是SOAP
相对来说 SOAP 就不如 Restful 那么复杂了,需要你理解的东西没那么多了。
简单对象访问协议是⼀种数据交换协议规范,是⼀种轻量的、简单的、基于XML的协议的规范。
SOAP协议和HTTP协议⼀样,都是底层的通信协议,只是请求包的格式不同⽽已,SOAP包是XML格式的。SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防⽕墙或代理服务器的要求。
SOAP可以使⽤任何语⾔来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台⽆需 修改即可正常使⽤
**什么是RPC
RPC就是从⼀台机器(客户端)上通过参数传递的⽅式调⽤另⼀台机器(服务器)上的⼀个函数或⽅法 (可以统称为服务)并得到返回的结果。
RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
RPC 是⼀个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的⼯作⽅式)
RPC 在使⽤形式上像调⽤本地函数(或⽅法)⼀样去调⽤远程的函数(或⽅法)。
其实说到RPC,这个属实是面试的时候,经常会被问到的一个地方,为什么这么说,因为有很多很多的框架,都是用的 RPC 。
比如已经进入 Apache 孵化器的 Dubbo ,还有还有SpringCloud框架,微服务全家桶。这都是比较出名的用 RPC 的框架,但是很多人就会说,别瞎扯了,人家SpringCloud 明明是用的 http ,确实,也没啥错误。
spring cloud是基于spring boot 的,spring boot 实现的是http协议的rpc,算是rpc的⼀个⼦集。
所以阿粉在这里也把 SpringCloud 给算进来了。
什么是SOA
说到SOA,英文全称是((Service-Oriented Architecture),翻译成中文就是⾯向服务的架构。
这就是最经典的微服务架构了,微服务架构就是从 SOA 进化的结果。
两者说到底都是对外提供接⼝的⼀种架构设计⽅式,随着互联⽹的发展, 复杂的平台、业务的出现,导致SOA架构向更细粒度、更通过化程度发展,就成了所谓的微服务了。
通俗点来讲,SOA提倡将不同应⽤程序的业务功能封装成“服务”并宿主起来,通常以接⼝和契约的形式暴 露并提供给外界应⽤访问(通过交换消息),达到不同系统可重⽤的⽬的。
SOA是⼀个组件模型,它能将不同的服务通过定义良好的接⼝和契约联系起来。服务是SOA的基⽯。
所以后面就出现了这个微服务了。
今天阿粉要说的内容,就这些了,你理解了么?
文章参考
- 《百度百科》
- 《RESTful Web Services》