面试造飞机系列:看架构师如何设计微服务接口

REST(Representational State Transfer,表述性状态转移) 是一种软件架构风格。REST提出了一组架构约束条件和原则,任何满足 REST 约束条件和原则的架构,都称为 RESTful 架构。

微服务之间需要相互通信以完成特定的业务处理,在典型的客户端-服务端设计模型中,客户端和服务端通通过消息请求-响应的方式交互协作,REST 就是这样一套微服务之间交互接口的设计约束和原则规范。

表述性

「表述性」其实是缺少了主语的,主语是「资源」。完整的描述是「资源表述性」,也就是「资源的描述」。在网络通信中用什么描述资源呢?没错就是 URI(Uniform Resource Identifier,统一资源标识符)。

这里有几个近义词先给大家先科普一下:

URI  是统一资源标识符,用来唯一的标识一个资源。

URL 是统一资源定位器,它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何定位这个资源,URL 是 URI 的子集。

URN  统一资源命名,是通过名字来标识资源。URN也是 URI 的子集。

在 HTTP 协议中用 URL 标识资源,也就是浏览器地址栏你看到的那一串网址。

状态转移

搞懂了「资源描述性」接下来看下什么是「状态转移」?状态转移就是客户端通过一系列请求动作,推动服务端的资源状态发生变化,资源的状态可以在「创建-修改-查看-删除」之间转移。

资源状态转移

资源状态的变化在宏观上的反应就是业务流程推进。打个比方,你去银行系统开户、查余额、销户,这个过程你推动了你的银行账户这个「资源」经历了不同的状态转移让你完成了不同的业务操作。

REST的约束条件

协议选择

REST 本身并没有提到底层应该使用什么协议,日常实践案例中最常用的是基于 HTTP 的 RESTful 实现。

这是因为 HTTP 协议自带的动词 GET/POST/PUT/DELETE 可以作为推动状态转移的方法,另外HTTP 的制定了规范的状态码。还有其他的一些 HTTP 特性,这些特性使得在HTTP 之上实现 REST 要简单得多,而如果使用其他协议的话,就需要自己实现这些特性。

请求规范

RESTful 架构中,发生状态转换的是「资源」,所以URI 中一般只能包含代表「资源」的名词,并且推荐是复数,而不应该在 URI 中包对资源进行操作的动词。

对资源执行的CURD「增删改查」动作应该在HTTP请求方法的GET/POST/PUT/DELETE中体现。

符合REST规范的写法:

POST http://www.test.com/lemon   // 创建

Get http://www.test.com/lemon    // 查询

PUT http://www.test.com/lemon    // 修改

DELETE http://www.test.com/lemon //删除

不符合REST规范的写法:

POST http://www.test.com/Createlemon  // 创建POST http://www.test.com/Querylemon   // 查询POST http://www.test.com/Modifylemon  // 修改POST http://www.test.com/Deletelemon  //删除

状态码

服务端消息响应携带状态码,指示客户端进行下一步处理。符合 RESTful 规范的接口返回状态码都是通用的,不需要额外约定,利用HTTP Status Code 状态码 表示请求处理结果,降低了微服务间互操作成本。

状态码

状态码含义

2xx

成功,操作被成功接收并处理

3xx

重定向,需要进一步的操作以完成请求

4xx

客户端错误,请求包含语法错误或无法完成请求

5xx

服务器错误,服务器在处理请求的过程中发生了错误

下面是常见的HTTP状态码:

  • 200 - 请求成功

  • 301 - 资源(网页等)被永久转移到其它URL

  • 404 - 请求的资源(网页等)不存在

  • 500 - 内部服务器错误

无状态

RESTful接口要求是「无状态」。无状态指的是任意一个Web请求必须完全与其他请求隔离,当客户端发起请求时,消息本身包含了服务端识别这一请求上下文所需的全部信息。

无状态不是真的没有状态

接口「无状态」更确切的说是服务端无状态,整个会话还是需要状态维持的。要完成一个业务流程,一般客户端与服务端需要多次的消息交互,我们知道HTTP 协议是「无状态协议」,这就需要服务端能够识别几个独立 HTTP 请求的「状态信息」,从而将他们关联到一个业务流程中。

技术方案

服务端要能识别请求的「状态信息」,有两种技术方案:

  1. Session 方式。服务端保存会话状态,客户端每次请求携带session-id。

    服务端维护一个会话状态信息列表,用session-id唯一标识一个状态信息,session-id一般包含在HTTP响应的Set-Cookie头部返回给客户端,后续客户端请求携带包含session-id信息的cookie头部,服务端解析cookie取出session-id,去维护的状态列表中取回该消息对应的状态信息,这样就把无状态的HTTP变成有状态的了。

session会话

  1. Token 方式。服务端不保存会话状态,客户端每次请求都携带完整的会话状态信息(一般是加密的)给服务端。

    Token也称作是「令牌」或临时证书签名,状态信息都被加密到token中,这样每当服务器收到请求后解密token就能获取该请求对应的状态信息,也就能把不同的请求消息关联到同一个业务流程中来,和session方式有类似的效果,只不过这次的状态信息不保存在服务端。

Token会话

以上两种实现中,第一种 Session 方式是有状态的,第二种 Token 方式是无状态的。

如果你要实现 RESTful 接口最好按第二种技术方案实现,当然要实现无状态也还有其他方式,思路都是「服务端不保持会话状态」就对了。

为什么要无状态

为了高可用性和负载均衡需求,多个微服务通过负载均衡实现分布式集群化部署,集群中每个服务都是独立和对等的。如果服务器在收到客户端请求之时不可用或者宕机,无状态请求可以由任何其他可用服务器处理并作出应答,这在分布式应用中非常重要。

