软件体系结构

林荣恒,吴步丹,金芝
21 阅读 0 点赞 2026-06-05 IT 老游的虾
软件工程体系结构架构设计计算机科学高校教材

《软件体系结构》由北京邮电大学林荣恒等编著,人民邮电出版社2016年出版。本书系统介绍了软件体系结构的基本概念、经典与现代体系结构风格、质量属性及战术、体系结构分析与设计方法等内容。采用大量实际案例帮助读者深入理解,可作为计算机软件专业本科生、研究生及软件工程硕士的教材,也可作为系统架构设计师培训和开发人员的参考书。

本书速读

📖 本书核心内容

《软件体系结构》由北京邮电大学林荣恒副教授等编著,是一本面向计算机科学和软件工程专业的高校教材。全书共九章,从软件危机的历史背景出发,系统讲解了软件体系结构的基本概念、经典与现代体系结构风格、质量属性及其战术、体系结构分析与设计方法,以及架构描述语言。

软件体系结构是软件工程领域的高阶课程,关注的是软件系统的整体组织方式:组件如何划分、组件之间如何交互、如何保证系统满足性能、可用性、安全性等质量要求。本书采用大量实际工程案例和代码示例,帮助读者将抽象的架构概念与具体实践结合起来。

全书最大的特点是案例丰富,从瑞典船项目失败到集团通信业务系统问题,从 Log4J 工程分析到 IMSDroid 工程分析,贯穿始终的例子让理论落地。本书适合作为研究生教材和系统架构设计师考试的参考书。

🏗️ 从软件危机到体系结构:为什么需要关注架构

软件体系结构并非凭空产生,它是对软件危机的回应。二十世纪六十年代,随着计算机应用规模的扩大,软件开发面临成本超支、进度延误、质量低劣等严重问题,这就是著名的软件危机。

软件危机的根源:软件复杂度随规模呈指数增长,缺乏系统化的方法论来管理大型软件的复杂性。早期的编程以代码为中心,忽视了整体结构设计。

软件工程的兴起:1968年北约会议首次提出软件工程概念,将工程化的方法引入软件开发,强调需求分析、设计、编码、测试的系统化流程。

体系结构层次的觉醒:软件工程发展表明,仅关注算法和数据结构不足以解决大型系统的复杂性。必须在更高层次上考虑系统的整体组织,这就是软件体系结构产生的历史必然。

失败案例的教训:书中以瑞典船项目、集团通信业务系统、邮政信息管理系统等真实失败案例,揭示了忽视体系结构设计带来的灾难性后果:项目失败、成本失控、无法维护。

理解这些历史背景,是认识软件体系结构重要性的第一步。

🧩 什么是软件体系结构:基本概念与建模方法

软件体系结构的核心定义:软件体系结构等于组件加连接件加约束。组件是系统的主要计算单元或数据存储单元,连接件是组件之间交互的机制,约束是组件和连接件必须遵循的规则。

体系结构与详细设计的区别:体系结构关注系统的高层组织,是大图景层面的决策;详细设计关注模块内部的实现细节。体系结构决策一旦确定,后期修改成本极高。

四加一视图模型:Kruchten 提出的经典架构描述方法,从五个视角描述系统:逻辑视图、开发视图、进程视图、物理视图、场景视图。

逻辑视图:描述系统为用户提供哪些功能服务,关注功能需求的满足,通常用类图和对象图表示。

开发视图:描述软件模块的组织方式,关注程序包管理和编译依赖,指导开发团队的分工协作。

进程视图:描述系统的并发和分布特性,关注进程、线程的划分和通信机制。

物理视图:描述软件到硬件的映射关系,关注系统部署的物理拓扑结构。

场景视图:用具体的用例场景将以上四个视图串联起来,验证架构设计的正确性。

掌握四加一视图,是进行软件体系结构建模的基本功。

🎨 软件体系结构风格:从经典到现代的架构模式

体系结构风格是对常见架构模式的抽象和分类。掌握各种风格的适用场景和优缺点,是架构师的核心能力。

管道过滤器风格:数据依次经过多个处理阶段,每个阶段的输出是下一阶段的输入。典型应用包括编译器前端和 UNIX shell 管道命令。优点是组件可复用、可并行处理,缺点是不适合交互式应用。

调用返回风格:通过过程调用实现组件间交互,包括主程序子程序、面向对象、层次结构等变体。这是最常见的编程范式。

分层风格:系统组织为若干层次,每层为上层提供服务并使用下层服务。典型应用是 OSI 七层网络模型和 TCP/IP 协议栈。优点是关注点分离、层间独立,缺点是可能产生性能损耗。

共享数据风格:多个组件通过共享数据存储进行交互,包括仓库风格和黑板风格。典型应用是数据库系统和专家系统。

C/S 与 B/S 模式:客户机和服务器以及浏览器和服务器是两种最广泛应用的分布式架构。C/S 需要安装客户端,B/S 通过浏览器访问,各有优劣。

消息总线架构:通过消息中间件实现组件间松耦合通信,典型应用是企业集成总线和消息队列系统。

SOA 面向服务架构:将系统功能封装为可重用的服务,通过标准协议进行通信,强调服务的独立性、可发现性和可组合性。

