软件架构风格

软件架构概念


软件架构为软件系统提供了一个结构、行为和属性的高级抽象。(背)

结构:软件结构中,我们可能会有用户界面、订单处理系统和库存管理系统等组件。这些组件如何分布和协作,例如用户界面调用订单系统来处理购买请求。
行为:行为描述了软件在实际操作中的动态过程,例如,当用户点击“购买”按钮时,系统如何验证库存创建订单、处理支付,并最终确认订单。
属性:属性涵盖软件的性能(如页面加载速度)、可靠性(系统处理订单的稳定性)、和安全性(如用户数据的保护措施)等。

软件体系结构主要包括构件,构件性质和构件之间的关系。 

软件架构设计包括提出架构模型、产生架构设计和进行设计评审等活动,是一个迭代的过程架构设计主要关注软件组件的结构、属性和交互作用,并通过多种视图全面描述特定系统的架构。

系统构件组装分为三个不同的层次:定制(Customization),集成(Integration),扩展(Extension),这三个层次对应于构件组装过程中的不同任务。

构件的特性是:
1.独立部署单元:
2.作为第三方的组装单元;
3.没有(外部的)可见状态。一个构件可以包含多个类元素,但是一个类元素只能属于一个构件。将一个类拆分进行部署通常没什么意义。
对象的特性是:
1.一个实例单元,具有唯一的标志。
2.可能具有状态,此状态外部可见。
3.封装了自己的状态和行为。

  • 软件构件是部署、版本控制和替换的基本单位。
  • 构件是一组通常需要同时部署的原子构件。
  • 原子构件通常成组地部署,但是它也能够被单独部署。
  • 构件与原子构件的区别在于,大多数原子构件永远都不会被单独部署,尽管它们可以被单独部署。大多数原子构件都属于一个构件家族,一次部署往往涉及整个家族。一个模块是不带单独资源的原子构件。
  •  为了使一个接口的规范和实现该接口的构件得到广泛应用,需要实现接口的标准化。接口标准化是对 接口中消息模式,格式和协议 的标准化。
  • 应用系统构建中可以采用多种不同的技术,逆向工程((Reverse Engineering可以将软件某种形式的描述转换为更高级的抽象表现形式,而利用这些获取的信息,再工程(Re-engineering)能够对现有系统进行修改或重构,从而产生系统的一个新版本。

系统移植也是系统构建的一种实现方法,移植工作大体上分为计划阶段、准备阶段、转换阶段、测试阶段、验证阶段。
1.计划阶段,在计划阶段,要进行现有系统的调查整理,从移植技术、系统内容(是否进行系统提炼等)、系统运行三个方面,探讨如何转换成新系统,决定移植方法,确立移植工作体制及移柏日程。
2.准备阶段,在准备阶段要进行移植方面的研究准备转换所需的资料。该阶段的作业质量将对以后的生产效率产生很大的影响。
3.转换阶段,这一阶段是将程序设计和数据转换成新机器能根据需要工作的阶段。

架构风格定义一个系统家族,即一个体系结构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。

根据基于软件架构的设计的定义,基于软件架构的设计(Architecture Based Software  Development,ABSD)强调由商业、质量和功能需求的组合驱动软件架构设计。

它强调采用视角和视图来描述软件架构,采用用例和质量属性场景来描述需求。采用用例描述的是功能需求,质量属性场景描述的是质量需求(或侧重于非功能需求)。

体系结构文档化过程的主要输出包括 体系结构规格说明,测试体系结构需求的质量设计说明书

架构的作用

  • 软件架构是项目干系人进行交流的手段。
  • 软件架构是可传递和可复用的模型,通过研究软件架构可能预测软件的质量。
  • 软件架构使推理和控制的更改更加简单,有助于循序渐进的原型设计,可以作为培训的基础。 

架构所处的位置:架构设计就是需求分配,即将满足需求的职责分配到组件上。

架构的发展历程

UML对系统架构的定义是系统的组织结构,包括系统分解的组成部分,以及它们的关联性、交互机制和指导原则等提供系统设计的信息。具体来说,就是指以下5个系统视图:
①逻辑视图。逻辑视图也称为设计视图,它表示了设计模型中在架构方面具有重要意义的部分,即类、子系统、包和用例实现的子集。
②进程视图。进程视图是可执行线程和进程作为活动类的建模,它是逻辑视图的一次执行实例,描述了并发与同步结构。
③实现视图。实现视图对组成基于系统的物理代码的文件和构件进行建模。
④部署视图。部署视图把构件部署到一组物理节点上,表示软件到硬件的映射和分布结构。⑤用例视图。用例视图是最基本的需求分析模型

 架构的4+1视图(考点)

4+1视图架构是一种用于描述软件架构的方法,它通过五个不同的视图来全面描述系统的架构,帮助不同的利益相关者理解系统的设计和结构。这五个视图分别是:

1. **逻辑视图 (Logical View)**:
   - 描述系统的功能和行为,主要关注系统的功能模块及其交互。
   - 适合开发人员和系统分析师,通常使用 UML 类图、顺序图等表示。

描述对象模型与对象之间的关系

2. **开发视图 (Development View)**:
   - 关注软件的模块化和组织结构,描述系统的代码结构和开发环境。
   - 适合开发团队,通常使用包图、组件图等表示。

3. **过程视图 (Process View)**:
   - 描述系统的动态行为,包括并发性、同步和通信等。
   - 适合系统管理员和性能工程师,通常使用活动图、状态图等表示。

4. **物理视图 (Physical View)**:
   - 描述系统的硬件和网络架构,关注系统的部署和运行环境。
   - 适合运维团队,通常使用部署图表示。

5. **场景视图 (Use Case View)**:
   - 通过用例来描述系统的功能需求,展示系统如何满足用户需求。
   - 适合所有利益相关者,通常使用用例图表示。

通过这五个视图的结合,4+1视图架构能够提供一个全面的系统架构描述,帮助不同角色的人员理解和沟通系统的设计理念和实现细节。

ADL(Architecture Description Language)

是一种用于描述软件架构的语言。它提供了一种形式化的方法来定义和表示系统的结构、组件及其相互关系。ADL的主要目的是帮助开发人员和架构师在设计和分析软件系统时,清晰地表达系统的架构特征。

ADL的三个基本元素:

  • 构件:计算或数据存储单元。(组件和组件接口)
  • 连接件:用于构件之间交互建模的体系结构构造块及其支配这些交互的规则。
  • 架构配置:描述体系结构的构件与连接件的连接图。

软件架构风格

软件架构风格描述某一特定领域中的系统组织方式和惯用模式,反映了领域中众多系统所共有的结构和语义两个方面的特征。强调对架构设计的重用。

包括架构定义,架构词汇表,架构约束

  • 对于语音识别、知识推理等问题复杂、解空间很大、求解过程不确定的这一类软件系统,通常会采用黑板架构风格
  • 以知识为中心进行分析与推理,对于因数据而驱动,数据到达某个构件,经过内部处理,产生数据输出的系统通常采用管道-过滤器体系结构风格
  • 一个普通的编译系统包括词法分析器,语法分析器,语义分析与中间代码生成器,优化器,目标代码生成器等一系列对源程序进行处理的过程。适合管道-过滤器模式。
  • 某公司拟开发一个扫地机器人。机器人的控制者首先定义清洁流程和流程中任务之间的关系,机器人接受任务后,需要响应外界环境中触发的一些突发事件,根据自身状态进行动态调整,最终自动完成任务。针对上述需求,该机器人应该采用规则系统架构风格最为合适。
  • 某企业内部现有的主要业务功能已封装成为Web服务。为了拓展业务范围,需要将现有的业务功能进行多种组合,形成新的业务功能。针对业务灵活组合这一要求,采用解释器 架构风格最为合适。
  • 某公司拟开发了个轿车巡航定速系统系统需要持续测量车辆当前的实时速度,并根据设定的期望速度启动控制轿车的油门和刹车。针对上述需求,采用过程控制架构风格最为合适。
  • 某公司拟开发一套在线游戏系统,该系统的设计目标之一是支持用户自行定义游戏对象属性,行为和对象之间的交互关系。为了实现上述目标,公司应该采用解释器 架构风格最为合适。
  • 某公司为其研发的硬件产品设计实现了一种特定的编程语言,为了方便开发者进行软件开发,公司拟开发一套针对该编程语言的集成开发环境,包括代码编辑、语法高亮、代码编译、运行调试等功能。针对上述描述,该集成开发环境应采用数据仓库架构风格最为合适。

数据流风格(Data Flow Style) 

   强调处理数据,按照流程将数据一步一步地的加工,得到最终结果。有严格的流程、并且是为了数据处理系统适合数据流风格。

管道—过滤器(Pipes and Filters)

   管道过滤器是以数据流的方式进行数据间传递。就是说,当前部件将部分数据处理好之后就可以将处理好的数据传递给加一个部件。比如早期的编译器,将代码一段段地进行词法分析、语法分析、语义分析,而不是将全部代码进行词法分析完后才会进行语法分析。这样的操作过程就是为了快。所谓管道是一种连接件,将一个过滤器的输出传输给下一个过滤器的输入。而过滤器相当于流水线的处理单元,负责处理输入数据。过滤器需要将前序管道拉取数据,并将输出数据压入后续管道。

批处理序列(Batch Sequential)

 与管道—过滤器差不多都是按照流程一步步走,只不过每一个处理步骤是一个独立的程序,每一步走完才可以走下一步。数据必须是一整套的,以完整、全量的数据进行传递。

调用/返回风格 (Call/Return)

主程序/子程序【Main Program and Subroutine】

面向过程

面向对象【Object-oriented】

对象的方法调用

分层架构【Layered System]

层与层之间的方法调用

独立构件风格(Independent Components)

  基本出发点,将功能封装成构件,每个构件相互独立,可以单独运行。独立构件风格可以适应分布式系统,别个构件相互独立,分工明确,耦合性低。

进程通信【Communicating Processes】

进程通信是指在多个独立进程之间进行信息交换的机制。在独立构件风格中,构件通常作为独立的进程运行,因此需要有效的通信方式来协调它们之间的交互。

事件驱动系统(隐式调用)【Eventsystem】

事件驱动系统是一种基于事件的架构风格,强调通过事件的产生、传播和处理来实现系统的解耦和异步交互。在这种架构中,组件之间的通信主要依赖于事件,而不是直接的调用关系。

某公司拟开发一个新闻系统,该系统可根据用户的注册兴趣,向用户推送其感兴趣的新闻内容,该系统应该采用(事件驱动系统)架构风格最为合适。

用户会注册自己的兴趣,然后系统也会把新闻按兴趣分类,如果某个新闻事件发生,可以通过事件来触发推送动作,将新闻推送给对其感兴趣的用户。这是典型的事件驱动系统应用场景。


虚拟机风格(Virtual Machine)

解释器【interpreter】

规则系统【Rule-based System】

广泛应用于人工智能、专家系统和决策支持系统中。其核心思想是通过一组规则来推理和决策。尤其是在需要复杂决策和推理的场景中。通过灵活的规则管理和透明的推理过程,规则系统能够有效地支持决策和自动化。

VIP管理系统会根据不同商场活动,不定期更新VIP会员的审核标准和折扣标准,属于典型规则系统应用场景。

仓库风格 / 以数据为中心(Data-centered)

数据共享风格也成为仓库风格。

在这种风格中,有两种不同类型的构件:

一种是中央数据单元,也成为资源库,用于表示系统的当前状态;

另一种是相互依赖的构件组,这些构件可以对中央数据单元实施操作。

中央数据单元和构件之间可以进行信息交换,这是数据共享体系结构的技术实现基础。

根据所使用的控制策略不同,数据共享体系结构可以分为两种类型,一种是传统的数据库,另一种是黑板。

如果由输入流中的事件来驱动系统进行信息处理,把执行结构存储到中央数据单元,则这个系统就是数据库应用系统。

如果由中央数据单元的当前状态来驱动系统运行,则这个系统就是黑板应用系统。

黑板是数据共享体系结构的一个特例,用以解决状态冲突并处理可能存在的不确定性知识源。

黑板常用于信号处理,如语音和模式识别,同时在自然语言处理领域中也有广泛的应用,如机器翻译和句法分析。

数据库系统【Database System】

黑板系统【Blackboard System】

超文本系统【Hypertext System】

C2风格

       C2结构是一个层次网络,包括构件和连接件两种软件元素。构件和连接键都是包含顶部和底部的软件元素。构件和构件之间只能通过连接件进行连接,而连接件之间则可以直接进行连接。构件的顶部、底部分别与连接件的底部、顶部连接,连接件的顶部、底部也分别与连接件的底部、顶部连接。

在C2体系结构中,构件之间的所有通信必须使用消息传递机制来实现。构件之间所有传递的信息可以分为两种,一种是向上层构件发出服务请求的请求消息,另一种是向下层构件发出指示状态变化的通知消息。连接件负责消息的过滤、路由、广播、通信和相关处理。

客户/服务器(C/S)风格

       C/S属于层次风格中的一种。二层C/S风格,在客户端上的应用程序不仅负责与用户交互,又负责对数据的管理。客户端上的应用程序分为与用户交互的前端和管理数据的后端。比如磁盘机,打印机,和调制解调器等。

浏览器/服务器(B/S)风格
       

虽然三层C/S,比二层C/S维护更便利些,但还是要求用户需要有客户端。没有客户端就无法使用软件。比如手机APP,而 B/S风格,不要求用户安装客户端。例如微信小程序, 把表示层当作浏览器去用。只需要用户键入网址,就可以将功能反馈给用户。 B/S 与 C/S相比,客户端变成了WWW浏览器,应用服务器变成了WEB服务器。应用程序以网页的形式存放于Web服务器上。用户只需要一个浏览器就可以运行所有功能模块,实现了"零客户端"的功能。

富互联网应用 (RIA)


         RIA是由三层B/S架构上演变而来。在三层B/S架构中,用户通过浏览器运行,避免了去下载应用软件的问题。但是三层B/S架构中缺乏对动态页面支持的能力,也就是说运行一些复杂动作时,整个系统运行就会变得慢。基本上无法流畅得支持动画。

        而RIA就是为了提升动态页面支持能力的一种架构风格。他的特点时,打开页面时慢,执行时流畅表现力强。RIA的思想是,在每次提交复杂的请求时,都要交换大量的数据,还不如一次性将常用请求中要用到的数据在第一次打开时就全部加载到本地缓存。加载完后,交换数据量的工作就会小很多。最常见的网页游戏就是采用这种风格,在第一次打开时就会将整个地图资源加载进本地。加载的过程是慢的,但是进入游戏之后,就省去了交换地图资源数据的步骤了,画面也就可以支持丰富化的效果了。

REST架构风格


(Resource) Representational State Transfer,(资源)表现层状态转移,一种使用HTTP和XML、JSON来组织WEB服务的架构。可以降低开发的复杂性,提高系统的可伸缩性。

        原理就是用URL定位资源,用HTTP描述操作。URL中只使用名词来定位资源,用HTTP协议里的动词(GET、POST、PUT、DELETE)来实现资源的增删改查操作。

比如,我们有一个friends接口,对于“朋友”我们有增删改查四种操作,怎么定义REST接口?

增加一个朋友,uri: generalcode.cn/v1/friends 接口类型:POST

删除一个朋友,uri: generalcode.cn/va/friends 接口类型:DELETE

修改一个朋友,uri: generalcode.cn/va/friends 接口类型:PUT

查找朋友,uri: generalcode.cn/va/friends 接口类型:GET

上面我们定义的四个接口就是符合REST协议的,请注意,这几个接口都没有动词,只有名词friends,都是通过Http请求的接口类型来判断是什么业务操作。

举个反例:generalcode.cn/va/deleteFriends 该接口用来表示删除朋友,这就是不符合REST协议的接口.。

REST有五个原则:

网络上的所有事物都被抽象为资源
每个资源对应一个唯一的资源标识
通过通用的连接件接口对资源进行操作
对资源的各种操作不会改变资源标识
所有的操作都是无状态的

基于服务的架构风格(SOA)


        在面向对象的基础上,演变出了构件。构件是一个可以单独运行的功能。但是构件的标准化程度低,也就是说“你开发出来的一个构件,可能别人不知道要如何使用”。还可能会有跨平台的问题。 比如JAVA中的构件无法在C++中使用。为了解决标准化,规范化程度低,提出了基于服务的架构风格。将自己开发的功能用服务的形式进行对外发布。完成服务间的交互。比如WebService。

        SOA的实现要求有一个重要的技术,就是ESP企业服务总线(Enterprise Service Bus),ESP充当中介者。这种中介者能够负责起数据传输,服务描述数据存储,提供位置透明的消息路由和寻址服务,协议以及数据格式的转换,提供服务注册接口,日志监控等。把服务间点对点交互的的网状结构转化成了星型结构。

1. **DDI (Universal Description, Discovery, and Integration)*(通用描述、发现与集成)*:
   - DDI 是一种用于Web服务的注册和发现的标准。它允许服务提供者注册他们的服务,并使服务消费者能够查找和访问这些服务。DDI 通过提供一个统一的描述框架,促进了服务的互操作性。

2. **UDDI (Universal Description, Discovery, and Integration)*(通用描述、发现与集成)*:
   - UDDI 是 DDI 的具体实现,主要用于Web服务的注册和发现。它提供了一个目录服务,允许企业发布和查找Web服务。UDDI 使得服务的发现更加高效,促进了服务的重用。

3. **WSDL (Web Services Description Language)(Web服务描述语言)**:
   - WSDL 是一种用于描述Web服务接口和操作的XML格式语言。它定义了服务的功能、输入和输出参数、数据类型以及服务的访问方式。WSDL 使得服务消费者能够理解如何与Web服务进行交互。

4. **SOAP (Simple Object Access Protocol)(简单对象访问协议)**:
   - SOAP 是一种协议,用于在网络上交换结构化信息,主要用于Web服务之间的通信。它基于XML,支持多种传输协议(如HTTP、SMTP等),实现Web服务的远程调用

5. **BPEL (Business Process Execution Language)(业务流程执行语言)**:
   - BPEL 是一种用于描述和执行业务流程的语言,特别是在Web服务环境中。它允许开发者定义复杂的业务流程,通过组合多个Web服务来实现业务逻辑。用来将分散的,功能单一的Web服务组织成一个复杂的有机应用

微服务架构风格


        微服务架构是面向服务的架构风格中的一种。微服务与SOA区别就像是活字印刷与雕版硬刷的区别。SOA将所有系统中服务进行集成,而微服务将整个业务进行打碎,每个单一应用程序划分成一个服务,每个服务只需关注很小的业务功能。每个服务间进行相互沟通为用户提供最终价值。特点是:

小,且专注于一件事情
轻量级的通信机制
松耦合,独立部署

模型驱动架构(MDA)

        Model Driven Architecture , 采用了净室工程的思想,利用模型进行代码自动化生成。虽然没有普及,但是有些系统在局部功能上有所应用。比如拖动按钮生成相关代码,比如UML类图转换成实际代码等。

公共对象请求代理(CORBA)

公共对象请求代理(Common Object Request Broker Architecture,CORBA)是由对象管理组织(Object Management Group,OMG)提出来的,是一套完整的对象技术规范,其核心包括标准语言、接口和协议。在异构分布式环境下,可以利用CORBA来实现应用程序之间的交互操作,同时,CORBA也提供了独立于开发平台的编程语言的对象重用方法。

CORBA标准中,OMG接口定义语言IDL文件包含了六种不同的元素,包括模块定义、类型定义、常量定义、异常、接口描述和值类型,其中接口描述是一个IDL文件最核心的内容,模块定义将被映射为Java语言中的包和C++语言中的命名空间。

伺服对象(Servant):CORBA对象的真正实现负责完成客户端请求。

对象适配器(Object Adapter):主要作用是 在底层传输平台与接受调用并返回结果的对象实现支架进行协调,目前采用的对象适配器规范是POA(可移植对象适配器),它替代了传统的BOA(基本对象适配器)

对象请求代理(Object Request Broker):解释调用并负责查找实现该请求的对象,将参数传给找到的对象,并调用方法返回结果。客户方不需要了解服务对象的位置、通信方式、实现激活或存储机制。

特定领域软件架构DSSA

特定领域软件架构(Domain Specific SoftwareArchitecture,DSSA)以一个特定问题领域为对象,形成由领域参考模型、参考需求、参考架构等组成的开发基础架构,其目标是支持一个特定领域中多个应用的生成。

参与DSSA的人员可以划分为4中角色:领域专家,领域设计人员,领域实现人员和领域分析师

DSSA的基本活动包括领域分析、领域设计和领域实现

其中领域分析的主要目的是获得领域模型

领域模型描述领域中系统之间共同的需求,即领域需求

领域设计的主要目标是获得DSSA,DSSA描述领域模型中表示需求的解决方案:

领域实现的主要目标是依据领域模型和DSSA开发和组织可重用信息,并对基础软件架构进行实现。

面向构件的编程 COP

面向构件的编程(Component-OrientedProgramming,COP)关注于如何支持建立面向构件的解决方案。基于一般OOP风格,面向构件的编程需要下列基本的支持:多态性(可替代性)、模块封装性(高层次信息的隐藏)、后期的绑定和装载(部署独立性)和安全性(类型和模块安全性)

面向构件的编程仍然缺乏完善的方法学支持。现有的方法学只关注于单个构件本身,并没有充分考虑由于构件的复杂交互而带来的诸多困难,其中的一些问题可以在编程语言和编程方法的层次上进行解决。

J2EE

J2EE(Java 2 Platform, Enterprise Edition)是一个用于开发和运行企业级应用程序的Java平台。它提供了一系列的API和运行时环境,支持多层架构的应用程序开发,特别适合于构建大规模、分布式和可扩展的企业应用。

J2EE的主要组件包括:

1. **Servlets**:用于处理客户端请求和生成动态网页内容的Java类。
2. **JavaServer Pages (JSP)**:一种用于创建动态网页的技术,允许在HTML中嵌入Java代码。
3. **Enterprise JavaBeans (EJB)**:用于构建可重用的业务逻辑组件,支持事务处理、安全性和并发。
4. **Java Message Service (JMS)**:用于在不同的应用程序之间发送消息的API,支持异步通信。
5. **Java Naming and Directory Interface (JNDI)**:用于查找和访问命名和目录服务的API。
6. **Java Transaction API (JTA)**:用于管理分布式事务的API。

在构建应用系统时,需要与不同时期采用不同技术开发的既有系统进行集成。JavaEE(J2EE)平台提供了对于不同类型遗产系统的集成支持。

对于关系型数据库系统可以采用JDBC(Java数据库连接)进行连接

对于非Java应用系统可以采用JCA(Java连接器架构)连接

对于基于COFJBA的应用系统可以采用JavaIDL(Java接口定义语言)实现集成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值