📄 200602281452595.html
字号:
<html>
<head><title>软件架构</title></head>
<center><h1>软件架构</h1></center>
<div><P align=right><FONT face=黑体 color=#ff0033><FONT face=Verdana><FONT color=#f70938><FONT face=黑体><a href="200604112229525.html" tppabs="http://www.itisedu.com/phrase/200604112229525.html" target="_new">中科永联</a>高级技术培训中心(</FONT><FONT face=黑体>www.itisedu.com</FONT><FONT face=黑体>)<IMG src="2006327212224270.jpg" tppabs="http://www.itisedu.com/manage/Upload/image/2006327212224270.jpg" border=0></FONT></FONT></FONT></FONT></P>
<P><FONT face=黑体> </FONT><FONT face=宋体> <a href="200602281452595.html" tppabs="http://www.itisedu.com/phrase/200602281452595.html" target="_new">软件架构</a>(<a href="200604241326555.html" tppabs="http://www.itisedu.com/phrase/200604241326555.html" target="_new">software architecture</a>)是一系列相关的抽象<a href="200603061709535.html" tppabs="http://www.itisedu.com/phrase/200603061709535.html" target="_new">模式</a>,用于指导大型<a href="200602281706245.html" tppabs="http://www.itisedu.com/phrase/200602281706245.html" target="_new">软件系统</a>各个方面的设计。<FONT face=宋体> <a href="200604232134205.html" tppabs="http://www.itisedu.com/phrase/200604232134205.html" target="_new">软件</a><a href="200604241328115.html" tppabs="http://www.itisedu.com/phrase/200604241328115.html" target="_new">架构</a>是一个系统的草图。软件架构描述的<a href="200603090845215.html" tppabs="http://www.itisedu.com/phrase/200603090845215.html" target="_new">对象</a>是直接构成系统的抽象<a href="200603302222545.html" tppabs="http://www.itisedu.com/phrase/200603302222545.html" target="_new">组件</a>。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个<a href="200603090857555.html" tppabs="http://www.itisedu.com/phrase/200603090857555.html" target="_new">类</a>或者对象。在<a href="200603101726185.html" tppabs="http://www.itisedu.com/phrase/200603101726185.html" target="_new">面向对象</a>领域中,组件之间的连接通常用接口_(<a href="200603021438435.html" tppabs="http://www.itisedu.com/phrase/200603021438435.html" target="_new">计算机</a>科学)来实现。</FONT></FONT></P>
<P><FONT face=宋体> <a href="200603131358465.html" tppabs="http://www.itisedu.com/phrase/200603131358465.html" target="_new">软件体系结构</a>是构建<a href="200602281627065.html" tppabs="http://www.itisedu.com/phrase/200602281627065.html" target="_new">计算机软件</a>实践的基础。与建筑师设定建筑项目的设计原则和目标,作为绘图员画图的基础一样,一个<a href="200603082100085.html" tppabs="http://www.itisedu.com/phrase/200603082100085.html" target="_new">软件架构师</a>或者系统<a href="200604231335565.html" tppabs="http://www.itisedu.com/phrase/200604231335565.html" target="_new">架构师</a>陈述<a href="200604241327425.html" tppabs="http://www.itisedu.com/phrase/200604241327425.html" target="_new">软件构架</a>以作为满足不同客户<a href="200603101518295.html" tppabs="http://www.itisedu.com/phrase/200603101518295.html" target="_new">需求</a>的实际系统设计方案的基础。</FONT></P><FONT face=宋体>
<P><FONT face=Verdana> 软件构架是一个容易理解的概念,多数工程师(尤其是经验不多的工程师)会从直觉上来认识它,但要给出精确的定义很困难。特别是,很难明确地区分设计和构架:构架属于设计的一方面,它集中于某些具体的特征。</FONT></P>
<P><FONT face=Verdana> 在“软件构架简介”中,David Garlan 和 Mary Shaw 认为软件构架是有关如下问题的设计层次:“在计算的算法和数据结构之外,设计并确定系统整体结构成为了新的问题。结构问题包括总体组织结构和全局控制结构;通信、同步和数据访问的协议;设计元素的功能分配;物理分布;设计元素的组成;定标与性能;备选设计的选择。”[GS93]</FONT></P>
<P><FONT face=Verdana> 但构架不仅是结构;IEEE Working Group on <a href="200604241327575.html" tppabs="http://www.itisedu.com/phrase/200604241327575.html" target="_new">Architecture</a> 把其定义为“系统在其环境中的最高层概念”[IEEE98]。构架还包括“符合”系统完整性、经济约束条件、审美需求和样式。它并不仅注重对内部的考虑,而且还在系统的用户环境和开发环境中对系统进行整体考虑,即同时注重对外部的考虑。</FONT></P>
<P><FONT face=Verdana> 在 <a href="200604032121225.html" tppabs="http://www.itisedu.com/phrase/200604032121225.html" target="_new">Rational</a> Unified Process 中,软件系统的构架(在某一给定点)是指系统重要<a href="200604161439595.html" tppabs="http://www.itisedu.com/phrase/200604161439595.html" target="_new">构件</a>的组织或结构,这些重要构件通过接口与不断减小的构件与接口所组成的构件进行交互。</FONT></P></FONT>
<P><FONT face=宋体> 从和目的、主题、材料和结构的联系上来说,软件架构可以和建筑物的架构相比拟。一个软件架构师需要有广泛的软件理论知识和相应的经验来事实和管理软件产品的高级设计。软件架构师定义和设计软件的模块化,模块之间的交互,用户界面风格,对外接口方法,创新的设计特性,以及高层事物的对象操作、逻辑和流程。</FONT></P>
<P><FONT face=宋体> 是一般而言,软件系统的架构(Architecture)有两个要素:<BR><BR> ·它是一个软件系统从整体到部分的最高层次的划分。<BR><BR> 一个系统通常是由元件组成的,而这些元件如何形成、相互之间如何发生作用,则是关于这个系统本身结构的重要信息。<BR><BR> 详细地说,就是要包括架构元件(Architecture <a href="200604251501485.html" tppabs="http://www.itisedu.com/phrase/200604251501485.html" target="_new">Component</a>)、联结器(Connector)、任务流(Task-flow)。所谓架构元素,也就是组成系统的核心"砖瓦",而联结器则描述这些元件之间通讯的路径、通讯的机制、通讯的预期结果,任务流则描述系统如何使用这些元件和联结器完成某一项需求。<BR><BR> ·建造一个系统所作出的最高层次的、以后难以更改的,商业的和技术的决定。<BR><BR> 在建造一个系统之前会有很多的重要决定需要事先作出,而一旦系统开始进行详细设计甚至建造,这些决定就很难更改甚至无法更改。显然,这样的决定必定是有关系统设计成败的最重要决定,必须经过非常慎重的研究和考察。</FONT></P>
<P><FONT face=宋体> <STRONG>历史</STRONG><BR> 早在1960年代,诸如E·W·戴克斯特拉就已经涉及软件架构这个概念了。自1990年代以来,部分由于在 Rational Software Corporation 和Microsoft内部的相关活动,软件架构这个概念开始越来越流行起来。</FONT></P>
<P><FONT face=宋体> 卡内基梅隆大学和加州大学埃尔文分校在这个领域作了很多研究。卡内基·梅隆大学的Mary Shaw和David Garlan于1996年写了一本叫做 Software Architecture perspective on an emerging discipline的书,提出了软件架构中的很多概念,例如软件组件、连接器、风格等等。 加州大学埃尔文分校的软件研究院所做的工作则主要集中于架构风格、架构描述语言以及动态架构。<BR><BR> 计算机软件的历史开始于五十年代,历史非常短暂,而相比之下建筑工程则从石器时代就开始了,人类在几千年的建筑设计实践中积累了大量的经验和教训。建筑设计基本上包含两点,一是建筑风格,二是建筑模式。独特的建筑风格和恰当选择的建筑模式,可以使一个独一无二。<BR><BR> 下面的照片显示了中美洲古代玛雅建筑,Chichen-Itza大金字塔,九个巨大的石级堆垒而上,九十一级台阶(象征着四季的天数)夺路而出,塔顶的神殿耸入云天。所有的数字都如日历般严谨,风格雄浑。难以想象这是石器时代的建筑物。<BR></FONT></P>
<P align=center><FONT face=宋体></FONT></P>
<P align=center><IMG src="2006327212246527.jpg" tppabs="http://www.itisedu.com/manage/Upload/image/2006327212246527.jpg" border=0><BR><FONT face=宋体>图1、位于墨西哥Chichen-Itza(在玛雅语中chi意为嘴chen意为井)的古玛雅建筑。(摄影:作者) </FONT></P>
<P align=left><FONT face=宋体> 软件与人类的关系是架构师必须面对的核心问题,也是自从软件进入历史舞台之后就出现的问题。与此类似地,自从有了建筑以来,建筑与人类的关系就一直是建筑设计师必须面对的核心问题。英国首相丘吉尔说,我们构造建筑物,然后建筑物构造我们(We shape our buildings, and afterwards our buildings shape us)。英国下议院的会议厅较狭窄,无法使所有的下议院议员面向同一个方向入座,而必须分成两侧入座。丘吉尔认为,议员们入座的时候自然会选择与自己政见相同的人同时入座,而这就是英国政党制的起源。Party这个词的原意就是"方"、"面"。政党起源的关键就是建筑物对人的影响。<BR><BR> 在软件设计界曾经有很多人认为功能是最为重要的,形式必须服从功能。与此类似地,在建筑学界,现代主义建筑流派的开创人之一Louis Sullivan也认为形式应当服从于功能(Forms follows function)。<BR><BR> 几乎所有的软件设计理念都可以在浩如烟海的建筑学历史中找到更为遥远的历史回响。最为著名的,当然就是模式理论和<a href="200604231325145.html" tppabs="http://www.itisedu.com/phrase/200604231325145.html" target="_new">XP</a>理论。<BR><BR> <B>架构的目标是什么</B><BR><BR> 正如同软件本身有其要达到的目标一样,架构设计要达到的目标是什么呢?一般而言,软件架构设计要达到如下的目标:<BR><BR> ·可靠性(Reliable)。软件系统对于用户的商业经营和管理来说极为重要,因此软件系统必须非常可靠。<BR><BR> ·安全行(Secure)。软件系统所承担的交易的商业价值极高,系统的安全性非常重要。<BR><BR> ·可扩展性(Scalable)。软件必须能够在用户的使用率、用户的数目增加很快的情况下,保持合理的性能。只有这样,才能适应用户的市场扩展得可能性。 <BR><BR> ·可定制化(Customizable)。同样的一套软件,可以根据客户群的不同和市场需求的变化进行调整。<BR><BR> ·可扩展性(Extensible)。在新技术出现的时候,一个软件系统应当允许导入新技术,从而对现有系统进行功能和性能的扩展<BR><BR> ·可维护性(Maintainable)。软件系统的维护包括两方面,一是排除现有的错误,二是将新的<a href="200603061756235.html" tppabs="http://www.itisedu.com/phrase/200603061756235.html" target="_new">软件需求</a>反映到现有系统中去。一个易于维护的系统可以有效地降低技术支持的花费<BR><BR> ·客户体验(Customer Experience)。软件系统必须易于使用。<BR><BR> ·市场时机(Time to Market)。软件用户要面临同业竞争,软件提供商也要面临同业竞争。以最快的速度争夺市场先机非常重要。<BR><BR> <B>架构的种类</B><BR><BR> 根据我们关注的角度不同,可以将架构分成三种:<BR><BR> ·逻辑架构、软件系统中元件之间的关系,比如用户界面,<a href="200602271218062.html" tppabs="http://www.itisedu.com/phrase/200602271218062.html" target="_new">数据库</a>,外部系统接口,商业逻辑元件,等等。<BR><BR> 比如下面就是笔者亲身经历过的一个软件系统的逻辑架构图<BR></P></FONT>
<DIV align=left><FONT face=宋体></FONT></DIV>
<P> </P>
<P align=center><IMG src="200632721237610.jpg" tppabs="http://www.itisedu.com/manage/Upload/image/200632721237610.jpg" border=0><BR><FONT face=宋体>图2、一个逻辑架构的例子</FONT></P>
<P><FONT face=宋体> 从上面这张图中可以看出,此系统被划分成三个逻辑层次,即表象层次,商业层次和数据持久层次。每一个层次都含有多个逻辑元件。比如WEB服务器层次中有HTML服务元件、Session服务元件、安全服务元件、<a href="200604022111095.html" tppabs="http://www.itisedu.com/phrase/200604022111095.html" target="_new">系统管理</a>元件等。<BR><BR> ·物理架构、软件元件是怎样放到硬件上的。<BR><BR> 比如下面这张物理架构图描述了一个分布于北京和上海的分布式系统的物理架构,图中所有的元件都是物理设备,包括网络分流器、代理服务器、WEB服务器、应用服务器、报表服务器、整合服务器、存储服务器、主机等等。<BR></P></FONT>
<DIV align=left><FONT face=宋体></FONT></DIV>
<P align=center><IMG src="2006327212328186.jpg" tppabs="http://www.itisedu.com/manage/Upload/image/2006327212328186.jpg" border=0><BR><FONT face=宋体>图3、一个物理架构的例子 </FONT></P>
<P align=left><FONT face=宋体> ·系统架构、系统的非功能性特征,如可扩展性、可靠性、强壮性、灵活性、性能等。<BR><BR> 系统架构的设计要求架构师具备软件和硬件的功能和性能的过硬知识,这一工作无疑是架构设计工作中最为困难的工作。<BR><BR> 此外,从每一个角度上看,都可以看到架构的两要素:元件划分和设计决定。 <BR><BR> 首先,一个软件系统中的元件首先是逻辑元件。这些逻辑元件如何放到硬件上,以及这些元件如何为整个系统的可扩展性、可靠性、强壮性、灵活性、性能等做出贡献,是非常重要的信息。<BR><BR> 其次,进行软件设计需要做出的决定中,必然会包括逻辑结构、物理结构,以及它们如何影响到系统的所有非功能性特征。这些决定中会有很多是一旦作出,就很难更改的。<BR><BR> 根据作者的经验,一个基于数据库的系统架构,有多少个数据表,就会有多少页的架构设计文档。比如一个中等的数据库应用系统通常含有一百个左右的数据表,这样的一个系统设计通常需要有一百页左右的架构设计文档。 </FONT></P><FONT face=宋体>
<P><FONT face=Verdana><STRONG> 构架描述</STRONG> </FONT></P>
<P><FONT face=Verdana> 为了讨论和分析软件构架,必须首先定义构架表示方式,即描述构架重要方面的方式。在 Rational Unified Process 中,软件构架文档记录有这种描述。</FONT></P>
<P><FONT face=Verdana>构架<a href="200603141659315.html" tppabs="http://www.itisedu.com/phrase/200603141659315.html" target="_new">视图</a> </FONT></P>
<P><FONT face=Verdana> 我们决定以多种构架视图来表示软件构架。每种构架视图针对于开发流程中的涉众(例如最终用户、设计人员、管理人员、系统工程师、维护人员等)所关注的特定方面。</FONT></P>
<P><FONT face=Verdana> 构架视图显示了软件构架如何分解为构件,以及构件如何由连接器连接来产生有用的形式 [PW92],由此记录主要的结构设计决策。这些设计决策必须基于需求以及功能、补充和其他方面的约束。而这些决策又会在较低层次上为需求和将来的设计决策施加进一步的约束。</FONT></P>
<P><FONT face=Verdana>典型的构架视图集 </FONT></P>
<P><FONT face=Verdana> 构架由许多不同的构架视图来表示,这些视图本质上是以图形方式来摘要说明“在构架方面具有重要意义”的模型元素。在 Rational Unified Process 中,您将从一个典型的视图集开始,该视图集称为“4+1 视图模型”[KRU95]。它包括: </FONT></P>
<P><FONT face=Verdana><a href="200604161240175.html" tppabs="http://www.itisedu.com/phrase/200604161240175.html" target="_new">用例视图</a>:包括<a href="200604240937105.html" tppabs="http://www.itisedu.com/phrase/200604240937105.html" target="_new">用例</a>和场景,这些用例和场景包括在构架方面具有重要意义的行为、类或技术风险。它是<a href="200603101234535.html" tppabs="http://www.itisedu.com/phrase/200603101234535.html" target="_new">用例模型</a>的子集。 <BR><a href="200604161231275.html" tppabs="http://www.itisedu.com/phrase/200604161231275.html" target="_new">逻辑视图</a>:包括最重要的设计类、从这些设计类到包和<a href="200604161433025.html" tppabs="http://www.itisedu.com/phrase/200604161433025.html" target="_new">子系统</a>的组织形式,以及从这些包和子系统到层的组织形式。它还包括一些用例实现。它是<a href="200604161258515.html" tppabs="http://www.itisedu.com/phrase/200604161258515.html" target="_new">设计模型</a>的子集。 <BR><a href="200604161156485.html" tppabs="http://www.itisedu.com/phrase/200604161156485.html" target="_new">实施视图</a>:包括<a href="200604161340075.html" tppabs="http://www.itisedu.com/phrase/200604161340075.html" target="_new">实施模型</a>及其从模块到包和层的组织形式的概览。 同时还描述了将逻辑视图中的包和类向实施视图中的包和模块分配的情况。它是实施模型的子集。 <BR><a href="200604161234465.html" tppabs="http://www.itisedu.com/phrase/200604161234465.html" target="_new">进程视图</a>:包括所涉及任务(进程和<a href="200603091754305.html" tppabs="http://www.itisedu.com/phrase/200603091754305.html" target="_new">线程</a>)的描述,它们的交互和配置,以及将设计对象和类向任务的分配情况。只有在系统具有很高程度的并行时,才需要该视图。在 Rational Unified Process 中,它是设计模型的子集。 <BR>配置视图:包括对最典型的平台配置的各种物理节点的描述以及将任务(来自进程视图)向物理节点分配的情况。只有在分布式系统中才需要该视图。它是部署模型的一个子集。 <BR>构架视图记录在软件构架文档中。您可以构建其他视图来表达需要特别关注的不同方面:用户界面视图、安全视图、数据视图等等。对于简单系统,可以省略 4+1 视图模型中的一些视图。</FONT></P>
<P><FONT face=Verdana><STRONG> 构架重点</STRONG> </FONT></P>
<P><FONT face=Verdana> 虽然以上视图可以表示系统的整体设计,但构架只同以下几个具体方面相关: </FONT></P>
<P><FONT face=Verdana>模型的结构,即组织模式,例如<a href="200604161254415.html" tppabs="http://www.itisedu.com/phrase/200604161254415.html" target="_new">分层</a>。 <BR>基本元素,即关键用例、主类、常用机制等,它们与模型中的各元素相对。 <BR>几个关键场景,它们表示了整个系统的主要控制流程。 <BR>记录模块度、可选特征、产品线状况的服务。 </FONT></P>
<P><FONT face=Verdana> 构架视图在本质上是整体设计的抽象或简化,它们通过舍弃具体细节来突出重要的特征。在考虑以下方面时,这些特征非常重要:</FONT></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -