如何做架构设计? | 京东云技术团队
也许您对软件设计存在一些疑惑,或者缺乏明确思路,那么本文将非常适合您。
1、设计很重要
我们可以看一下周边的事物,那些好的东西,他们并不会天然存在,都是被设计出来的,因此设计就是创造和改善事物的重要过程。设计的重要之处在于,最初的设计往往决定最终的结果,甚至决定着事物的长期的发展。例如两个品牌的手机之间,他们可以使用同一个代工厂,但他们差异在设计时就已经决定了。
架构设计也是如此,我见过很多的软件系统,他们经过了很多年的演进,在没有完全重构的情况下,始终无法改变最初设计模样,最初的设计决定了长期的发展。而对于业务深度耦合的系统,重构成本非常高,风险也非常大,变化也更加不确定,所以要更加重视设计。
我们要寻求更好的技术方案,推动架构的良性演进,每一步都是经过深度思考的,而架构设计方法就是帮助我们思考的框架。
通过做架构设计,我们应该提升软件的质量和效率,降低风险和成本。
2、架构设计的目的是什么?
是为了解决软件系统复杂度带来的问题(架构的目标是用于管理复杂性、易变性和不确定性,以确保在长期的系统演化过程中,一部分架构的变化不会对其它部分产生不必要的负面影响。这样做可以确保业务和研发效率的敏捷,让应用的易变部分能够频繁地变化,对应用的其它部分的影响尽可能地小。)
要解决复杂度问题,首先需要识别复杂度的来源,主要集中在以下三个方面:
业务复杂度:流程多,参与者多、状态和变量多等;由业务本身决定,但业务复杂不代表软件系统复杂,例如工作流引擎并不复杂,但他可以做非常复杂的业务,在面对复杂业务时,我们常使用抽象思维,不要让软件逻辑与业务逻辑绑定在一起。
技术复杂度:高性能、高可用、高可扩展、安全,成本、规模等;这部分复杂度常常由技术本身决定,也应该由技术本身解决,通常是采用更合理的框架和工具;避免这些技术特性穿透到应用层。也可以有所取舍,在不同业务情况下,采用不同的实现程度。
设计复杂度:职责不是最小的完备的、概念不清晰的、层次不清的、业务逻辑与技术实现绑定的,组件过多以及关联依赖复杂的;这部分是由设计不合理导致的,也是对业务系统影响最大的一部分,要通过良好的设计来解决。
3、架构设计的主要内容是什么?
找到系统中的元素并搞清楚他们之间关系(如果我们不知道系统是怎么运行的,那么他一定是很复杂的。对于庞大的软件系统,如何才可以被掌控?这就需要将大系统分解为很元素,每个元素需要足够简单,并且元素与元素之间的关系清晰)
软件架构是一种结构,结构中包含了一些元素和元素之间的关系描述;
元素的种类:系统、子系统、模块,组件、服务、类、接口...
关系的种类:层次关系、数据关系、调用关系、影响力关系...
"架构表示对一个系统的成型起关键作用的设计决策,架构定系统基本就成型了,这里的关键性可以由变化的成本来决定。"-- Grady Booch. )
"Architecture represents the significant design decisions that shape a system, where significant is measured by cost of change." -- Grady Booch.
4、架构设计有什么原则?
合适原则:“合适优于业界领先”。 真正优秀的架构都是在企业当前人力、条件、业务等各种约束下设计出来的,能够合理地将资源整合在一起并发挥出最大功效,并且能够快速落地。
简单原则:“简单优于复杂”。 优先使用直接的不复杂的方案解决问题;
演化原则:“演化优于一步到位”。软件需要根据业务的发展不断地变化,架构要不断地在实际应用过程中迭代,在某个阶段必定有所取舍,但架构的演化必须是低成本的,当业务发生变化时能够最高效的迭代;在这个过程中修复缺陷的设计,积累优秀的设计;
5、架构师的职责是什么?
业务分析:梳理对业务和技术的理解和判断、形成业务领域知识、明确的业务目标和本质的业务诉求;
系统建设:降低系统复杂性、规划系统远期架构、推动架构的合理演化;
技术方案:选择合适的技术、提供对业务的解决方案,把控全局,包括质量、效率、成本、风险;
关键问题:攻克难点,解决关键问题,指导研发落地;
知识沉淀:以体系化的表达方式,面向不同人员的视图语言,持续完善知识系统;
6、架构设计过程如何?
过程:全局分析业务 → 设计方案 → 概要设计 → 详细设计 → 补充设计
视角:业务级 → 系统级 → 应用级 → 模块级 → 技术级 → 代码级 → 实施级;
架构师的协作链路较长,每一个过程都应该留下资料,越下游的角色往往需要更全面的资料;架构设计文档应该包含架构师参与的所有环节,以及这些环节产生的图文说明;不仅仅是空洞的结果,应该包含架构师的思路和想法;
全局分析阶段
这阶段需要对业务需求进行全面分析,需要将名词罗列出来,区分名词是功能、流程、名词、参与者的哪一种。再通过分析业务的本质并找到其中的关键名词,关键的名词被称之为领域,可以围绕关键的领域构建业务模型;
在这个过程中,需要统一语言、识别核心领域、按照相关性将功能归属到对应的领域,对领域之间的关系做出必要的描述,输出物是名词与解释、领域以及拥有的能力,业务架构。
名词的概念必须是清晰的,领域的职责必须是明确的,领域拥有的能力必须是相关的;
其中业务架构可按照场景层、功能层、领域层、依赖层划分,例如下图;
设计方案阶段
在完成全局分析之后,我们应该设计技术方案,尽可能提供多个备选方案的图文说明。需要对备选方案做充分的优劣分析,最终取舍一项最合适的方案,没有被选择的方案(或者取舍的部分)也要被说明;
我们需要找到各项约束条件(时间、人力、硬件等),评估在约束条件允许的情况下,哪个备选方案更合适,我们可能考虑如下方面:
方案对业务影响:主要判断需求覆盖程度、实现业务的短期目标、考虑业务的长期目标;
方案的技术需求:安全是否满足、性能是否满足、规模是否满足、可维护性;
方案的可扩展性、方案的复杂程度、方案是否能够演进、方案演进成本如何(高成本的 慎重考虑)、方案的影响力传播如何(对上下游影响较大的 慎重考虑);
架构设计阶段-应用架构
用以说明当前系统的元素(系统、子系统、模块,组件)以及他们之间的关系(层次关系、依赖关系)
重点是将可复用的组件抽象后下沉,越往下层越是稳定和通用,由上层承接不稳定的业务;
应用架构图体现了层次关系,以及不完全体现了依赖关系,依赖只能是上层依赖下层,示例如下图
架构设计阶段-部署架构
用以说明支持应用所需要的硬件能力、以及外部中间件、网络、机房等情况;可参考下面两张图;
架构设计阶段-数据架构
描述数据资产结构、存储、流转、灾备的情况;最常用的是ER图;
架构设计阶段-技术架构
描述一些关键技术的说明,比如性能、安全、交互等;
描述技术选型和代码框架的说明,比如DDD推荐的菱形对称架构,文字和图片描述都可以;
详细设计阶段
详细设计是对质量的把关、是对研发落地的指导;
这部分涉及的内容较多,比如服务、事件、接口、实体和值对象、时序图、数据库设计等等;
领域服务、领域事件
时序图
实体关系图
7、有什么方法能做的更好?
学习和使用领域驱动设计,使用正确的方法梳理和理解业务,并落实到架构过程;
尽早的介入,从业务领域建模和在产品方案阶段介入、推动领域知识的传递、为后续做好铺垫;
积累业务能力和洞察力,需要识别关键部分与辅助部分、预料可扩展部分与不变部分,识别水平能力与垂直扩展;
对于架构设计产物,不要只画图,多辅以文字表述图中内容;
8、还需要掌握什么知识?
业务知识:业务架构(是对当前业务、领域、能力、流程、参与者、场景的介绍),现状架构(是对当前架构的描述,可以包含应用架构、技术架构、部署架构、数据架构等),愿景架构( 是架构应该演进到的完美情况),存在问题(现在面对的痛点、无用部分、缺陷部分)
高性能:多线程、队列、缓存、分片、异步化,前置化、静态化、预处理;
高可用:限流、降级、冗余、灾备、回滚、灰度;
扩展性:多态、防腐,依赖反转(业务身份、扩展点、SPI),抽象化(比如流程引擎、规则引擎等)、事件驱动、设计模式;
本文部分图片来源于互联网
作者:京东科技 董健
来源:京东云开发者社区

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
分析全志Tina打包流程,并在buildroot上来实现打包生成tina镜像,支持PhoenixSuit烧写
Tina里面所有的 downloadfile文件 都是我们编译出来要烧写的文件。所以只需要把相应的文件放到这个目录下,就可以进行打包操作了。 如果你在不改变 文件大小的前提下,可以直接执行tina-d1-h/tools/pack-bintools/src/dragon image.cfg sys_partition.fex 命令,你会发现它生成了一个 tina_d1-h-nezha_uart0.img,镜像,这个镜像是和使用pack命令打包生成的一样。 那么这里面还有一个 img.cfg文件。这个文件里面包含了很多 fex二进制文件,目前我认为这些文件都是和全志官方的烧写工具绑定死的,所以不用管它,只要制作的时候 当前目录下有这些工具即可。 有了这两个文件以后,就可以直接使用 dragon打包生成可以用 凤凰烧写器 烧写的系统镜像啦。 sys_partiton分析 如果你的系统镜像格式 一直保持大小不变,那么上面这个命令 就可以一直用,但是这个时候 我想自己编译内核 增加 驱动模块,编译文件系统 增加组件 导致系统镜像变大了 这要怎么办? 简单点,直接修改 sys_partition....
- 下一篇
jvm中类和对象定义存储基础知识 | 京东云技术团队
1 类文件数据结构类型 Class文件结构主要有两种数据结构:无符号数和表 •无符号数:用来表述数字,索引引用、数量值以及字符串等,比如 图1中类型为u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节的无符号数 •表:表是有由多个无符号数以及其它的表组成的复合结构,比如图1中类型以_info结尾的项为表类型。 2 类结构定义 Class类文件是紧凑、顺序、无空隙的,魔数(MagicNumber)、Class文件版本(Version)、常量池(Constant_Pool)、访问标记(Access_flag)、本类(This_class)、父类(Super_class)、接口(Interfaces)、字段集合(Fields)、方法集合(Methods )、属性集合(Attributes)。其中因为java多继承所以interfaces接口类型为数组;attribute_info则是方法表中定义的code索引,指向具体的方法体字节码。如图1所示。 下面用一段程序做说明,此类有接口,有方法、类变量和实例变量,机器是如何识别字节码然后按照上面的规则来定义此class类呢? pa...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果