前言
谈到架构设计,大家想到的就是高大上之类的,因为架构师很重要,且工资一般都很高,所以理所当然的认为架构设计很难,只有那些NB的公司中的人才能做。
以前我也有这种先入为主的思想,因而对架构设计望而生畏。不过我们要放正心态,,其实架构设计没有那么困难,我们以前或多或少已经设计了属于自己的软件架构了,只是你还不太清楚什么是软件架构。
什么是架构设计
简单一点,软件架构设计就是一个系统的草图,描述了构成系统的抽象组件,以及各个组件之间的是如何进行通讯的,这些组件在实现过程中可以被细化为实际的组件比如类或者对象。在面向对象领域中,组件之间的联通通常面向于接口实现的。
在“软件架构简介”中David Garlan 和Mary Shaw 认为软件架构师有关如下问题进行设计的:“计算的算法和数据结构之外,设计并确定系统整体结构,结构问题包括总体组织结构和全局控制结构;通信、同步和数据访问的协议;设计元素功能分配;物理分布;设计元素的组成;定标与性能;备选设计的选择。”
架构和结构会难以区分,明确一点架构不是结构,IEEE把架构定义为“系统在其环境中的最高层概念”架构还包括系统完整性、经济约束条件、审美需求和样式等。在Rational Unified Process 中对软件架构的解释:软件架构指系统重要构建的组织或结构,这些重要的构建通过接口与其他构建进行交互。
总体来说软件架构对软件从整体到部分的描述,从开发到运行再到后期扩展的描述,从性能和安全可靠性进行描述。
架构设计为了解决什么问题
开发之初逻辑设计阶段要确定系统如何开发,整个系统融合为一个系统开发还是从业务角度将系统拆分为几个独立的子系统。
在即将进入开发的时候关注了数据是如何持久化的,以及数据库选型、以及非数据库文件的存储格式,等这些存储方案的确定。
在开发过程中我们要关注如何保证开发质量,如何分层,代码可扩展性,使用的设计模式,依赖了那些框架,开发语言这些方向的确定。
开发完成之后进入运行阶段,如何在架构设计的时候保证运行期间的质量属性、性能、可伸展性等,主要是系统运行进程的划分,以及进程之间通过线程来通信。
同时如果系统并非是单机运行,还需考虑系统的物理部署,系统部署在那个服务器上,这些服务器配置性能怎样能否胜任系统的运行,操作系统选型,以及系统部署的网络拓扑图,还有就是保证数据安全的数据备份怎样设计的。
以上五个问题是从五个角度来确定架构以及架构设计需要解决的问题。
架构设计的五视图
1)物理架构
2)运行架构
运行架构的目的是确定控制流和控制流的组织;其中控制流包括进程、线程、服务程序;控制流组织包括系统的启动与停机、控制流通讯、同步与加锁。
3)开发架构
开发架构的目的是确定程序单元以及程序单元的组织结构;其中程序单元包括源文件、配置文件、程序库、框架、目标单元;程序单元组织包括project划分、project目录结构、编译依赖关系。
4)逻辑架构
逻辑架构的目的是职责的划分,并明确其与协作关系;其中职责的划分注意逻辑的分层、子系统以及关键类的定义;协作的定义关注接口的定义与协作关系的明确。
5)数据模型
数据架构的目的是确定要存储的数据以及存储格式;其中存储的数据可以是文件、关系数据库、实时数据库;存储格式包括文件格式、数据库图表。