REST 架构:基于 HTTP 协议的资源表述状态转移,强调无状态、统一接口、资源导向。是当前互联网 API 设计的主流风格。

选择何种架构风格,取决于系统的需求特征:数据密集型适合管道过滤器,交互密集型适合调用返回,分布式系统适合 SOA 或 REST。

📊 质量属性解剖:决定软件品质的九大维度

质量属性是衡量软件系统好不好的非功能特性。与功能需求不同,质量属性关注的是系统如何工作而非做什么。

性能:系统响应请求的速度和吞吐量。战术包括资源需求优化、资源管理、资源仲裁。

可用性:系统正常运行时间的比例,通常用几个九衡量。战术包括错误检测、错误恢复、错误预防。

可修改性:系统接受变更的容易程度。战术包括局部化修改、防止连锁反应、推迟绑定时间。

安全性:防止未授权访问和数据泄露的能力。涉及身份认证、授权管理、数据加密、审计追踪等机制。

可测试性:验证系统正确性的容易程度。关键因素包括可观察性和可控制性。

易用性:用户使用系统的便利程度。涉及界面设计、操作流程、学习成本等方面。

可移植性:系统在不同平台间迁移的能力。

可复用性:系统组件在其他项目中重用的可能性。

可集成性:系统与其他系统集成的能力。

质量属性之间往往存在权衡关系,架构师需要根据优先级做出取舍。例如提高安全性可能降低性能,增强可修改性可能增加复杂度。

🎯 质量属性战术:实现品质的技术手段

质量属性战术是实现特定质量目标的具体技术手段。本书按属性分类详细讲解了各类战术。

性能战术之资源需求:减少事件流、优化算法复杂度、减少计算量、选择合适的数据结构,从源头降低资源消耗。

性能战术之资源管理:引入缓存减少重复计算、控制并发连接数、合理分配内存和线程池,提高资源利用率。

性能战术之资源仲裁:先进先出调度、优先级队列、固定优先级调度,在多个请求竞争资源时做出合理决策。

可用性战术之错误检测:心跳信号检测组件存活、异常捕获处理、冗余组件交叉检查,第一时间发现问题。

可用性战术之错误恢复:检查点保存系统状态、活动备用组件切换、投票机制选择正确输出,确保故障后快速恢复。

可用性战术之错误预防:从服务中主动移除可能出错的组件、预测性监控指标,防患于未然。

可修改性战术之局部化修改:语义一致的修改集中在同一模块、高内聚降低模块间耦合、使用中间层隔离变化。

可修改性战术之防止连锁反应:信息隐藏隐藏内部实现细节、接口隔离限制影响范围、限制通信路径减少依赖。

可修改性战术之推迟绑定时间:配置文件外部化、运行时注册机制、参数化模块行为,使变更不需要修改代码。

🔧 分析与设计软件体系结构:从理论到实践

体系结构分析是理解现有系统架构的过程。书中以 Log4J 日志框架和 IMSDroid 移动应用为案例,演示了如何分析一个开源项目的架构设计。

Log4J 工程分析:Log4J 采用了管道过滤器风格,日志事件依次经过 Logger、Appender、Layout 等组件处理,同时采用分层风格分离核心 API 与具体输出实现。

IMSDroid 工程分析:作为即时通讯应用的 Android 实现,采用了典型的分层架构和观察者模式实现事件驱动。

ADD 方法核心思想:从质量属性需求出发,逐步分解架构。首先识别系统最重要的质量属性需求,然后选择满足这些需求的架构风格和战术,接着实例化架构元素并分配职责,最后验证设计是否满足需求并迭代。

ADD 与 RUP 的关系:RUP 是经典的软件开发流程,ADD 可以在 RUP 的架构设计阶段使用,二者互补而非替代。

掌握 ADD 方法,能够系统性地设计出满足质量需求的软件架构。

📝 架构描述语言:形式化表达架构设计

架构描述语言是用于形式化描述软件体系结构的专用语言。书中介绍了两种代表性架构描述语言。

ACME:由卡内基梅隆大学开发的通用架构描述语言,支持组件、连接件、系统等核心概念的声明式描述,可用于不同架构工具之间的交互。

Wright:同样来自卡内基梅隆大学,侧重于使用通信顺序进程形式化描述组件之间的交互协议,支持对架构行为进行形式化验证。

虽然架构描述语言在实际工程中使用较少,但学习它们有助于深入理解架构的形式化表达方法。

⭐ 金句摘录

软件体系结构等于组件加连接件加约束。这是理解一切架构的起点。

质量属性之间的权衡是架构设计的核心挑战,没有完美的架构,只有最适合的架构。

架构决策一旦确定,后期修改成本极高。因此在设计阶段必须充分论证和验证。

好的架构不是设计出来的,而是演化出来的。但演化需要方向,这就是架构师的价值。

📚 阅读建议

本书适合作为计算机科学和软件工程专业高年级本科生或研究生的教材,也适合准备系统架构设计师考试的工程师参考阅读。

建议阅读方法:重点关注书中案例,理解每个例子背后的架构决策和权衡。习题部分应认真完成,尤其是四加一视图建模和质量属性战术的应用题。

阅读本书前,建议先具备软件工程、设计模式、操作系统等基础知识,这样能更好地理解架构层面的抽象概念。