如何画好一张架构图?
01
明确架构方向:架构图可以帮助技术团队明确产品和技术的方向和目标,避免在开发过程中迷失方向或者偏离主题。 降低沟通成本:将系统逻辑关系以图形化的形式呈现出来,具有图形化、可视化的特点,使得团队更加直观地了解产品的设计和功能,尽快达成共识、减少歧义; 提升协作效率:团队内部和团队之间的协作、沟通、愿景和指导。通过架构图可以更好地给项目成员进行宣讲。开发人员可以更加清晰地了解产品的整体结构和各个模块之间的关系,从而提升开发效率。 方便协同工作:架构图可以让团队成员快速了系统的全貌和细节,方便不同部门之间的协同工作。
参与项目的各团队各角色(业务、产品、开发、测试等); 项目之外的客户(外部客户,外部评审专家); 各层次 TL(汇报,跨 BU,跨团队协作沟通)。
02
结构清晰:观点明确、层次分明、内容清晰。用户轻易看出架构图表达的观点/关系/思想/逻辑 。通过架构图,各个团队了解业务、应用整体大局。 外表美观:用户看得舒服,有更多的浏览欲/阅读欲,通过不同颜色和布局来体现美观:图例清晰,颜色类型统一,美观。 内容完整明确:一张图内容自闭环,获取到业务/功能/模块的主要内容。 内容术语一致、信息粒度大小一致。
亲密性:实现组织性(让有关系的元素挨在一起,有区别的元素分开); 对齐:使页面统一而且有条理(元素与元素之间存在一些对齐效果); 对比:增强页面的效果、有助于信息的组织(元素与元素之间存在一些对比效果); 重复:更统一,增强视觉效果(让类似的元素存在一样的效果/样式)。
美术三原色:红黄蓝(在三色场景下,应用最多最广泛的颜色); 互补色:一种作为主色,另一种作为强调(在二色场景下,用互补色); 等距三色组:会让人愉悦的颜色组合(在三色场景下,使用等距三色组具有愉悦感); 采用同层级的颜色:具有和谐感的颜色组合(在多色场景下,采用同层级的颜色更具和谐)。
黄金分割:0.618(图的整体大小采用长1.618宽1的黄金比); 婓波那契数列:1,1,2,3,5,8,13,21,34,55,89……,当趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618。
思考先行:以终为始的设计。 列出所有要素:所有能帮助看图人理解的元素都要有,包括图例标注、箭头顺序、标题、注解。 用户为先:把自己当作看图人,在没有上下文的情况下能获取到图中多少信息。
03
04
系统级,即整个系统内各部分的关系以及如何治理:分层。 应用级,即单个应用的整体架构,及其与系统内单个应用的关系等。 模块级,即应用内部的模块架构,如代码的模块化、数据和状态的管理等。 代码级,即从代码级别保障架构实施。
业务架构图:业务规划、业务模块、业务流程等。 应用架构:微服务拆分的应用和层次划分。 技术架构:涉及哪些组件以及它们之间的联系。 代码架构:应用内部包图、类图 ; 某个领域:实体图、时序图、状态图、用例图等等。
05
业务建模,是从小到大,从局部到整体,自底向上的归纳、演绎的抽象过程; 系统建模,是从大到小,从整体到局部,自顶向下的拆解、切分的抽象过程; 但不绝对,自上而下和自下而上,往往在过程中是随意切换的。
通过不同颜色来标识不同角色。 通过连接线来表示关系。 逻辑分组。
方框、各种形状、虚实线、箭头、颜色(不同颜色代表什么意思)和文字内容; 虚实线表达什么?组件类型,模块类型,层,服务,需要考虑是否已经实现等?不同状态的标识怎么传递? 箭头表达什么?数据流或关联关系? 交互类型可以是同步或异步的;关联类型可以是指依赖、继承、实现。
方框之间的直线表示模块的调用关系; 尾部是空心圆箭头表示传递的是数据; 尾部实心圆箭头表示传递的是控制信息。
06
业务平台化,相互独立,例如交易平台、物流平台、支付平台、广告平台等。 基础业务下沉、可复用:例如用户、商品、类目、促销、时效等。
交易平台的作用是让买家和卖家签订交易合同,所以需要优先保证高可用,让用户能快速下单。 履约业务对可用性没有太高要求,但要优先保证一致性。 秒杀业务对高并发要求很高,应该和常规业务分离。
梳理业务流程,形成闭环: 梳理业务闭环和理清逻辑关系; 业务闭环:用户使用产品的闭环流程基于用户的某个需求或问题,梳理用户使用的业务流程,梳理参与此模块的用户、角色、场景,将核心流程完整的表述出来,形成闭环。 提取业务需求: 基于核心业务流程,根据用户的使用场景列出功能模块。关键是想清楚每个功能模块解决什么核心问题。 确定功能模块的逻辑关系: 基于以上梳理出来的功能模块,将类似的、相关联的功能以模块化的形式形成一张简单的矩阵图,将功能模块进行聚合分类。通常按照交互层(入口)、业务层(具体业务环节)、基础服务层(登录、设置等)、数据层(底层服务或数据)进行归纳整理。
通过不同颜色来标识业务状态:比如说哪些业务发展状态好,哪些问题比较多,哪些比较稳定,哪些竞争比较激烈等。 业务分组管理:将类似的业务放在一个分组里面展现,用虚线框或者相同背景将其标识出来。 区块对齐:为了美观,可以改变不同区块的长短大小进行对齐,让整体看起来更美观。
07
一切以稳定为中心。 架构尽可能简单、清晰,追求小而美,不要大而全。 不过度设计。
将稳定部分与易变部分分离。 将核心业务与非核心业务分离。 将电商主流程和辅助流程分离。 将应用与数据分离。 将服务和实现细节分离。
应用抽象化:应用只依赖服务抽象,不依赖服务实现的细节和位置。 数据库抽象化:应用只依赖逻辑数据库,不需要关心物理库的位置和分片。 服务抽象化:应用虚拟化部署,不需要关心实体机的配置,动态调配资源。
跨域调用异步化:在不同的业务域之间尽量异步解耦。 非核心业务尽量异步化:在核心业务和非核心业务之间尽量异步化。 在必须同步调用时,需要设置超时时间和任务队列的长度。
服务自治:服务能彼此独立修改、部署、发布和管理,避免引发连锁反应。 集群容错:应用系统集群部署,避免单点服务。 多机房容灾:多机房部署、多活。
08
复用粒度是有业务逻辑的抽象服务,不是服务的实现细节。 服务引用只依赖服务抽象。
跨业务域调用,尽可能异步解耦。 在同步调用时设置超时时间和队列大小。 将相对稳定的基础服务与易变流程服务分离。
服务可降级。 服务可限流。 服务可开关。 服务可监控。 白名单机制。 制定服务契约。
基础服务下沉、可复用,例如时效、库存和价格计算。 基础服务自治、相对独立。 对基础服务的实现要精简,并可水平扩展。 对基础服务的实现要进行物理隔离,包括基础服务相关的数据。
09
10
应用系统只依赖逻辑数据库。 应用系统不直接访问其他应用的数据库,只能通过接口访问。
将访问量大的数据库做读写分离,例如订单库。 将数据量大的数据库做分库分表。 将不同业务域的数据库做分区隔离。 对重要的数据配置备库。
📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~
(长按图片立即扫码)