软件架构设计-五视图方法论

在实际工作中,我们经常听到“架构”和“架构师”这样的名词,并不新鲜,但是总让很多刚入门的 
​​​在实际工作中,我们经常听到“架构”和“架构师”这样的名词,并不新鲜,但是总让很多刚入门的人感觉很神秘,甚至是高深莫测。很少有人对“架构”有全面的了解和认识能并说清楚架构是什么,更谈不上掌握了。事实上,也只有极少数人能成为或者被冠以“架构师”这样的title。为此,笔者总结了对架构的一些理解,希望能够补充很多初入门的人在这方面认识上的不足,纠正一些误解。高手和老鸟就直接跳过吧。

架构的分类
对于“架构”来讲,理论上划分了5种架构视图,分别是:逻辑架构、开发架构、运行架构、物理架构、数据架构。根据名字,大家都可能大概能猜到其侧重点和含义。这里先用通俗的文字简单介绍下,便于大家理解,大家可以不必纠结概念和这些理论。

逻辑架构:逻辑架构关注的是功能,包含用户直接可见的功能,还有系统中隐含的功能。或者更加通俗来描述,逻辑架构更偏向我们日常所理解的“分层”,把一个项目分为“表示层、业务逻辑层、数据访问层”这样经典的“三层架构”。

开发架构:开发架构则更关注程序包,不仅仅是我们自己写的程序,还包括应用程序依赖的SDK、第三方类库、中间价等。尤其是像目前主流的Java、.NET等依靠虚拟机的语言和平台,以及主流的基于数据库的应用,都会比较关注。和逻辑架构有紧密的关联。

运行架构:顾名思义,更关注的是应用程序运行中可能出现的一些问题。例如并发带来的问题,比较常见的“线程同步”问题、死锁问题、对象创建和销毁(生命周期管理)问题等等。开发架构,更关注的是飞机起飞之前的一些准备工作,在静止状态下就能规划好做好的,而运行架构,更多考虑的是飞机起飞之后可能发生的一些问题。

物理架构:物理架构,更关注的系统、网络、服务器等基础设施。例如:如何通过服务器部署和配置网络环境,来实现应用程序的“可伸缩性、高可用性”。或者举一个实际的例子,如何通过设计基础设施的架构,来保障网站能支持同时10W人在线、7*24小时提供服务,当超过10W人或者低于10W人在线时,可以很方便的调整部署架构来支撑。

数据架构:数据架构,更关注的是数据持久化和存储层面的问题,也可能会包括数据的分布、复制、同步等问题。更贴切来讲,如何选择需要的关系型数据库、流行的NOSQL,如何保障数据存储层面的性能、高可用性、灾备等等。很多时候,和物理架构是有紧密联系的,但它更关注数据存储层面的,物理架构更关注整个基础设施部署层面。

上面讲了那么多,相信国内很少有公司是严格按照这五种视图去分工和设计的。其实在笔者眼中,架构大致分为两种:软件架构、系统架构。前三种视图,可以归纳为软件架构,而后两种架构,则归为系统架构。这也比较符合国内大部分中小型互联网公司的现状。

根据应用特性的不同,关注侧重点可能不同。例如,某些门户类的互联网应用,读多写少而且业务相对比较简单,则更加关注“高性能、可伸缩性、可用性”等方面。对于更加复杂的应用,例如电商类大规模交易型的应用,对每个层面和每个环节都会比较关注。对于业务型的系统,例如一些生产型企业使用的ERP,或者仅供企业内部使用的一些MIS、OA应用,通常更关注功能和复杂的业务和实现和扩展,而对性能等方面又可能不要太高,这类应用则更关注纯软件架构层面。这里,不展开做具体讨论。所以很多时候,架构师也需要是一个团队,而不是一个人“全栈”。

架构设计到底是什么
在长期的技术招聘面试中,我发现在很多人眼中,架构就是分层,架构设计就是“三层架构”(或者四层、五层…反正分层越多就说明项目越复杂而且架构就越牛),或许是受到诸如PetShop之类的示例项目的影响,这里暂时不去追究原因了。

之前已经纠正过很多人的误解-架构不只是软件架构。说一下通俗点的理解:

软件架构就是实用而且优雅的设计,它不在于分多少层,或者应用了多少种设计模式/架构模式等。它应该是以满足实现用户需求为前提,以开发人员普遍可接受为根本的,而且要符合系统特性和业务发展需要的,从软件设计的角度,能够达到层次清晰、可维护、可重用、可扩展…就非常优秀了,无需刻意去纠结分了多少层,是否使用了什么模式,有多么抽象等。以面向对象设计为例,基本目标是“高内聚、低耦合”,为此我们可能会遵循一些常见的设计原则(例如经典的SOLID设计原则)。最后纠正一点,通常我们所说的模式,其实又分为很多种,并不是仅仅指的是“设计模式”(设计模式也有千千万,并不是只有常见的GOF 23种设计模式)。通常包括:企业架构模式、设计模式、SOA模式、企业集成模式等等。

