摘要: 上篇文章是对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架构中的视图部分~