掌握一套架构方法论,掌握规范的设计方法,设计出更好、更稳定的架构设计。
在文章开始之前需要先理解几个概念:
业务分析阶段是由业务分析师 基于自身的业务知识和类似产品的参考,再结合客户、领域专家的咨询和指导输出业务分析阶段的成果,主要包括 领域模型 和 业务模型
领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本 身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。概念比较深奥,其实说白了就是我们把基于对业务的理解画成一个类图,并画出这些类之间的关系(面向对象),下面我们看一个实际的领域模型然后加深一下理解。
在领域模型绘制时经常会出现下面两种典型错误:
领域模型可以整理业务中的概念以及关系,帮助团队中的成员对业务的理解保持一致;往后可以指导数据库设计、系统功能设计、指导开发。
现在有种开发模式是基于UI指导开发,根据UI进行数据库数据库设计、代码编写,我们称之为 “急功近利式” 开发模式。因为UI是系统表面性的东西,是异变的,不稳定的,这种模式下UI变化后我们的的设计可能也需要跟着变。
而右边是基于领域驱动开发,在开发前先去思考业务的本质,先把领域层分析出来,再根据分析出来的领域层进行界面设计、架构设计、代码开发,这是由内而外的设计,这样做出来的系统就会比较稳定。
前面讲的领域模型是基于静态的关系,要理解业务其实更多的需要从动态的角度来了解业务运转的过程,所以这时候就需要做业务模型。理解业务模型需要先理解以下几个概念:
业务主体主要有 业务执行者、业务工人、业务实体。
要理解这三个对象,我们首先需要知道什么是业务,业务是指一个组织可以向组织外的人提供服务。 业务执行者(Business Actor) :组织外的人,来享受这个服务的人就称为业务执行者; 业务工人(Business worker) :提供业务的 组织的内部支撑人员 业务实体(Business Entity) :提供业务的 组织的内部信息系统
理解这几个概念还是有点拗口,我们来看看下面一张图,一个餐厅对象的业务建模
右边大的黑框是提供业务的组织,是餐厅;图的左边是个业务执行者,是顾客;而在餐厅内部又分为业务工人(领位员、点餐员、厨师等),业务实体(餐厅点餐管理系统)
我们在做业务建模时需要注意,所有业务对象在圆圈的右下方需要有个斜线,这是一个建模规范。
概念:组织对外提供的业务服务
一个银行是一个提供业务的组织,这就是业务用例,考察的对象是银行这个组织而不是系统。
业务用例是最基本的定义,而要分析业务动态的过程就需要业务流程,我们一般用时序图来表示。
餐厅现状的业务流程
这时候所有的动作步骤全部靠人参与
建设系统后的业务流程
有了系统后系统可以承担一部分工作,有了系统能改善业务流程、提高价值、降低成本,这就是 建设系统的价值以及意义 ,否则就没必要做系统建设了。
在准备做一个系统之前需要先分析业务,将业务理解清楚。理解业务既有静态的理解(领域模型)又有动态的理解(业务流程),只有将业务理解清楚才能做出良好的系统。
需求分析是需求工程的环节,整个需求工程分为两大块
前期主要是做需求开发,包括需求调研、需求分析、需求定义;后期需要做需求管理,包括需求确认、需求跟踪、需求变更控制。
咱们架构师主要聚焦在 需求分析 和 需求定义 两个环节。
需求分析阶段是由系统分析师 基于业务分析师输出的领域模型、业务模型 再结合 需求调研成果 输出需求分析阶段的成果,主要包括 系统上下文, 功能型需求(用例模型) 和 非功能性需求(性能等)。
系统上下文是指系统与周边用户和其它系统之间的关系
系统上下文的绘制很简单,就是将准备开发的系统画在中间,把用户和对接的周边系统画出来这就叫系统上下文。
系统用例是指系统被使用的案例,主要是从业务流程中推导出来,系统用例的命名规范主要是使用动词短语,如:添加用户、查询话费等短语。
我们可以对系统用例细化,如上对登记入座信息这一用例进行细化
主要是确定一些非功能性需求,比如:可用性、 性能、 安全性、 经济性、可扩展性、 可伸缩性、可移植性等等 可用性、性能、安全性是需要重点关注的内容,我们后期专门拿出来讲。
前面的业务分析与需求分析一般是由其他专人来做,那么这一块的内容则是架构师的工作,需要重点关注。
在系统简单时我们需要从 功能角度 对系统进行分解和拆分,这个时候我们只要做下概要设计和详细设计就可以。 在复杂系统时我们需要从 组件角度 对系统进行分解和拆分,这个时候我们就需要做架构设计与概要设计。
组件是架构设计阶段考虑的单元(进程级别),功能、模块是概要设计、详细设计考虑的单元;一个组件可包含多个模块,涉及多个功能;一个功能的实现可能需要多个组件中的相应模块来协作完成。
我们用一张图来理解他们三者之间的关系
前后端分离的一个项目从进程角度划分出三个组件,分别是web前端、后端接口服务、后台服务, 为了实现用户查询这个功能必须要在相应组件里都需要有相应的模块
一个组件里可以有多个不同的模块,各个组件里的模块相互协作完成某一个功能
如果用一句话来描述什么是架构,那应该可以这样定义:架构是系统的内部结构(组件以及它们之间的关系)还要包含系统的技术要素。做架构设计其实就是干这两件事。
架构设计有两个目标:
架构设计阶段是由系统架构师 参照需求分析的产物(SRS),再通过对系统分析师、项目经理的咨询输出架构设计阶段的成果,主要包括 架构工作计划 、 逻辑架构、物理架构、开发组件一览表、部署组件一览表、技术选型一览表
那如何来衡量一个架构的设计好坏呢?
在设计完成时我们可以通过设计资料的规范性以及设计思路、方案决策、技术选型的合理性来校验; 在系统实现后可以通过功能性和非功能性需求的满足程度来校验。
我们看一个典型的逻辑架构
我们看一个典型的物理架构
架构设计为系统的总体设计,决定了系统的组件划分、关键技术方案决策、技术选型 架构设计上接需求,下接进一步的设计和实现,是决定系统实现的质量、效率、成本的关键阶段
概要设计阶段的主要内容是进行功能模块划分以及接口定义(接口名称、功能概要、参数、返回值)
概要设计阶段是由开发组长 基于系统用例、开发组件一览表 再结合对架构师和系统分析师的咨询输出概要设计阶段成果,主要包括 功能一览表 , 接口说明书。
详细设计阶段的主要内容是描述内部模块实现、界面设计以及数据库设计
详细设计阶段可能会根据工作内容进行分工,主要结合之前的产出输出详细设计阶段的成果,主要包括 界面设计 , 模块内部设计 , 数据库设计。
开发阶段主要是由开发人员结合架构设计的产物以及详细设计的产物编写相应代码。
测试阶段主要是由测试人员结合架构设计的产物以及详细设计的产物进行功能测试,包括功能性需求以及非功能性需求,需要对外输出 测试计划,测试用例 以及 测试报告。
部署阶段主要是由部署人员结合架构设计的产物以及跟开发人员的咨询进行组件部署,这一阶段需要输出部署计划、部署方案、部署手册、部署脚本、部署实施 等
运维阶段主要是由运维人员结合架构设计的产物进行系统运维,需要输出运维计划、运维方案、运维手册、运维脚本、运维报告 等。
以上,希望对你有所帮助!
End
干货分享
这里为大家准备了一份小小的礼物,关注公众号,输入如下代码,即可获得百度网盘地址,无套路领取! 001:《程序员必读书籍》 002:《从无到有搭建中小型互联网公司后台服务架构与运维架构》 003:《互联网企业高并发解决方案》 004:《互联网架构教学视频》 006:《SpringBoot实现点餐系统》 007:《SpringSecurity实战视频》 008:《Hadoop实战教学视频》 009:《腾讯2019Techo开发者大会PPT》
010: 微信交流群