软考-系统架构设计师 软件架构概念详细讲解
个人博客:blogs.wurp.top
一、软件架构的定义与核心内涵
软件架构没有一个唯一的定义,但所有权威定义都围绕一个中心思想:架构是关于“什么”和“为什么”,而不是“如何”。 它描述的是系统的重大设计决策和总体结构。
1. 经典定义
- Perry和Wolf的定义 (1992):软件架构 = {元素, 形式, rationale}
- 元素:处理、数据、连接件。
- 形式:元素之间的关系和约束。
- 理性/依据:为什么这样设计,其背后的决策依据。
- Bass, Clements, Kazman的定义 (《软件架构实践》):一个或一系列结构,包含软件元素、这些元素的外部可见属性以及它们之间的关系。
- “外部可见属性” 是指其他元素对该元素所做的假设,如它提供什么服务、性能特征、错误处理、共享资源的使用等。
2. 通俗理解:建筑的比喻
- 需求:业主想要一栋房子(功能),要求坚固、美观、采光好(质量)。
- 建筑蓝图(架构):定义了房子的整体结构(是别墅还是公寓?)、核心组件(承重墙、梁柱的位置)、组件关系(水电管线如何布局)以及设计 rationale(为什么用钢筋混凝土结构?为了坚固和实现大空间)。
- 施工(编码):按照蓝图进行砌砖、布线等具体实施。
核心思想:架构是系统的高层抽象,它忽略了实现细节,聚焦于那些难以改变的决策。一旦架构确定,改变其核心结构的代价将非常高昂。
二、软件架构的组成要素(核心抽象)
架构的本质是由以下几个核心要素构成的:
-
组件 (Component)
- 定义:系统中具有一定功能、可替换的物理或逻辑单元。
- 形态:可以是模块、类、对象、一组函数、一个微服务、一个子系统等。
- 特点:封装了其内部实现,通过接口对外提供服务。
-
连接件 (Connector)
- 定义:用于实现组件之间交互的机制。
- 形态:不仅仅是简单的调用。可以是同步调用(如函数调用)、异步消息(如消息队列)、事件、管道、数据库连接、HTTP API等。
- 重要性:系统的复杂性和特性(如性能、可靠性)很大程度上由连接件决定。
-
环境 (Environment)
- 定义:系统运行所处的上下文。
- 包括:硬件环境(服务器、网络)、软件环境(操作系统、中间件)、外部系统(需要集成的其他系统)以及业务环境(法律法规、行业标准)。
-
架构原则与约束 (Principles & Constraints)
- 定义:指导架构设计和演进的决策依据和规则。
- 包括:设计原则(如高内聚低耦合、单一职责)、技术选型(为什么用Java而不用Go?)、业务约束(必须符合等保三级要求)、非功能需求(性能、安全指标)。
简单来说:架构 = 组件 + 连接件 + 环境 + 原则/约束
三、软件架构为什么如此重要?(架构师的价值体现)
-
理解与管理复杂性
- 通过分解(将大系统拆分为小组件)和抽象(忽略细节,关注高层关系)来管理复杂性。架构是系统的“地图”。
-
支撑非功能需求 (质量属性)
- 架构设计直接决定了系统能否满足性能、安全性、可靠性、可扩展性、可维护性等质量属性。例如,引入缓存组件来提升性能,引入API网关来增强安全。
-
促进沟通与协作
- 架构为项目经理、开发人员、测试人员、客户等所有利益相关者提供了一个共同的抽象和语言,用于讨论系统、评估影响和达成共识。
-
指导开发与实现
- 架构是系统设计的蓝图,它约束了后续的详细设计和编码,确保系统被正确构建。
-
支持早期决策与风险控制
- 在项目早期做出关于技术选型、集成策略等重大决策,并识别技术风险(如某项新技术是否可行),避免在项目后期付出高昂代价。
-
作为可复用的资产
- 一个优秀的架构可以被复用到多个类似系统中,沉淀为组织的核心资产,提升整体开发效率和质量。
四、软件架构的视图模型(从不同角度看架构)
一个复杂的系统无法用一张图描述清楚,因此需要用多视图模型来分别描述架构的不同方面。最经典的是4+1视图模型。
视图 | 受众 | 描述内容 | 核心模型 |
---|---|---|---|
逻辑视图 | 分析人员、设计人员 | 系统的功能需求,即系统应向用户提供什么服务。 | 类图、对象图、状态图 |
开发视图 | 开发人员、项目经理 | 在开发环境中软件的静态组织结构(模块、库、依赖)。 | 组件图、包图 |
进程视图 | 系统集成人员、性能优化人员 | 系统的运行时行为,涉及进程、线程、并发、同步、通信。 | 序列图、活动图、通信图 |
物理视图 | 系统工程师、运维人员 | 软件如何映射到硬件上,反映系统的分布式、部署和通信拓扑。 | 部署图 |
场景 | 所有利益相关者 | 用一组重要场景(用例)将其他视图串联起来,验证和说明架构。 | 用例图、用例描述 |
架构师职责:需要创建和维护这一组视图,以确保对系统有一个完整且一致的理解。
五、常见的软件架构风格(架构模式)
架构风格是可复用的、粗粒度的解决方案模板,它规定了组件的类型和连接方式。选择架构风格是架构师最重要的决策之一。
- 分层架构:将系统划分为若干层,每层为其上层提供服务,并作为其下层的客户。如:表现层、业务逻辑层、数据访问层。
- 客户端-服务器架构:资源或服务由服务器提供,多个客户端向服务器请求服务。
- 管道-过滤器架构:将系统任务分解为一系列依次处理数据的处理单元(过滤器),通过管道连接。适用于数据处理系统。
- 事件驱动架构:组件通过发布/订阅事件进行异步通信,实现高度解耦。适用于需要高响应性和松耦合的UI和分布式系统。
- 微内核架构(插件架构):有一个核心(微内核),提供系统最基本的功能,其他功能以插件形式动态加载。如Eclipse、操作系统内核。
- 微服务架构:当前主流。将单一应用程序划分成一组小的、自治的、围绕业务能力构建的服务。每个服务运行在自己的进程中,通过轻量级的通信机制(如HTTP API)协作。
六、软件架构的设计过程
架构设计不是一个线性的步骤,而是一个迭代、增量、探索性的过程。
- 架构需求分析:识别利益相关者,明确功能需求和关键的非功能需求(质量属性),并对其进行量化(如响应时间<200ms)。
- 架构设计:
- 选择架构风格。
- 分解系统,识别核心组件和连接件。
- 分配功能到组件。
- 架构文档化:使用多视图模型和标准语言(如UML)将架构决策记录下来。
- 架构评审与验证:通过架构评审、原型验证(如搭建技术原型验证性能)、基于场景的评估方法(如ATAM) 来评估架构是否满足需求。
- 架构实现与演化:在开发过程中维护架构的完整性,并根据需求变化对架构进行演进。
七、软考考点总结与应用
-
选择题:
- 直接考查软件架构的定义和核心组成要素(组件、连接件)。
- 考查架构的重要性/意义。
- 考查4+1视图模型中各个视图的作用和受众。
- 考查常见架构风格的定义、特点和区别。
-
案例分析题:
- 给出一个系统需求描述,要求:
- 问题1:设计其软件架构,并说明选择了何种架构风格及其理由。
- 问题2:画出核心的架构图(如部署图、组件图)。
- 问题3:分析该架构如何满足关键的非功能需求(如高可用、高性能)。
- 问题4:分析该架构可能存在的风险和挑战。
- 给出一个系统需求描述,要求:
-
论文题:
- 可能围绕“论软件架构风格的选择与应用”、“非功能需求与软件架构设计”、“软件架构的演化和维护”等主题。
- 写作时,必须清晰地阐述:
- 你的架构决策是什么(选择了什么风格,如何分解系统)。
- 你的决策依据(Rationale),特别是如何通过架构设计来满足非功能需求。
- 你如何通过多视图来描述你的架构。
- 你在架构演进和治理过程中的经验和教训。
总结:架构师的核心思维
对于软考架构师,理解软件架构概念的关键在于培养以下思维:
- 抽象与分解思维:从宏观视角把握系统,忽略细节。
- 权衡与决策思维:没有完美的架构,只有权衡利弊后最适合的架构。
- 系统与全局思维:考虑所有组件、连接件以及它们与环境的关系。
- 演进与迭代思维:架构不是一成不变的,需要随着业务和技术的发展而演进。