强调一下,架构要讲求“实用”,而且开发人员普遍可接受,要符合现状的。否则,再“优雅”的设计,都会沦为高成本的“花架子”,生搬硬套和过度设计只会让项目“流产”。

由于角色和分工不同,软件架构是一个复杂的整体,软件架构工程师不可能在一个视角、一下子讲清楚,而利用多重软件架构视图的方法,可以一次只围绕少数概念和技术展开,分别着重研究软件架构的不同方面,使问题得以清晰公和简化,利于软件架构工程师完成架构设计工作。

因此软件架构的每个视图分别关注不同的方面,针对不同的目标和用途。目前常用架构设计五视图方法进行软件架构描述。它们分别是逻辑架构、开发架构、运行架构、物理架构和数据架构。

逻辑架构的设计着重考虑功能需求,系统应当向用户提供什么样的服务,关注点主要是行为或职责的划分。逻辑架构关注的功能,不仅包括用户可见的功能,还应当包括为实现用户功能而必须提供的辅助功能。逻辑架构的静态方面是抽象职责的划分,动态方面是承担不同职责的逻辑单元之间的交互与协作。

开发架构的设计着重考虑开发期质量属性,关注点是在软件开发环境中软件模块(包)的实际组织方式,具体涉及源程序文件、配置文件、源程序包、编译打包后的目标文件、直接使用的第三方SDK/框架/类库、以及开发的系统将运行于其上的系统软件或中间件。

运行架构的设计着重考虑运行期质量属性,关注点是系统的并发、同步、通信等问题,这势必涉及到进程、线程、对象等运行时概念,以及相关的并发、同步、通信等。运行架构的静态方面关注软件系统运行时的单元结构,动态方面关注运行时单元之间的交互机制。

物理架构的设计着重考虑安装和部署需求,关注点是目标程序及其依赖的运行库和系统软件最终如何安装或部署到物理机器,以及如何部署机器和网络来配合软件系统的可靠性、可伸缩性、持续可用性、性能和安全性等要求。

数据架构的设计着重考虑数据需求,关注点是持久化数据的存储方案,不仅包括实体及实体关系数据存储格式,还可能包括数据传递、数据复制、数据同步等策略。

在运用五视图方法进行架构设计时需要注意两个方面的问题:一是多个架构视图间的同步问题,也就是必须保证不同视图之间是互相解释而不是相互矛盾的;另一个是架构视图的数量问题,原则上是软件系统不涉及某方面的要求时就不需要该方面的视图,严格控制架构视图的数量,但如果有需要,可以引入新的架构视图,从而更加突出和明确地制定和表达特定方面的架构决策,如安全性。

构成每个架构设计视图的元素不同,这些不同的元素撑起不同的思维空间,从而使每个架构视图重点覆盖不同种类的需求,最终所有架构设计视图所表达的语义综合左右一起,就构成了软件架构设计方案。

对于“架构”来讲,理论上划分了5种架构视图,分别是:逻辑架构、开发架构、运行架构、物理架构、数据架构。
在这里插入图片描述

架构视图着重考虑关注点描述方式
逻辑架构1.功能需求——系统应答向用户提供什么样的服务。2.不仅包括用户可见的功能,还包括为实现用户功能而必须提供的“辅助功能模块”行为和职责的划分。分层架构,功能模块或者类图。UML:静态——包图,类图,对象图;动态——序列图,协作图,状态图,活动图。
开发架构1.着重考虑开发环境中模块的实际组织方式 2.包括源程序文件、配置文件、源程序包、编译后的目标文件和第三方库文件等。软件开发环境中软件模块实际组织方式——具体涉及源程序文件,配置文件,源程序包,编译后的目标文件和第三方库文件。UML:包图,类图,组件图
运行架构运行期质量属性——性能,可伸缩性,持续可用性,安全性系统的并发和同步,涉及进程和线程技术。UML:包图类图对象图来说明运行时的关键的概念;序列图,协作图等来描述交互机制。
物理架构安装和部署的需求——包括计算机,网络,硬件设施情况,以及如何部署软件单元如何映射到硬件,以及硬件相关的可靠性,可伸缩性,性能和安全性等。UML:部署图,组件图
数据架构数据需求持久化数据的组织,数据传递,数据复制和数据同步策略。E-R图

一、什么是软件架构5视图

下面内容来自《软件架构设计》一书的第五章:

5视图法可以帮助软件架构师以不同的视角对软件的各个方面的属性:功能需求,约束,运行期质量属性,开发期质量属性。

1、逻辑架构:逻辑架构关注功能,不仅包括用户可见的功能,还包括为实现用户功能而必须提供的“辅助功能模块”——。

2、开发架构:开发架构关注程序包,不仅包括要编写的源程序,还包括可以直接使用的第三方SDK 和现场框架、类库,以及开发的系统将运行于其上的系统软件或中间件。关注编译时刻的静态依赖关系。

3、运行架构:运行架构关注进程、线程、对象等运行时概念,以及相关的并发,同步,通信等问题。运行架构关注运行期间各个单元的交互。

