根据《从零开始学架构》课程整理和摘要
0、我的理解
架构,就是框架结构,比如盖一栋房子的钢筋框架即是架构,软件架构即是软件的整体的结构性的东西,一栋房屋的结构决定了房屋结不结实、大体外观、能不能满足居住要求;同样软件架构决定了整个软件是不是高可用的、性能好不好、能不能解决现实的问题。
1、系统
问题:
1、架构和框架有什么区别?
2、Linux有架构、mysql有架构、JVM架构、使用这些系统开发的业务系统也有架构。应该关注什么架构?
3、微信整体有架构、微信登录系统也有架构、支付系统也有架构,我们谈微信架构的时候,主要谈什么架构?
为了理解架构的概念,文中先梳理了几个核心而又相似概念。
软件架构有时候也叫系统架构,那么系统是什么?作者提出几个系统定义的关键内容:
1、关联
系统是由一组有关联的个体组成,比如车轮子、方向盘、车架组成了骑车。没有关联的个体放在一起不能称为一个系统。
2、规则
系统内个体需要按照指定的规则运行,而不是各自为政。规则规定了系统内个体的分工和写作方式。
如:汽车发动机负责产生动力,然后通过变速器和传动轴将动力输出到车轮子上,从而驱动汽车前进。
3、能力
系统能力与个体能力有差别,系统能力不是各个个体能力之和,二是产生了新的能力。
如:汽车能够载重前行,而它的部件显然不具备这种能力。
子系统定义:子系统也是由一组关联的个体组成,根据特定规则运行,完成单个个体不能完成的工作。
通过这个定义你也可以了解到,其实系统和子系统只是看的视角不同,一个系统从更大的系统来看它就是个子系统;比如:
1、微信本身是个系统,它包括聊天、登录、支付、朋友圈等子系统。
2、朋友圈这个系统又包括动态、评论、点赞子系统。
3、评论这个系统可能又可以分为防刷子系统、审核子系统、存储子系统、
4、评论子系统可能不能进一步划分了,而是包括各个模块或组件,模块或组件又是另外一个维度的系统,比如MySQL、Redis等是存储子系统、但不是业务子系统。
2、模块与组件
这两个概念常容易混淆、主要两者的定义不好理解,模块和组件都是系统的组成部分,只是从不同的角度来拆分系统而已。
从逻辑角度来拆分、得到的就是模块;从物理角度来拆分,得到的单元就是组件。
划分模块的目的是为了职责分离、划分组件的目的是为了单元复用。组件在英文中为componet翻译成中文也有零件的意思,零件比较好理解,独立且可替换。
(到这里面让我想到了我们常画的图,有时候是模块与组件混合,还是没有理解这两个概念造成的,对于设计文档来说,我们以模块为单元画架构图合适,对于外部的介绍,用组件构成的架构图更合适)
以一个网站系统来说,假设做一个学生信息管理系统。这个系统从逻辑角度来说,可以分为登录注册模块、个人信息模块、个人成绩模块;从物理角度来拆分,可以拆分为Nginx、Web服务器、MySQL。
3、框架和架构
框架和架构也是相似的概念,而两者具有较强的联系。
软件的框架(software framework)通常指为了实现业界的标准或完成特定的基本任务的软件组件组件规范、也指为了实现软件组件规范时,提供规范要求的基础功能的软件产品。
关键部分:
1、框架是组件规范: 比如MVC是常见的软件开发规范、类似还有MVP、MVVM、J2EE框架。
2、框架提供基础功能产品::例如Spring MVC是MVC的开发框架、除了满足MVC的规范要求、Spring还提供了许多基础功能来帮助我们实现功能,包括注解、等许多基础功能。
软件架构指软件系统的“基础结构”、创建这些结构的准则、以及对这些结构的描述。
框架关注的是规范,架构关注的是结构、框架的英文是Framework,架构的英文是Architecture。
实际工作中,常听到似是而非的说法,比如我们系统是MVC架构、我们系统基于SSH框架开发的等。
存在这个问题原因是,在架构中基础结构没有明确定义。
还是以学生系统为例,以逻辑结构划分如下:
逻辑划分架构
物理部署架构:
物理部署架构
从开发角度来说,采用MVC架构如下:
MVC框架
4、重新定义架构
参考维基百科的定义,我将架构重新定义为:软件架构指软件系统的顶层结构。
这个定义看似很简单,但包含的信息很丰富,基本上把系统、子系统、模块、组件、架构等概念都串起来了,我来详细解释一下。
首先,“系统是一群关联个体组成”,这些“个体”可以是“子系统”“模块”“组件”等;架构需要明确系统包含哪些“个体”。
其次,系统中的个体需要“根据某种规则”运作,架构需要明确个体运作和协作的规则。
第三,维基百科定义的架构用到了“基础结构”这个说法,我改为“顶层结构”,可以更好地区分系统和子系统,避免将系统架构和子系统架构混淆在一起导致架构层次混乱。
网友评论