Rest Notes-REST架构的元素

摘要: 上篇文章是对REST的风格推导,本篇是对REST架构中元素做解释

正文:

REST架构的元素

数据元素(Data Elements)

在分布式对象风格中,所有的数据被封装和隐藏在数据的处理组件之中。于分布式对象不同的是,REST的关键方面之一是架构的数据元素的性质和状态。在分布式超媒体的特性中,当用户选择了一个链接后,该链接所指向的信息需要从其存储地移动到其使用地。对于一个分布式超媒体系统的架构师而言,他只能在三种选项中做出选择:

  • 在数据所在地对数据进行呈现,并向接收者发送一个固定格式的镜像;
  • 把数据和呈现引擎封装起来,一起发送给接收者;
  • 发送原始数据可一些描述数据类型的元数据,让接收者自己去呈现。

第一种选项对应于传统的客户-服务器风格,将与数据的自然特性有关的所有信息都被隐藏在数据发送者之中,简化了客户端的实现。但是也严重限制了接收者的功能,并且将大部分处理负担都放在了发送者这一边,从来导致伸缩性的问题

第二种对应于可移动对象风格,它支持对于信息的隐藏还可以通过唯一的呈现引擎来支持对于数据的专门处理。但是它将接收者的功能限制在引擎所能预测的范围之内,还大幅增加需要移交的数据量

第三种选项允许发送者保持简单性和可伸缩性,同时使得需要移交的数据最小化。但是它丧失了信息隐藏的优点,并且要求发送者和接收者都必须理解相同的数据类型

REST提供的是所有三种选项的一个混合体,通过以一种数据格式移交资源的表述来进行通信,可以基于接收者的能力和所期待的格式以及内容中动态的选择所使用的数据格式。至于表述是否与资源的原始格式相同,则被隐藏在了接口的背后

通过发送一个表述,可以获得近似于可移动对象风格的好处,这个表述由一个封装过的呈现引擎的标准数据格式中的指令组成。REST因此获得了客户-服务器风格的分离关注点的好处,而且不存在服务器的可伸缩性问题,它允许通过一个通用的接口来隐藏信息,从而支持封装和服务的进化,并且可以通过下载功能引擎来提供一组不同的功能

数据元素

现代Web实例

资源

一个超文本引用所指向的概念性目标

资源标识符

URL、URN

表述

HTML 文档、JPEG图片

表述元数据

媒体类型、最后修改时间

资源元数据

source link、alternates、vary

控制数据

if-modified-since、cache-control

资源和资源标识符

REST对于信息的核心抽象是资源,任何能够被命名的信息都能够作为一个资源:一份文档、一张图片、北京的天气等

资源标识符则是对一个资源的唯一标识,由命名权威来为资源分配标识符,映射的语义同样由命名权威来负责

表述

REST使用表述来描述资源的当前状态或预期状态,由数据、描述数据的元数据、以及(有时候存在的)描述元数据的元数据组成(通常用来验证消息的完整性)

元数据以名称-值对的形式出现,名称对应于一个定义值的结构和语义的标准。响应消息可以同时包括表述元数据资源元数据

控制数据 定义了在组件之间移交的消息的用途,例如被请求的动作或响应的含义。也用于提供请求的参数,或覆盖某些连接元素的默认行为

表述的数据格式被称为媒体类型(media type),发送者能够将一个表述包含在一个消息中发给接收者,接收者根据消息中的控制数据和媒体类型的性质对该消息进行处理。媒体类型有些是用来做自动处理,有些是用来呈现给用户查看的

媒体类型的设计能够直接影响到一个分布式超媒体系统的用户感知的性能。例如接收者对表述呈现之前需要接收一些数据造成的交互的延迟。在网络性能相同的情况下,增量会比整个文档全部接收的浏览器在用户感知层面更好

###连接器(Connectors)

连接器

现代互联网实例

客户

libwww、libwww-perl

服务器

libwww、Apache API、NSAPI

缓存

浏览器缓存、Akamai缓存网络

解析器(resolver)

绑定(DNS查找库)

隧道(tunnel)

SOCKS、HTTP CONNECT之后的SSL