REST无状态接口

想象一下如果服务端保存状态,一个事务内的每个请求都必须落到同一台服务器去处理,这就失去了分布式的意义和优势。

所以, RESTful 接口要求是无状态的,是为了更好的适应分布式业务场景,发挥微服务集群优势。

REST 和 RPC

这两个概念经常出现在微服务架构设计中,REST 是一种软件架构接口设计风格,RPC 是一种计算机通信协议,看起来是两个不同的概念,没法比较。

但是有些书中把它们放在一起比较,真要比较的话,我个人倾向于把 REST 具体化为一种基于HTTP 并按照 REST 约束设计的通信协议,这样两个通信协议才有比较性。

回顾下RPC

RPC (Remote Procedure Call)远程过程调用是一个计算机通信协议。我们一般的程序调用是本地程序内部的调用,RPC允许你像调用本地函数一样去调用另一个程序的函数,这中间会涉及网络通信和进程间通信,但你无需知道实现细节,RPC框架为你屏蔽了底层实现。

RPC 是一种服务器-客户端Client/Server模式,经典实现是一个通过发送请求-接受回应进行信息交互的系统。

适用场景

很多 RPC 框架提供的消息传输都是基于二进制的,比如Thrift、Protocol buffers。这样做的好处是消息结构比较紧凑,对于频繁调用或者大流量、低时延要求的应用场景,能够显著减少网络开销;另一个约束是某些 RPC 框架有很强的技术耦合性,比如 Dubbo 只能用于 java 技术栈。综上,RPC 「更加适用于系统内部微服务之间的高效通信」

RESTful接口由于提供了统一的基于 HTTP的 REST 设计标准,只需 web 框架支持 HTTP 协议,并设计RESTful 风格的接口即可,极大的方便了第三方服务接入调用,REST「适合用于微服务系统对外暴露的接口设计标准」

微服务——REST(Representational State Transfer,表述性状态转移)相关推荐

  1. REST(Representational State Transfer表述性状态转移)

    http://zh.wikipedia.org/zh-cn/REST REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降 ...

  2. REST(Representational State Transfer):表述性状态转移

    REST(Representational State Transfer):表述性状态转移概念:REST是一种跨平台.跨语言的架构风格.1)在REST架构风格中,对象被抽象为一种资源,表述性状态是指( ...

  3. RESTful Representational State Transfer 表现层状态转化

    说说WCF Rest [WCF REST] 一个简单的REST服务实例 RESTful 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基 ...

  4. REST - 表述性状态转移

    表述性状态转移(REST - Representional State Transfer) The Representational State Transfer (REST) style is an ...

  5. Restful 表述性状态传递

    Restful REST表述性状态传递 REST通常基于使用HTTP,URL,XML,HTML. REST使用的数据格式为JSON HTTP方法 GET 获取数据 PUT 用于更新和添加数据 DELE ...

  6. REST(Representational State Transfer)简介

    REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格. 它是一 ...

  7. Restful(表象性状态转移)的理解

    作者:覃超 链接:https://www.zhihu.com/question/28557115/answer/48094438 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  8. REST表述性状态传递

    REST定义了一组体系架构原则,近年来已经成为最主要的Web服务设计模式. 1.链接原则:任何可能的情况下,使用链接指引可以被标识的事物(资源). 2.统一接口原则:通用标准方法使得所有理解HTTP应 ...

  9. 微服务 ZooKeeper ,Dubbo ,Kafka 介绍应用

    目录 微服务 微服务的优缺点 微服务技术栈 ​编辑 常见的微服务框架 ZooKeeper 工作原理 ZooKeeper 集中存放管理 ZooKeeper 功能  动物园管理员 ZooKeeper 服务 ...

最新文章

  1. 1、HTML 初步认识
  2. jQuery 处理xml
  3. Oracle锁表处理
  4. 为什么我们最终抛弃 Chromium 选择了 Firefox ?
  5. modbus发送接收_自己编写MODBUS协议代码所踩过的坑
  6. Intellij Idea 导入项目
  7. html document怎么转换成word,如何将HTML document文件类型转换成word document?
  8. win10怎么更新显卡驱动_win10系统AMD显卡驱动安装失败的解决方法
  9. 一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解
  10. app小窗口悬浮工具_侧边栏 app小窗口悬浮工具
  11. android人脸识别——HowOld测测你的年龄和性别
  12. ubuntu下安装(二)印象笔记(中国版而不是国际版)
  13. python网络爬虫——爬取嗅事百科
  14. 研究课题:工资管理系统
  15. 渗透测试中用到的一些基本知识
  16. android u盘挂载监听,Android SD卡及U盘插拔状态监听及内容读取
  17. 人工智能,离我们还远么?
  18. python做表格真的快吗_厉害!一百多张Excel表用Python竟然不到3秒就处理完了?
  19. 4.5 星历(历书)解码
  20. fluentdata 访问mysql_AgileDataAccess

热门文章

  1. Python 能干什么(一)
  2. 万字长文爆肝Python基础入门【第二弹、超详细数据类型总结】
  3. Win11更改磁盘驱动器号的方法
  4. 如何用好ZBrush 中的移动笔刷
  5. 论文查询AI知识查询网站推荐
  6. SPI Flash为何需要24位地址线?
  7. 微信小程序开发加载html富文本数据
  8. Fragment购物车页面 (快捷键)
  9. 为什么华为在发布会不提鸿蒙,华为又要开发布会?这次没有手机新品,鸿蒙系统要当主角!...
  10. 一行“无用”的枚举反使Rust执行效率提升10%,编程到最后都是极致的艺术!