4、物理架构:物理架构关注“目标程序及其依赖的运行库和系统软件”最终如何安装或部署到物理机器,以及如何部署机器和网络来配合软件系统的可靠性,可伸缩性等要求。

5、数据架构:数据架构关注持久化数据的存储方案,不仅包括实体及实体关系的存储格式、还包括数据传递,数据复制,数据同步等策略。

二、示例

逻辑架构

开发架构

运行架构

物理架构

数据架构

三、总结

不同的架构视图代表不同的人对软件内部结构的不同看法,对于架构视图的选择和架构视图的数目,视实际的需要决定,并没有所有的软件在设计的时候都需要这5个视图,也不是只有这5个视图,为了指定的人群所画出来的能让他们看得懂的即是一种新的架构视图。

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书围绕5个主题领域来组织本书的内容:概述、企业应用、系统、最终用户应用和编程语言。本书让最优秀的设计师和架构师来描述他们选择的软件架构,剥开架构的各层,展示他们如何让软件做到实现功能、可靠、易用、高效率、可维护、可移植和优雅。 目录 序 前言 5 第一部分 论架构 第1章 架构概述  13 1.1 简介  13 1.2 创建软件架构  19 1.3 架构结构  23 1.4 好的架构  27 1.5 美丽的架构  28 致谢  30 参考文献  31 第2章 两个系统的故事:现代软件神话  33 2.1 混乱大都市  34 2.2 设计之城  40 2.3 说明什么问题  47 2.4 轮到你了  48 参考文献  48 第二部分 企业级应用架构 第3章 伸缩性架构设计  51 3.1 简介  51 3.2 背景  52 3.3 架构  56 3.4 关于架构的思考  61 第4章 记忆留存  67 4.1 功能和约束  68 4.2 工作流 69 4.3 架构关注点  70 4.4 用户反应  90 4.5 结论  90 参考文献  90 第5章 面向资源的架构:在Web  91 5.1 简介  91 5.2 传统的Web服务  92 5.3 Web  94 5.4 面向资源的架构  99 5.5 数据驱动的应用  102 5.6 应用面向资源的架构  103 5.7 结论  108 第6章 数据增长:Facebook平台的架构  109 6.1 简介  109 6.2 创建一个社会关系Web服务  114 6.3 创建社会关系数据查询服务  121 6.4 创建一个社会关系Web门户:FBML  129 6.5 系统的支持功能  142 6.6 总结  147 第三部分 系统架构 第7章 Xen和虚拟化之美  151 7.1 简介  151 7.2 Xenoservers  152 7.3 虚拟化的挑战  154 7.4 半虚拟化  155 7.5 Xen的变换形式  158 7.6 改变的硬件,改变的Xen  163 7.7 经验教训  165 7.8 延伸阅读  166 第8章 Guardian:一个容错操作系统环境  169 8.1 Tandem/16,将来所有的计算机都会像这样构建 170 8.2 硬件  170 8.3 物理布局  172 8.4 处理器架构  172 8.5 处理器间总线  178 8.6 输入/输出  178 8.7 进程结构  179 8.8 消息系统  179 8.9 文件系统  183 8.10 轶闻趣事  188 8.11 弊端  189 8.12 后继者  190 8.13 延伸阅读  191 第9章 JPC:一个纯Java的x86 PC模拟程序  193 9.1 简介  193 9.2 概念验证  195 9.3 PC架构  198 9.4 Java性能技巧  199 9.5 把4GB放入4GB:这不起作用  200 9.6 保护模式的危险  203 9.7 从事一项毫无成功希望的斗争  206 9.8 劫持JVM  210 9.9 终极灵活性  220 9.10 终极安全性  222 9.11 第二次做会更好  223 第10章 元循环虚拟机的力量:Jikes RVM  225 10.1 背景  225 10.2 与运行时环境相关的传言  227 10.3 Jikes RVM简史  229 10.4 一个自足执行的运行时自举  230 10.5 运行时组件  234 10.6 经验教训  246 参考文献  247 第四部分 最终用户应用架构 第11章 GNU Emacs:滋长的特性是其优势  251 11.1 使用的Emacs  252 11.2 Emacs的架构  254 11.3 滋长的特性  260 11.4 另外两个架构  262 第12章 当集市开始构建教堂  267 12.1 简介  267 12.2 KDE项目的历史和组织结构  269 12.3 Akonadi  274 12.4 ThreadWeaver  289 第部分 语言与架构 第13章 软件架构面向对象面向函数  299 13.1 概述  299 13.2 函数式示例  302 13.3 函数式解决方案的模块性评价  305 13.4 面向对象视图  313 13.5 面向对象模块性的评价和改进  319 13.6 代理:将操作封装到对象  323 致谢 328 参考文献 328 第14章 重读经典  331 14.1 所有东西都是对象  335 14.2 类型是隐式定义的  342 14.3 问题  348 14.4 砖块和灰浆建筑架构  352 参考资料  359 跋 漂亮地构建 363

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值