如上列表所示,REST使用不同的连接器类型来对访问资源和移交资源表述的活动进行封装。连接器代表了一个组件通信的抽象接口,通过提供清晰的关注点分离、并且隐藏资源的底层实现和通信机制,改善了架构的简单性,接口的通用性也使得组件的可替换性变得可能。

所有的REST交互都是无状态的,这一限制得到了四个功能:

  • 它使得连接器无须在请求之间保持应用的状态,改善了可伸缩性,降低了物理资源的消耗
  • 它允许对交互进行并行处理,处理机制无须理解交互的语义
  • 它允许中间件孤立的查看和理解一个请求,当对服务进行动态“编排”时这个是必须的
  • 它强制每个请求都必须包含可能会影响到一个已缓存响应的可重用性的所有信息

上面列表的前两种都是很容易理解的,第三种缓存连接器可以位于客户或服务器连接器的接口处,以便保存当前交互的可缓存的响应;

第四种解析器负责将部分或完整的资源标识符翻译成创建组件间链接所需的网络地址信息(例如Web浏览器会从URI中提取出主机名并利用DNS解析器来获得该命名权威的互联网协议(IP)地址);

第五种隧道,它简单地跨越连接的边界(如防火墙)对通信进行中继(例如当响应一个connect方法请求时,http代理会切换到一个隧道,从而允许其客户使用一种不同的协议来直接与不支持代理的远程服务器通信。当两端终止通信时隧道就会消失)

组件

组件

现代Web实例

来源服务器(origin server)

Apache httpd、微软IIS

网关(gateway)

Squid、CGI、反向代理

代理(proxy)

CERN代理、Netscape代理、Gauntlet

用户代理(user agent)

Netscape Navigator、Lynx、MOMspider

来源服务器使用服务器连接管理被请求资源的命名空间,每个来源服务器都以资源层次结构的形式,为期所暴露的服务提供一个通用的接口。资源的实现细节被隐藏在这一接口的背后

网关也叫反向代理,是由网络或来源服务器强加的中间组件,为其他服务提供接口封装,以执行数据转换、性能增强或安全增强

代理组件是由客户选择的中间件,用来为其他的服务、数据转换、性能增强、安全保护提供接口封装

用户代理使用客户连接器发起请求,并作为响应的最终接收者,常见的例子是Web浏览器

网关与代理的区别是,何时使用代理是由客户来决定的 下篇会写REST架构中的视图部分~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端技术探索

基于Redis实现分布式消息队列(一)

1、为什么需要消息队列? 当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。

2903
来自专栏xcywt

程序员需要知道的十个操作系统的概念

说明:我之前在网上看到这篇文章觉得非常好,于是把它翻译了下来。当然很多地方翻译的很渣,见笑了。温馨提示,文章有点长。

851
来自专栏阮一峰的网络日志

版本控制入门插图教程

但是,我平时只是业余写一些小程序,感觉特地装一个VCS太麻烦,所以一直没有用。最近,因为想认真做一个中等规模的项目,所以决心好好学一下怎么用。

1112
来自专栏Java后端技术栈

为什么分布式一定要有Redis?

考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知...

1192
来自专栏Kirito的技术分享

深入理解RPC之协议篇

协议(Protocol)是个很广的概念,RPC 被称为远程过程调用协议,HTTP 和 TCP 也是大家熟悉的协议,也有人经常拿 RPC 和 RESTFUL 做对...

59815
来自专栏java架构学习交流

Java web开发,在一个jsp里放太多java代码的后果,摘自 java web轻量级开发面试教程

现要做一个简单的登录页面,如果用户通过验证,会显示Welcome用户名的欢迎词,反之则返回登录页面让用户再次输入 这部分的完整代码是JSPDemo项目里的log...

2657
来自专栏信安之路

论二级域名收集的各种姿势

1 查询whois http://whois.chinaz.com/baidu.com

3360
来自专栏Java技术栈

扫盲,为什么分布式一定要有Redis?

考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知...

1513
来自专栏java达人

防止表单重复提交的思路和方法

作为一个软件开发者,绝不能奢望你的用户会规规矩矩地使用你的软件,他们一般都是缺乏耐心,“胡作非为”的。比如当他点击提交表单时,服务器处理比较慢, 页面上没有任何...

2878
来自专栏Spark学习技巧

为什么分布式一定要有Redis?

考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知...

882

扫码关注云+社区