架构设计深入学习02-概念架构与细化架构
胜兵先胜而后求战,败兵先战而后求胜—《孙子兵法》。
这部分有些内容比较陈旧,但原理和思路还是一致的。
通常来说,概念架构满足"架构=组件+交互"且只关注高层组件,之后对齐进行笼统的界定,给为他们之间的关心,此外,概念架构不涉及接口细节。这儿需要牢记的是,重大需求塑造概念设计,这儿的重大需求就是预架构中的功能、质量及约束3类需求中的关键部分。
概念架构阶段的3个步骤
初步设计:基于关键功能,借助鲁棒图进行以发现职责为目的的初步设计,对于新系统很重要。
高层分割:对系统黑盒进行切分,可以借助架构模式。
考虑非功能需求,通过"目标-场景-决策表"分析非功能需求。
初步设计的主要任务是发现职责,可以借助"职责协调链"。在分析直接协调链时,首先需要引入一个工具,鲁棒图,其包含3中元素,分别是边界对象,控制对象和实体对象。(由于VISIO不支持,这个图就忽略了,可以用序列简图表述)
高层分割:首先一个系统分割为项目交互的几个系统,之后将每个系统分化为多个子系统(不必须,一切都需根据情况,不要过度设计)。这儿的子系统通常就是分层(layer),如下图所示。
Tip: Layer表示逻辑分层, Tier表示物理分层(比如数据库服务器,Web服务器,应用服务器等的分离)。
考虑非功能需求:比如对于持续可用性的要求,就需要数据库服务器配置故障转移集群,Web服务器负载均衡。
架构设计一门解决复杂问题的艺术,因此"分而治之"的思想一定不能少,在该阶段,通常使用多视图的方法来展示架构思想,其特点是:利于思考(分而治之),便于交流(分离了关注点)。得到广泛认可的是RUP4+1视图,不过这儿重要的是思想(每个思维角度,一个视图),不是必须要提供指定的4+1视图(逻辑视图、部署视图、进程视图、实现视图和用例图),最后的Tip中展示了自身日常做项目中的视图方式。
在此,将按照温昱思路,介绍一下他的五视图,作为实践的参考。
逻辑架构:主要工作包括划分子系统、定义接口等,通常借助接口-包图来表述。划分子系统的方法包括分层的细化、分区的引入、机制的提取。
其相关原则为:职责不同的单元划归不同的子系统;通用性不同的单元划归不同的子系统;需要不同开发技能的单元划归为不同子系统(前天、后台、高保真);兼顾工作量的相对均衡,进一步划分太大的子系统(项目管理的80小时原则)。此外,定义接口时一定不能自说自话,需要足够的沟通。
运行架构:在涉及大量并发时,需要考虑,不常用。
开发架构:这部分主要是开发语言、相关框架的选择,项目文件的结构和形式,在实际中很重要,统一和合理的结构可以大幅挺好开发和沟通效率。在软件开发中,维护成本实际上是最大的,因此合理的重用非常重要,其优先级为重用完成APP-》重用框架-》重用库和程序=》重用标准算法和设计模式。
物理架构:这部分的思维重点是"开销"和"争用",因此架构的目标就是降低开销和避免征用。
数据架构:数据的分布方案是一个难点,通常可以借助一下6个策略。
3个应用原则:把握系统特点,决定分布策略(合适原则);不同分布策略,可以综合应用(综合原则);对"对么""好么"进行评估(优化原则)。
Tip:
在实际的项目中,实际的架构情况如下图所示,至于细节的服务契约定义(依据序列图发现接口)和数据库的详细设计(依赖PRD发现所需字段)等都可以和一线开发经理一起决定。
参考资料
- 温昱. 一线架构师实践指南[M]. 北京:电子工业出版社, 2011.
- OpenDaylight Lithium版本简单应用及流表操作指南
- 碎片化 | 第四阶段-55-OpenSessionInViewFilter组件配置解决session问题-视频
- 入门Webpack(上)
- 碎片化 | 第四阶段-56-ManyToOne和OneToMany映射关系-视频
- 基于网络流量的SDN最短路径转发应用
- 碎片化 | 第四阶段-57-hibernate二级缓存-视频
- NoSQL篇 | NoSQL从小白到码神 之 Redis篇
- Neutron和ONOS集成实践
- 基于OpenDaylight和OVSDB搭建VxLAN网络
- 史上最强----机器学习经典总结---入门必读
- SDNLAB群分享(四):利用ODL下发流表创建VxLAN网络
- Neutron集成ONOS源码分析
- “访问限制”&“代理访问”实验
- OpenDaylight Lithium-SR2 Cluster集群搭建
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- S1到S9,545名职业选手,有多少人折戟全球总决赛?
- 「R」数据可视化21: Edge Bunding图
- 一个服务器能干什么?
- 按照说明做了 ,还是没有点亮网关,一直离线模式
- iOS音视频接入-快速集成TRTC SDK
- 基于Flink快速开发实时TopN程序最简单的思路
- MySQL+Flask,在本地实现一个API接口。
- Java新特性:数据类型可以扔掉了?
- 使用Flask在服务器实现一个API接口。
- 深入理解谷歌最强V8垃圾回收机制
- 用Python下载抖音无水印视频!
- 多年管理系统开发经验总结~代码解决方案
- 分析B站100万+视频,发现竟然有这么多干货资源。
- Pandas,数据处理的好帮手!
- 如何用Python,制作疫情可视化大屏?