什么是软件架构设计
依稀记得公司的软件架构培训材料中说到软件架构=组件+交互。最近读温昱的《软件架构设计》才知道这只是其中一大阵营的观点。而软件架构在定义上分为“组成派”
和“决策派”
两大阵营。“组成派”认为软件架构是将系统描述成计算组件及组件之间的交互;而“决策派”认为软件架构包含了一系列的决策。事实上,从我司实际操作来看,两种观点并不是互斥的,而是相辅相成。两种观点只是站在不同的角度来看待软件架构。架构师在分割组件模块时,选择备选方案时,也是会不得不去作出各种决策,架构没有最完美的,只有在特定场景需求下最合适的。
“组成派”的两个明显的特点:
- 关注架构实践的客体——软件,以软件本身作为描述对象。
- 分析了软件的组成,说明软件不是一个‘原子’意义上的整体,而是有不同的部分经过特定的接口进行连接组成的一个整体,这对软件开发来说很重要。
“决策派”的两个明显的特点:
- 关注软件架构中的实体——人,以人的决策为描述对象。
- 归纳了软件架构决策的类型,指出架构决策不仅包括关于软件系统的组织、元素、子系统和架构风格等几类决策,还包括关于众多非功能性需求的决策。
按照“组成派”的观点,软件架构关注的是软件整体的分割和交互,之所以分割,是因为不同的部分在逻辑或物理上相对独立,通过“分而治之”的原则进行分割可以更好的理解整个系统,把握用户的需求,但是虽然整个软件可以分割成多个模块或子系统,但是模块和子系统之间的通信和交互也是很重要的。按照这种观点,架构师的主要任务是将软件分割成不同的模块,并定义模块之间的接口。
按照“决策派”的观点,软件是一个在很多限制下产生的产品,这些限制包括用户和技术两方面,用户方面包括功能需求、性能需求、硬件需求等,技术方面包括技术选择、可扩展性、可重用性、可维护性等。按照这中观点,架构师的主要任务就是作出上述个各种限制作出选择或决策,是一系列的有层次的决策。
软件架构设计的质量属性
按照“决策派”的观点,软件架构并不仅仅关注软件本身的结构和行为,还注重其他特性:使用、功能性、性能、弹性、重用、可理解、经济以及技术的限制和权衡等。
软件架构设计中需要考虑软件的质量属性,也是上述所说需要权衡与决策的。质量属性可归类为三类:
- 软件系统本身的质量属性:可用性,可维护性,高性能,安全性,可测试性,易用性。
- 软件系统的商用属性:上市时间,成本与收益,目标市场,生命周期,系统生态。
- 架构本身的质量属性:概念完整性,正确性,可理解性,可构建性。
如何描述质量属性需求呢?一般采用质量属性场景作为一种规范。 质量属性场景是一种面向特定的质量属性的需求。它由六部分组成:
- 刺激源:这是某个生成该刺激的实体(人、计算机系统或者任何其他刺激器)。
- 刺激:该刺激是当刺激到达系统时需要考虑的条件。
- 环境:该刺激在某些条件内发生。当刺激发生时,系统可能处于过载,或者运行,也可能是其他情况。
- 制品:某个制品被刺激。这可能是整个系统,也可能是系统的一部分。
- 响应:该响应是在刺激到达后所采取的行动。
- 响应度量:当响应发生时,应当能够以某种方式对其进行度量,以对需求进行测试。
软件架构设计的原则
- 全面解耦合原则:对业务进行抽象建模,业务数据与业务逻辑解耦,软件件与硬件解耦,平台与产品解耦,系统各部件之间解耦。
- 服务化、组件化原则:以服务,数据为中心,构建服务化,组件化的架构,具备灵活,按需组合的能力。
- 隔离与自治原则:通过接口隐藏服务、组件的实现细节,服务与组件之间只能基于接口交互,接口契约化、标准化。跨版本兼容;服务、组件可独立发展,独立发布,独立升级。服务自治,可视,可管,可控,可测,可维,故障自愈。
- 弹性伸缩原则:构建全分布式云化架构,或借鉴云化架构思想,每个服务具备横向扩展能务,支持按需使用、自动弹性伸缩,可动态替换,灵活部署,支持高性能、高吞吐量、高并发,高可用业务场景。
- 安全可靠原则:构建最小的权限、纵深防御、最小公共化、权限分享、不轻信、开放设计、完全仲裁、失效安全、保护薄弱环节、安全机制经济性、用户接受度以及加强隐私保护的安全体系,确保系统、网络、数据的机密性,完整性、可用性、可追溯。业务系统零故障为导向,按需构建分层分级的可靠性,通过故障的预测、预防、快速恢复,避免故障的发生。
- 高效开发原则:创建支持迭代、增量、持续交付的架构,支持部件可独立开发,自动化编译构建、测试、集成验证,并易于高效修改与持续优化;支持开发组织小型化、扁平化,支持小团队独立高效并行开发。
- 持续演进原则:架构并非一蹴而就,需要有效地管理架构需求,持续构建和发展架构,适应业务需求变化,适时引入业界最佳实践,及时重构,确保架构生命力和竞争力。
参考材料:
- 温昱的《软件架构设计》
- 软件体系结构的质量属性
- 华为产品架构设计原则