已有171人围观 来源:架构之家 发布于:2021-03-29 08:30:08

当我们想用一张或几张图来描写我们的体系时,是不是经常遇到以下情形:

· 对着画布无从下手、删了又来?

· 如何用一张图描写我的体系,并且让产品、运营、开发都能看明确?

· 画了一半的图还不清晰受众是谁?

· 画出来的图到底是产品图功效图还是技巧图又或是大杂烩?

· 图上的框框有点少是不是要找点儿框框加进来?

· 布局怎么画都不满意……


如果有同样的迷惑,本文将介绍一种画图的办法论,来让架构图更清晰。

先厘清一些基本概念

1、什么是架构?

架构就是对体系中的实体以及实体之间的关系所进行的抽象描写,是一系列的决策。

架构是构造和愿景。

体系架构是概念的体现,是对物/信息的功效与情势元素之间的对应情形所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。

做好架构是个庞杂的义务,也是个很大的话题,本篇就不做深刻了。有了架构之后,就须要让干系人懂得、遵守相干决策。

2、什么是架构图?

体系架构图是为了抽象地表现软件体系的整体轮廓和各个组件之间的相互关系和束缚边界,以及软件体系的物理安排和软件体系的演进方向的整体视图。

3、架构图的作用

一图胜千言。要让干系人懂得、遵守架构决策,就须要把架构信息传递出去。架构图就是一个很好的载体。那么,画架构图是为了:

· 解决沟通障碍

· 达成共鸣

· 减少歧义

4、架构图分类

搜集了很多资料,分类有很多,有一种比拟风行的是4+1视图,分离为场景视图、逻辑视图、物理视图、处置流程视图和开发视图。

★ 场景视图

场景视图用于描写体系的参与者与功效用例间的关系,反应体系的最终需求和交互设计,通常由用例图表现。


★ 逻辑视图

逻辑视图用于描写体系软件功效拆解后的组件关系,组件束缚和边界,反应体系整体组成与体系如何构建的进程,通常由UML的组件图和类图来表现。

★ 物理视图

物理视图用于描写体系软件到物理硬件的映射关系,反应出体系的组件是如何安排到一组可盘算机器节点上,用于指点软件体系的安排实行进程。


★ 处置流程视图

处置流程视图用于描写体系软件组件之间的通讯时序,数据的输入输出,反应体系的功效流程与数据流程,通常由时序图和流程图表现。


★ 开发视图

开发视图用于描写体系的模块划分和组成,以及细化到内部包的组成设计,服务于开发人员,反应体系开发实行进程。


以上 5 种架构视图从不同角度表现一个软件体系的不同特点,组合到一起作为架构蓝图描写体系架构。

怎样的架构图是好的架构图

上面的分类是前人的经验总结,图也是从网上摘来的,那么这些图画的好不好呢?是不是我们要依葫芦画瓢去画这样一些图?

先不去管这些图好不好,我们通过对这些图的分类以及作用,思考了一下,总结下来,我们以为,在画出一个好的架构图之前, 首先应当要明确其受众,再想清晰要给他们传递什么信息 ,所以,不要为了画一个物理视图去画物理视图,为了画一个逻辑视图去画逻辑视图,而应当依据受众的不同,传递的信息的不同,用图精确地表达出来,最后的图可能就是在这样一些分类里。那么,画出的图好不好的一个直接尺度就是:受众有没有精确吸收到想传递的信息。

明确这两点之后,从受众角度来说,一个好的架构图是不须要说明的,它应当是自描写的,并且要具备一致性和足够的精确性,能够与代码相呼应。

画架构图遇到的常见问题

1、方框代表什么?


为什么实用方框而不是圆形,它有什么特别的含义吗?随便应用方框或者其它形状可能会引起混杂。

2、虚线、实线什么意思?箭头什么意思?色彩什么意思?


随便应用线条或者箭头可能会引起误解。

3、运行时与编译时冲突?层级冲突?


架构是一项庞杂的工作,只应用单个图表来表现架构很容易造成莫名其妙的语义凌乱。


本文推举的画图办法


C4 模型应用容器(运用程序、数据存储、微服务等)、组件和代码来描写一个软件体系的静态构造。这几种图比拟容易画,也给出了画图要点,但最症结的是,我们以为,它明确指出了每种图可能的受众以及意义。

下面的案例来自C4官网,然后加上了一些我们的懂得,来看看如何更好的表达软件架构

1、语境图(System Context Diagram)


这是一个想象的待建设的互联网银行体系,它应用外部的大型机银行体系存取客户账户、交易信息,通过外部电邮体系给客户发邮件。可以看到,非常简略、清晰,信任不须要说明,都看的明确,里面包括了须要建设的体系本身,体系的客户,和这个体系有交互的周边体系。

★ 用处

这样一个简略的图,可以告知我们,要构建的体系是什么;它的用户是谁,谁会用它,它要如何融入已有的IT环境。这个图的受众可以是开发团队的内部人员、外部的技巧或非技巧人员。即:

· 构建的体系是什么

· 谁会用它

· 如何融入已有的IT环境

★ 怎么画

中间是自己的体系,周围是用户和其它与之相互作用的体系。这个图的症结就是梳理清晰待建设体系的用户和高层次的依附,梳理清晰了画下来只须要几分钟时光。

2、容器图(Container Diagram)

容器图是把语境图里待建设的体系做了一个展开。


上图中,除了用户和外围体系,要建设的体系包括一个基于Java Spring MVC 的 Web 运用供给体系的功效入口,基于xamarin架构的手机 app 供给手机端的功效入口,一个基于 Java 的 API 运用供给服务,一个 MySQL 数据库用于存储,各个运用之间的交互都在箭头线上写明了。

看这张图的时候,不会去关注到图中是直角方框还是圆角方框,不会关注是实线箭头还是虚线箭头,甚至箭头的指向也没有引起太多注意。

我们有许多的画图方法,都对框、线的含义做了定义,这就须要画图的人和看图的人都清晰的懂得这些定义,能力读全图里的信息,而现实是,这往往是非常高的一个请求,所以,很多图只能看个大概的含义。

★ 用处

这个图的受众可以是团队内部或外部的开发人员,也可以是运维人员。用处可以罗列为:

· 展示了软件体系的整体形态

· 体现了高层次的技巧决策

· 体系中的职责是如何散布的,容器间的是如何交互的

· 告知开发者在哪里写代码

★ 怎么画

用一个框图来表现,内部可能包括名称、技巧选择、职责,以及这些框图之间的交互,如果涉及外部体系,最好明确边界。

3、组件图(Component Diagram)


组件图是把某个容器进行展开,描写其内部的模块。

★ 用处

这个图重要是给内部开发人员看的,怎么去做代码的组织和构建。其用处有:

· 描写了体系由哪些组件/服务组成

· 厘清了组件之间的关系和依附

· 为软件开发如何分解交付供给了框架

4、类图(Code/Class Diagram)


这个图很显然是给技巧人员看的,比拟常见,就不详细介绍了。

案例分享

下面是一个实时数据工具的架构图。作为一个应当自描写的架构图,这里不多做说明了。如果有看不明确的,那确定是还画的不够好。


画好架构图可能有许多办法论,本篇重要介绍了C4这种办法,C4的理论也是不断进化的。但不论是哪种画图办法论,我们回到画图初衷,更好的交换,我们在画的进程中不必被条条框框所限制。简而言之,画之前想好:画图给谁看,看什么,怎么样不说明就看懂。