一、 架构是什么
通常关于架构的第一个问题是架构是什么,很自然也很正常,本文也不能免俗。然而关于这个问题却没有一致性答案,同时也要注意到不同应用的架构实质上存在不同差异性。
(一) 架构的定义
架构,虽然人们一直在讨论它,甚至于每天都在同其工作,然而这个词并没有一个被业界广泛认可的定义。
大致而言,架构的定义分为三类:
类别 | 定义 |
结构论 | 牛津高阶词典: The design an structure of a computer system |
韦氏大辞典: The way in which the parts of a computer are organized | |
IEEE: The fundamental organisation of a system embodied in its components, their relationships to each other, and to the environment,and the principle guiding its design and evolution | |
关键论 | 架构是系统中最关键的20%,关注在系统非功能性需求 |
文化论 | 架构是关于系统一些的决策 |
(二) 架构的分类
架构由于应用的不同而存在不同。大体而言,我们可以将当前的应用分为如下四种:互联网应用、企业应用、桌面/移动应用和游戏。
需要一提的是,虽然几种应用的存在一定的模糊性,某种技术为多种应用所共用,例如很多的企业应用基于互联网技术SaaS,以及移动设备的支持。但依然存在很大的不同。
特别的,对于企业架构,大体存在如下几种流派:
1. TOGAF, OpenGroup组织提出,围绕业务、应用、技术和数据四个方面描述架构;
2. DoDAF/MoDAF,美国和英国国防部提出的架构方案;
3. Zachman Framework, 根据不同角色的5W1H来审视架构;
4. 4+1视图,由Philippe Kruchten提出,并被RUP采纳;
(三) 架构的关键非功能指标
通常来讲,架构所关注的非功能需求可以分为三个角度5个特性,如下:
角度 | 特性 | 说明 |
运营角度 | 伸缩性 | 主要为水平扩展能力 |
可靠性 | 包括容错性、可用性和安全性等; | |
开发角度 | 维护性 | |
扩展性 | 能否快速应对业务的变化 | |
应用角度 | 易用性 | 对最终用户是否友好 |
非功能性指标当然不止这些,如下是一些参考:
1. ISO 9126提出的质量特性:
2. 或者通过如下三个视图来进行:
i. 业务视角
Time To Market、Cost and Benefits、Projected life time、Targeted Market、Integration with Legacy System、Roll back Schedule
ii. 最终用户视角
Performance、Availability、Usability、Security
iii. 开发视角
Maintainability、Portability、Reusability、Testability
3. 也可以通过诸如:简洁性、清晰和一致性等指标。
不同类型的应用关注点会有很大不同,例如:互联网应用由于面临大量的最终用户,会特别关注于伸缩性、可靠性和易用性,这并不是说互联网应用不关注维护性和扩展性,只是会更加强调另外三个特性;而企业应用由于关注于数据、流程以及业务的适应性,会更多得强调维护性和扩展性,而其他特性如易用性相对弱化(面对内部用户,强制使用),伸缩性(内部用户访问量少,大部分情况下通过现有硬件即可支持)。同时,企业应用对数据一致性和准确性要求非常高,而互联网应用相对可以容忍一定的不一致性和错误。因此,一个企业应用的架构师可能无法设计互联网应用的架构。
二、 架构有什么
架构有什么,通常会来一张或者一堆好看的图画。既然本篇不讨论具体应用,故而也拿不出啥图了,也不想讨论这些。因为不同的应用存在的差异,非本文所能涵盖。这里就想讨论下形形色色架构图的背后的内容,以及隶属架构但未在架构图表达的内容。
《易经·系辞》有云:“形而上者谓之道,形而下者谓之器”,将架构分为“形而上”和“形而下”两个部分,如下图:
(一) 形而上
形而上体系中,除去前置内容,分为文化和支撑两大块。
其中,文化部分里最重要的就是原则和方法论,例如:关注点分离原则(SoC),面向对象分析设计和领域驱动设计等等。在此之下,就是架构模式和算法,常见架构模式为:结构化(分层、管道流、黑板)、分布式(代理和管道流)、交互系统(MVC和PAC)和适配系统(微内核、元数据)。当然还有更低一层次的设计模式(创建、结构和行为)。
(二) 形而下
形而下分为三个部分,运行时、工具和文档。
其中,运行时的内容按照重要性依次为:语言、平台/中间件、框架、类库和工具,具体在企业应用中就是:Java/C#、Windows/Linux、Application Server/Database、Spring/Hibernate等等。
如果说运行时决定最终能力,则工具就事关效率。工具中最常见的是集成开发环境了,此外还有配置、部署和测试工具。
文档部分是另一个重要的内容,应包括:视图(从不同角色出发,可以参考4+1),范例和各种指导参考文档。
三、 架构如何设计
如果把“形而下”当成架构设计的产出,那么架构设计往前追溯,就有输入和加工过程。
(一) 架构的输入
架构的输入包括三个部分:目标、需求和相应约束。其中:目标是大方向内容,需求关注在细节,而约束对目标的达成提供了限定。特别的,关注在非功能性指标上。
(二) 架构的设计过程
架构的设计从需求分析开始,结合参考模型或者已有架构体系,结合原则、方法论等等作料。其主要活动有:技术选型、脚手架/框架/平台搭建等等。
关于具体过程的描述,可见《如何定义和建立架构》。
四、 架构如何评估
架构设计出后一个重要的工作是对架构(形而下部分)进行评估,进行架构评估的必要性在:使得架构设计工作形成闭环,确保当前架构是合适和正确的。
大体上,架构评估有三种方法:
· ATAM: Architecture Tradeoff Analysis Method
· SAAM: Software Architecture Analysis Method
· ARID: Active Reviews for Intermediate Designs
在进行架构评估工作时,首先要确定架构评估的参与人,包括相应的干系人和独立的评估队伍;然后是确定评估的时机:早期(在架构设计期间就参与评估)和晚期(传动的,在架构设计完成后)。
评估内容包括如下:
1. 首先是要满足其输入:目标、需求和约束;
2. 各项的非功能性指标;
五、 小结
以如下思维导图作为本文的小结: