软件系统与硬件和建筑系统最大的差异在于软件是可扩展的,一个硬件生产出来后就不会再进行改变、一个建筑完工后也不会再改变其整体结构。相比之下,软件系统就完全相反,如果一个软件系统开发出来后,再也没有任何更新和调整,反而说明了这套软件系统没有发展、没有生命力。真正有生命力的软件系统,都是在不断迭代和发展的,典型的如 Windows 操作系统。
扩展的基本思想—拆
拆,就是将原本大一统的系统拆分成多个规模小的部分,扩展时只修改其中一部分即可,无须整个系统到处都改,通过这种方式来减少改动范围,降低改动风险。
合理的拆分,能够强制保证即使程序员出错,出错的范围也不会太广,影响也不会太大
常见的拆分思路有如下三种:
- 面向流程拆分:将整个业务流程拆分为几个阶段,每个阶段作为一部分;
- 面向服务拆分:将系统提供的服务拆分,每个服务作为一部分;
- 面向功能拆分:将系统提供的功能拆分,每个功能作为一部分;
从范围上来看,从大到小依次为:流程 > 服务 > 功能,以 TCP/IP 协议栈为例:
- 流程
对应 TCP/IP 四层模型,因为 TCP/IP 网络通信流程是:应用层 → 传输层 → 网络层 → 物理 + 数据链路层,不管最上层的应用层是什么,这个流程都不会变。 - 服务
对应应用层的 HTTP、FTP、SMTP 等服务,HTTP 提供 Web 服务,FTP 提供文件服务,SMTP 提供邮件服务,以此类推。 - 功能
每个服务都会提供相应的功能。例如,HTTP 服务提供 GET、POST 功能,FTP 提供上传下载功能,SMTP 提供邮件发送和收取功能。
以一个简单的学生信息管理系统为例,拆分方式是:
面向流程拆分
展示层 → 业务层 → 数据层 → 存储层 各层含义是:
- 展示层:负责用户页面设计,不同业务有不同的页面。例如,登录页面、注册页面、信息管理页面、安全设置页面等;
- 业务层:负责具体业务逻辑的处理。例如,登录、注册、信息管理、修改密码等业务;
- 数据层:负责完成数据访问。例如,增删改查数据库中的数据、记录事件到日志文件等;
- 存储层:负责数据的存储。例如,关系型数据库 MySQL、缓存系统 Memcache 等;
面向服务拆分
将系统拆分为注册、登录、信息管理、安全设置等服务
面向功能拆分
每个服务都可以拆分为更多细粒度的功能,例如:
- 注册服务:提供多种方式进行注册,包括手机号注册、身份证注册、学生邮箱注册三个功能;
- 登录服务:包括手机号登录、身份证登录、邮箱登录三个功能;
- 信息管理服务:包括基本信息管理、课程信息管理、成绩信息管理等功能;
- 安全设置服务:包括修改密码、安全手机、找回密码等功能;
通过学生信息管理系统的例子可以发现,不同的拆分方式,系统的架构图差异很大。但好像无论哪种方式,最终都是可以实现的。既然如此,我们为何要头疼去选择呢,随便挑选一个不可以吗?
当然不能随便挑,否则设计就没有意义了,原因在于:不同的拆分方式,本质上决定了系统的扩展方式。
扩展方式
下面是不同拆分方式应对扩展时的优势:
-
面向流程拆分 扩展时大部分情况只需要修改某一层,少部分情况可能修改关联的两层,不会出现所有层都同时要修改。例如学生信息管理系统,如果我们将存储层从 MySQL 扩展为同时支持 MySQL 和 Oracle,那么只需要扩展存储层和数据层即可,展示层和业务层无须变动。 -
面向服务拆分 对某个服务扩展,或者要增加新的服务时,只需要扩展相关服务即可,无须修改所有的服务。 -
面向功能拆分 对某个功能扩展,或者要增加新的功能时,只需要扩展相关功能即可,无须修改所有的服务。
不同的拆分方式,将得到不同的系统架构,典型的可扩展系统架构有:
- 面向流程拆分:分层架构;
- 面向服务拆分:SOA、微服务;
- 面向功能拆分:微内核架构;
这几个系统架构并不是非此即彼的,而是可以在系统设计中进行组合使用的。
--------来源《极客课程》? 学习摘要
|