在系统架构设计中,经常会遇到一些术语,有的术语可能过于常见而没有人进行定义,但不同的人可能会有不同的理解。为了保证本书在叙述时术语的含义明确,下面对一些基本术语进行解释。
下面先介绍两个过时的术语,即体系结构和构件。
· 体系结构: “结构”一词是较早的中文翻译,对应的英文单词是architecture。
· 构件: “构件”一词是较早的中文翻译,对应的英文单词是component。
这两个词属于早期的翻译,现在基本上已经被架构和组件代替,所以后面不会再出现这两个词。
对系统进行分解时经常会用到层和子系统。
· 层: 是一个概念,可以对软件组件、功能和代码等进行归类并划分层级,以体现上下依赖关系。对组件分层时,可能有接入层、服务层和数据层等;对代码分层时,可能有UI层、业务逻辑层和数据访问层等;对功能分层时,可能有应用层、服务层和基础设施层等。不管以哪种方式分层,层本身往往只是一个虚拟的概念,不体现为实际的任何东西。在系统运行期,能看到的只有各个组件对应的进程,但看不到所谓服务层具体的容器。在代码中,能看到的是包和类,看不到所谓层的东西,实际上可能是将某个包与层进行了关联。在功能上,只能看到一项项功能,但看不到这些功能的容器。
· 子系统: 由多个组件构成的有机整体,用于在整个系统中完成某项职责。例如,用户管理子系统可能是由用户服务、用户管理后台和用户数据库3个组件构成的,这3个组件共同支撑起整个系统中用户相关的功能。子系统其实也是一个概念,具体能看到的还是一个个组件。
下面介绍组件、功能和模块。
· 组件: 系统的组成部件。组件的粒度可大可小,在研究系统总体架构时,组件的粒度一般是运行期为进程级别的部件,或者由多个相关进程构成的子系统。
· 功能: 系统能够完成的某种操作。功能不是静态可见的东西,而是通过具体操作才能体验到的一种能力。例如,商品查询功能,用户要输入商品关键词,单击“查询”按钮后可以看到查询结果,由此可以确认系统是否具备商品查询功能。
· 模块: 是指代码中某项功能相关的实现,通常涉及多个类或代码文件。模块一般只能在代码中可见,编译打包后就会不可见。
系统架构设计在很大程度上是在做分解,组件、功能和模块是对系统进行分解的几个主要方面。图1-3展示了系统分解结构。
图1-3中总共涉及3个组件、2项功能和4个模块。其中,组件有HTML形式的Web前端、后端的API网关和用户服务,Web前端组件中包含用户查询页面和用户新增页面2个UI模块,用户服务组件中包含用户查询接口和用户新增接口2个模块,API网关负责所有请求的转发,不区分业务。用户通过Web前端组件可以使用用户查询和用户新增功能。每项功能是由其前端模块与后端的用户服务中的接口模块相互协作来完成的。由此,读者可以清楚地理解组件、功能和模块之间的关系。需要注意的是,组件和模块是有实体的;组件在运行期是进程,模块在开发期是若干代码文件;功能只是一个概念,看不见摸不着,只能通过操作来体验。所以,实际能够分解的还是组件和模块,当按照模块分解时,功能可以作为模块的分类。
图1-3 系统分解结构
在考虑架构时,是按照组件对系统进行分解的,因为组件决定技术,不同的组件可以用不同的技术来实现,一个组件内的技术相对单一;在进行概要设计时,是按照功能、模块对系统进行分解的,此时与技术无关。在考虑组件之间的关系时,关注的是通信协议和格式;在考虑模块之间的关系时,关注的是接口名称、参数列表和返回值。