Read paper from Roy Thomas Fieldin - [Architectural Styles and the Design og Network-based Software Architectures]
1. 目的
-
通过有原则的使用架构约束来理解和评估基于网络的应用程序软件的架构设计,从而获得架构所需的功能、性能和社会属性。建筑更够是一组命名的、协调的建筑约束。
-
REST强调组件交互的可伸缩性、接口的通用性、组件&中间件的独立部署,以减少交互延迟,增强系统的安全性
-
Paper将描述将REST应用到Hypertext Transfer Protocol and Uniform Resource Identifier standards
2.软件架构
运行时抽象
-
软件体系结构:是一个软件系统的运行时间的元素再起操作期间的某些阶段的抽象。一个系统可能由许多抽象级别和许多操作阶段组成,每个阶段都有自己的软件体系结构。
-
软件体系结构的核心是抽象原理: 通过疯转隐藏系统的某些细节,以便更好地标识和维持其属性。
-
体系结构这种递归一直延续到最基本的系统元素:那些不能分解为抽象程度较低的元素
-
架构设计与源代码结构设计,虽然紧密相关,但是却是分开设计活动
元素
-
软件结构:组件,连接器,数据
-
建筑元素包括处理元素、数据元素和连接元素,处理元素是对数据执行转换的元素(以“组件”代指 – 盒),数据元素是包含已使用和转换的信息元素,连接元素是将架构不同部分组合在一起连接件(以“连接器”代指 – 线)
(1)组件
- 组件:软件指令和内部状态,经由其接口提供数据变换的抽象单位
(2)连接器
- 连接器: 是介导通信、协调、组件之间合作的抽象机制
(3)数据
- 数据:是从组件传输,或由组件通过连接器接受的信息元素
配置
- 是一个组件、连接器、数据之间关联期间系统运行时的建筑,可能认为是一组针对组件交互的特定约束
属性
- 软件体系结构属性集包括从系统中组件、连接器和数据的选择和排列中得出的所有属性。属性是由体系结构中一组约束引起的
样式
- 是一种用于对体系结构进行分类并定义其共同特征的机制。架构风格封装了有关架构元素的重要决策,并强调了对元素机器关系的重要约束
模式与模式语言
- 设计模式被定义为重要的重复系统构造,模式语言是一种以建筑形式组织的模式系统
其他
- 架构设计方法: 4+1 视图模型,每一组视图解决特定的问题
- 领域模型DDD
- DSSA 特定领域软件体系结构
- 架构描述语言ADL
3.基于网络的应用架构
- 基于网络的体系结构与软件体系结构之间的主要区别,组件之间的通信仅限于消息传递,或者在运行时通过某些机制,等效于消息传递
应用程序软件与网络软件
- 应用软件体系结构是整个系统的抽象级别,其中用户操作的目标可以表示为功能体系建筑属性
评估应用程序架构的设计
- 论文的目的是为选择或创建给定应用程序域的最合适体系建筑的任务提供设计指导
重要的建筑属性
-
性能 :组件交互可能是确定用户感知的性能和网络效率的主要因素
-
网络性能: 用于描述通信的某些属性(吞吐量/开销/带宽/可用带宽)
-
用户感知的性能:延迟&完成时间 。优化等待时间的设计考虑因素通常会带来降低完成时间的副作用
延迟:从初始刺激到反应的最初指示之间的时间段。
延迟一般发生在
(1)应用程序识别启动该动作的事件所需时间
(2)建立组件之间的交互所需的时间
(3)将每个交互传递到组件所需的时间
(4)处理这些组件上的每个交互所需时间
(5)在应用程序能够开始呈现可用结果之前,完成交互结果的充分传输和处理所需的时间
完成:是完成应用程序操作所花费的时间
-
网络效率:不使用网络能够或侧最佳的应用程序性能–>重用先前的交互(缓存),减少网络交互的频率,来有效的最小化网络的使用
-
可扩展性/可伸缩性:架构在活动配置中支持大量组件或组件之间交互的能力。可通过简化组件,多个组件之间分布服务以及通过监视监控交互和配置来提高
-
简单性:架构风格引起的简单性主要是将关注点分离的原理应用于组件内的功能分配。分散功能,使各个组件的复杂度大大降低。通用性原理应用可以提高间接性,降低内部差异。连接器的通用性就产生了中间件。
- 可修改性:对应用程序体系结构进行更改的难易程度。可细分为:可进化性、可扩展性、可定制性、可配置性、可重用性
- 可进化性:表示在不负面影响其他组件的情况下可以更改组件实现。组件的静态演化通常取决于实现对架构的抽象执行程度。用于分布式系统中部分故障条件中恢复的技术,可用于支持动态演化
- 可扩展性:向系统添加功能的能力。可以将功能添加到已部署的系统中,不影响系统其余部分,减少组件质检的耦合,例如基于时间的集成
- 可定制性:暂时专门化架构元素的行为能力
- 可配置性:指组件部署后修改组件所需的配置,以使它能够使用新的服务或数据类型。例如管道过滤器样式和按需编码样式,分别可以实现配置和组件的可配置性
- 可重用性:组件、连接器、数据元素能够在其他应用程序中未经修改地重用,则它是应用程序体系结构的属性
-
可见性:样式可以通过通用性限制或提供对监视的访问,从而影响基于网络的应用程序中交互的可见性
-
便携性:如果软件在不同环境中运行,则它是可移植的
- 可靠性:组件、连接器、数据中存在部分故障的情况下,体系结构在系统级别上容易遭受故障的程度。避免单点故障,启动冗余,允许监视(将故障范围缩小为可恢复的操作),来提高可靠性
4. 基于网络的架构风格
- 构建软件不是为了创建特定的交互拓扑或使用特定的组件类型,而是创建一个满足或超过应用程序需求的系统
- 以下介绍一些样式
数据流样式
(1)管道和过滤器PF Pipe & Filter
- 每个过滤器组件读取其输入上的数据流并在其输出上生成数据流 –>单向数据流网络
- 约束条件:一个过滤器必须完全独立于其他过滤器(零耦合),不得与上下游接口上的其他过滤器共享状态、控制线程、标识
- PF优点:1.设计简单(整体输入/输出为单个过滤器行为);2.可重用,允许重用;3.可扩展性,可轻松维护和增强 4.可验证性,可进行某些类型的专门分析 5.用户感知的性能,允许并发
- PF缺点:1. 批处理,无法进行交互,2. 无法感知特定的输入输出流 3.如果问题不适合数据流模式,则会降低用户感知的性能
(2)统一的管道和过滤器UPF Uniform Pipe & Filter
-
比PF 增加:所有过滤器必须具有相同的接口约束
-
缺点: 需要将数据转换为自然格式,再将自然格式转换为数据,降低网络性能
复制样式
(3)复制存储库RR Replicated Repository
-
基于复制的存储库样式:通过多个进程提供相同的服务来提高数据的可访问性和服务的可伸缩性,分散的服务器进行交互,给用户提供一种集中式服务的错觉,例如分布式文件系统、远程控制版本系统
- RR优点:1. 减少正常请求的延迟 2. 服务故障的时候进行断开连接操作
- 缺点: 一致性问题
(4)缓存 $
- 缓存:复制单个请求的结果,以便后面的请求可以重用它
- 延迟,用户感知的性能
分层样式
(5)客户端-服务器CS Client Server
- CS是基于玩过的应用程序最常见的体系结构样式。提供一组服务的服务器组件,监听这些服务的请求,需要执行服务的客户端通过连接器向服务端发送请求,服务端可拒绝或者响应请求,将响应发送回客户端。
-
客户端是一个触发式过程,服务端是一个反应式过程
- 关注点分离是CS约束背后的原理,可以提升伸缩性
(6)分层系统LS Layered System & 分层客户端服务器LCS Layered Client Server
-
分层系统是分层组织的,是向上提供服务,向下使用服务,在基于网络的系统中仅限于CS/LCS
-
优点:减少跨层耦合,提高可扩展性和可重用性,例如TCP/IP分层通信协议,硬件接口岑等
-
缺点:增加了数据处理的开销和延迟,降低了用户感知的性能
-
LCS也被称为两层、三层或多层体系结构
-
LCS还是大型分布式系统中用于管理身份的解决方案
(7)客户端无状态服务器CSS Client Stateless Server
-
CSS是由CS派生而来,附加约束是服务器组件上不允许会话状态,不能利用服务器上存储的任何上下文
-
优点:改善了可见性、可靠性和可伸缩性的属性
-
缺点: 可能会通过在请求中增加重复数据来降低网络的性能
(8)客户端缓存无状态服务器C$SS Client Cache Stateless Server
-
通过从CSS添加缓存组件派生而来,高速缓存充当客户端和服务端之间的中介
-
优点: 提升效率 & 用户感知的性能
(9)分层客户端缓存无状态服务器LC$SS Layered Client Cache Stateless Server
-
LC$SS 是通过LCS & C$SS 添加代理/网关组件派生而来的,例如域名DNS系统
-
优缺点就是LCS C$SS优缺点的组合
(10)远程会话RS Remote Session
-
是CS的一种变体,试图最小化客户端组件,每个客户端开启一个会话,应用程序状态完全保留在服务器上,当用户希望使用客户端或者模仿通用哭护短的接口形式访问远程服务时,通常使用了此种形式
-
优点:集中维护接口,减少功能扩展不一致的担忧
-
缺点:服务端存储应用程序状态,降低了可伸缩性,降低了交互可见性
远程数据访问RDA Remote Data Access
-
RDA 是CS的一种变体,可在客户端和服务端质检分布应用程序状态,例如数据库访问的DeskTop工具
-
优点:减少网络传输,提升效率,使用标准查询语句提升可见性
-
缺点:客户端需要理解与服务端实现相同的数据操作概念,缺乏了简单性,在服务器端存储上下文,会降低可伸缩性,部分工作空间的故障会降低可靠性,事务机制(两阶段提交)虽然能够提升可靠性,但增加了复杂性和交互开销
移动代码样式
- 使用移动性来动态更改处理与数据源或结果之间的距离
- 引入位置概念,可以在设计级别对组件之间的交互成本进行建模,通过更改位置,可以改善组件之间交互的接近度和质量,从而降低交互成本,提升效率和用户感知性能
(11)虚拟机VM Vitual Machine
-
在受控的环境中,以某种方式执行代码,以满足安全性和可靠性的要求,就是虚拟机能够提供的
-
平台与指令的分离,提升了可移植性和可扩展性,降低了可见性和简单性
(12)远程评估REV Remote Evaluation
- 由VM派生的