软件视图

架构视图

架构视图是对某一视角或某一点上看到的系统所作的简化描述,描述中涵盖系统某一特定方面,而省略了与此方面无关的实体。

常见的有4+1视图

4+1视图

view

多视图间信息流动,支撑视图间的一致性

  • Logical View 面向系统逻辑分析与设计,描述系统逻辑结构的视图
  • Development View 面向系统开发以及软件管理,描述系统代码机构,构建结构的视图
  • Deployment View 面向系统部署,描述系统交付,安装,部署的视图
  • Process View 面向系统运行,描述系统启动过程,运行期交互的视图
  • UserCase View 以用例作为驱动元素,驱动和验证其他四个视图的设计。用例视图不增加设计元素,仅增加用例作为输入,因此是+1视图。

视图与质量属性的关系

质量属性贯穿各视图的另一个维度,直接决定各个视图中的元素和关系设计

用例视图

用例视图描述系统和外部环境之间的关系和交互,并显式定义系统范围,职责,边界以关键用例交互。

目的

  • 理解目标系统所处的上下文语境的结构、业务及其动态特性
  • 描述系统上下文,确定系统和外部的边界以及外部实体的关系
  • 描述关键场景和用例,驱动和验证其他4个视图的设计

建模方法

  • 模型:系统上下文模型,系统交互场景模型
  • 元素:系统,外部实体(其他系统或人)
  • 关系:外部接口,外部依赖关系

系统上下文模型

要点:

  • 系统本身及外部实体均为黑盒,隐藏内部结构
  • 关注系统及外部实体的职责(服务与数据),质量属性
  • 标识系统与外部实体间的接口,职责(提供或使用数据,服务,事件等),质量属性,依赖关系等
  • 建议画出组织边界
  • 上下文模型中需要完整描述系统对外的接口。包括物理哦接口,逻辑给口,协议栈等。可基于此开展完整的暴露面分析和针对暴露面的威胁分析。

view1

系统用例交互场景

要点:

  • 通过系统关键用例界定系统边界和行为
  • 对于系统与外部实体之间的关键用例和复杂交互关系,可以采用序列图对交互场景进行建模,一边描述隐含的需求和约束,帮助系统验证

view2

view3

逻辑视图

逻辑视图用于面向设计人员描述系统分解及技术方案

  • 逻辑视图描述系统的逻辑分解,以及分解出的逻辑元素间的关系
  • 逻辑模型划分的服务,组件等元素是后续其他视图的基准,必须与后续各视图的相应元素如开发视图中的实际代码仓,目录,以及编译构建工程,部署视图的交付单元,可部署单元等建立对应关系
  • 可基于逻辑视图开展威胁分析
  • 在逻辑视图部件划分时,通常会有用于描述业务功能的业务组件,以及作为技术支撑的技术部件(如database,Cache,中间件),对于这两种部件应采用不同的模型表述,以便支持业务与技术的解耦以及技术部件的替换
    • 通过逻辑模型和数据模型描述业务功能,其中不包括技术元素,以及各部件的具体实现技术方案。逻辑模型和数据模型在本领域内重用
    • 通过技术模型描述具体的技术方案和技术选型,包括支撑性的技术元素

逻辑视图的基本元素

  • 逻辑视图可分层分级表达,如先分成子系统/层/面或者域/子域等,再继续划分
  • 系统划分的最小功能元素,根据不同产品采用的技术不同
    • 对于云化/微服务架构产品,建议可最终划分到服务/微服务,对于微服务内的组件/模块划分,是否再架构设计中呈现,可由团队自行决定
    • 对于组件化/模块化架构的产品,建议最终划分到组件,对于开源/第三方组件,可考虑跟踪到模块。

view4

最细粒度要能跟代码对应上。

逻辑模型 — 系统分解

  • 系统功能分解(为什么要分解?)
    • 理解业务
    • 团队划分
    • 高内聚,低耦合
  • 逻辑 vs 技术实现
  • 逻辑模型与实现技术无关

逻辑模型 — 需求出发,按功能直接分解?

  • 流程图分解
    • 按照特性、功能进行初步分解
    • 按useCase的逻辑步骤分解成服务(或者软件模块)

如何按照功能分解的方式设计一辆车

view5

上面这样按照功能分解时不合适的,车的不同的部件组合实现了上面的功能,比如说上面的左转和前进模块有很多的内部实现是相同的,如果按照这样的分解,是存在极大的冗余的,且同一功能需要多出修改,是不合适的。

