微服务之间通过一些轻量级的通信机制进行通信如REST API,那么如何理解REST API呢?
首先要明确一点:REST 实际上只是一种设计风格,它并不是标准。(所以你可以看到网上一大堆的各种最佳实践,设计指南,但是没有人说设计标准)
通俗的讲REST就是:
看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何
更简洁的来说,就是用URL定位资源,用HTTP描述操作
详细的介绍我认为这位大佬的解释很透彻,不像其他网络上的解释的晦涩难懂https://www.zhihu.com/people/houhaichao830/activities
要解释什么是REST,你应该先了解什么是API(Application Programming Interface,应用程序编程接口),形象一点说就是像一个公司比如腾讯,阿里巴巴之类,他们可以提供一个API,然后我们或者一些其他的小公司可以编一个软件去跟这个接口(API)进行相连或交互。
举个例子,比如你可以用手机的其他软件分享内容到微信朋友圈或者新浪微博,这些软件就是与微信和微博的api进行了交互。知道了API,那么就容易理解REST了。REST是什么呢? 它是一种架构风格,腾讯公司或其他公司建立API时要遵守的一种规则/风格,当然也有其他规则可以用。现在稍微具体一下什么是REST架构风格。REST也就是Representational State Transfer(表现层状态转移)。
要具体什么事REST,我们又必须提到Web,因为REST是以Web为平台的。Web是什么: 分布式信息系统为超文本文件和其他对象(资源)提供访问入口资源是Web架构的关键点,需要 3个操作识别(identify) 表示(represent) 交互(interact with),通过这三个操作,又引出三个概念uri(统一资源标识符包括url和urn)识别资源;representation (例如html,xml,图片,视频等等)表示资源;通过协议(包括http,ftp等等)与资源进行交互。所以REST就是选择通过使用http协议和uri,利用client/server model对资源进行CRUD (Create/Read/Update/Delete)增删改查操作。那么为什么要使用REST风格呢?肯定是因为它的优点,所以才选择使用它呀。因此现在先介绍它的优点,要介绍它的优点又要提到它的六个限制,我看其他答案只提到了限制,但是没有写限制的好处,在这里我列出限制和它的好处:1.客户-服务器(Client-Server)客户端服务器分离优点,提高用户界面的便携性(操作简单) 通过简化服务器提高可伸缩性(高性能,低成本) 允许组件分别优化(可以让服务端和客户端分别进行改进和优化)2.无状态(Stateless)从客户端的每个请求要包含服务器所需要的所有信息优点:提高可见性(可以单独考虑每个请求)提高了可靠性(更容易从局部故障中修复)提高可扩展性(降低了服务器资源使用)3.缓存(Cachable)服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求。优点:减少交互次数减少交互的平均延迟4.分层系统(Layered System)系统组件不需要知道与他交流组件之外的事情。封装服务,引入中间层。优点:限制了系统的复杂性提高可扩展性5.统一接口(Uniform Interface)鼓励单独改善组件优点:提高交互的可见性6.支持按需代码(Code-On-Demand 可选)
具体例子参考这位大佬的:
https://www.zhihu.com/people/aisuhua/activities
说说几个重要的概念:
1、REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露。
URI 的设计只要负责把资源通过合理方式暴露出来就可以了。对资源的操作与它无关,操作是通过 HTTP动词来体现,所以REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词。
比如:左边是错误的设计,而右边是正确的
GET /rest/api/getDogs --> GET /rest/api/dogs 获取所有小狗狗
GET /rest/api/addDogs --> POST /rest/api/dogs 添加一个小狗狗
GET /rest/api/editDogs/:dog_id --> PUT /rest/api/dogs/:dog_id 修改一个小狗狗
GET /rest/api/deleteDogs/:dog_id --> DELETE /rest/api/dogs/:dog_id 删除一个小狗狗
左边的这种设计,很明显不符合REST风格,上面已经说了,URI 只负责准确无误的暴露资源,而 getDogs/addDogs...已经包含了对资源的操作,这是不对的。相反右边却满足了,它的操作是使用标准的HTTP动词来体现。
2、REST很好地利用了HTTP本身就有的一些特征,如HTTP动词、HTTP状态码、HTTP报头等等
REST API 是基于 HTTP的,所以你的API应该去使用 HTTP的一些标准。这样所有的HTTP客户端(如浏览器)才能够直接理解你的API(当然还有其他好处,如利于缓存等等)。REST 实际上也非常强调应该利用好 HTTP本来就有的特征,而不是只把 HTTP当成一个传输层这么简单了。
HTTP动词
GET 获取一个资源
POST 添加一个资源
PUT 修改一个资源
DELETE 删除一个资源
实际上,这四个动词实际上就对应着增删改查四个操作,这就利用了HTTP动词来表示对资源的操作。
HTTP状态码
200 OK
400 Bad Request
500 Internal Server Error
在 APP 与 API 的交互当中,其结果无非就三种状态:
这三种状态与上面的状态码是一一对应的。
HTTP报头
Authorization 认证报头
Cache-Control 缓存报头
Cnotent-Type 消息体类型报头
......
报头还有很多,不一一列举。HTTP报头是描述HTTP请求或响应的元数据,它的作用是客户端 与 服务器端进行相互通信时,告诉对方应该如何处理本次请求。