因此需要对系统的功能进行抽象,聚类,将系统功能转化为设计部件。

因此架构设计从更关注系统行为转换为更关注系统构成。

数据模型

  • 数据模型描述系统存储,操作,管理和分发数据的方式,包括数据结构,内容,所有权,标识符和映射关系等多方面数据相关的设计决策
  • 主要描述数据的逻辑结构(数据静态和动态结构,所有权,生命周期等)
  • 数据模型中的常见图包括:静态数据结构,动态数据流,数据所有权,数据生命周期

数据模型不直接讲数据库,而是数据结构

技术模型 — 架构实现

  • 描述用以支撑系统实现的技术部件,包括框架,中间件等以及实现各功能和质量属性的关键机制,技术方案,编程语言等。
  • 描述各功能部件的实现方案和框架代码
  • 在某些场景下,实际上转变成了技术“上下文”
    技术模型 2D -> 3D -> 4D
    • 2D:基本的数据结构和实现方案,如MVC,通过ORM连接数据库等
    • 3D:各技术部件的技术选型,如ORM选用Hibernate,view选用AngularJS等
    • 4D:各技术部件版本选择及演进,如ORM从Hibernate4.3.8演进到4.4.1

在技术模型中需要对4D信息进行描述,既关键技术方案,具体选型,以及版本演进。

逻辑视图推荐方法 —- DDD

聚焦业务领域,以业务模型而非技术实现作为架构设计的驱动力,从而实现业务逻辑上的松耦合。

DDD战略设计:通过衔接是上下文进行系统划分

开发视图

面向开发人员,主要包括开发,测试,编译,构建,维护

  • 设计与代码一致性映射问题
    架构设计元素(子系统,服务,组件)与代码元素(代码仓,目录,包,文件)以及构建元素(二进制交付件)之间的对应关系

  • 代码,构建依赖问题
    架构设计中的依赖关系如何体现在代码中

代码模型

逻辑视图到代码模型的元素映射

  • 针对逻辑视图中每个元素,需要给出明确代码仓/目录(微服务,组件独立代码仓(推荐))
  • 针对每个元素,需给出内含的目录结构,至少包括内外部接口目录和源文件目录划分

代码模型中的依赖关系的建立

  • 在明确代码与逻辑元素映射后,可获取相应元素间的依赖和调用关系模型,形成真实代码依赖和调用关系模型,从而确保代码与架构一致性(有工具可以自动生成)
  • 架构和代码间的一致性是双方的。即支持逻辑视图到开发视图到代码的正向一致性;也需支持从代码反向生成开发视图,及与逻辑视图反向同步。

构建模型

从源码到机器码

构建模型主要描述

  • 产品构建过程,即从源码到二进制交付件的生成关系
  • 每个构建过程中依赖的工具链,以及工具版本信息
  • 二进制交付件在运行目录的位置
  • 二进制交付件与逻辑视图元素的映射关系

部署视图

用于描述二进制交付件的打包发布及部署

部署视图描述产品交付过程,交付依赖;在测试和生产环境中的功能分布结构,部署对象之间的相互依赖关系等。部署视图显示定义系统的交付编排过程,部署结构及部署的工具

目的

  • 确定系统的交付件构成
  • 理解目标系统在测试,运行环境的最终形态,其结构组成,部件的依赖关系,呈现整体模型。
  • 确定系统的部署工具及部署方法

交付模型

二进制交付件的打包交付过程

交付模型实现从开发视角(二进制交付件)到交付视角(面向客户的订单)的转换

交付模型主要描述

  • 产品打包交付过程
  • 交付模型中需要明确每个订单包含的内容和整个打包过程
  • 打包过程依赖的工具链,以及工具版本信息
  • 产品订单与逻辑视图中相应元素的映射关系

运行视图

用于系统运行设计

运行视图主要对进程,进程组,线程,进程间通信等进行建模,也可以对互斥,信号量等保护数据和资源的机制进行建模。同时运行视图还包括架构强关联的功能和特性的运行设计。

运行模型主要包括以下部分

  • 逻辑,任务映射:讲逻辑元素映射运行时的执行实体上(暴扣VM,进程,进程组,线程等)
  • 运行期的并行处理:包括进程,线程设计,资源共享机制,进程间通讯机制,死锁分析,进程、线程优先级设计。
  • 关键运行设计:关键功能,安全/可靠性机制等,可采用顺序图,活动图,状态图等方式
显示 Gitment 评论