31-可扩展架构的基本思想和模式
前言
软件系统与硬件和建筑系统的最大差异就在于软件是可扩展的,而硬件和建筑是不可扩展的。一个硬件生产出来后是不会做修改的,建筑也是一样。
软件系统的这种可扩展性,即是其魅力,也是其难点。其魅力在于我们可以不断的到软件进行扩展,让软件系统拥有更多的功能和特性,满足新的需求或者顺应技术发展的趋势。难点在于如何用最小的代价去扩展系统,改动的越多,投入也越大,出错的可能性也越大。
可扩展的基本思想
可扩展的基本思想可以总结为一个字:拆。
拆就是把原先大一统的系统拆分成多个规模小的部分,扩展时只修改其中一部分即可,无需整个系统到处修改,通过这种方式来减小修改的范围,从而减少风险。
按照不同的思路来拆分系统,就会得到不同的架构。常见的拆分思路有:
- 面向流程拆分:将整个业务系统拆分成几个阶段,每个阶段作为一部分。
- 面向服务拆分:将系统提供的服务进行拆分,每个服务作为一部分。
- 面向功能拆分:将系统提供的功能进行拆分,每个功能作为一部分。
从范围来看,流程>服务>功能。
以一个学生信息管理系统为例:
- 面向流程拆分:
展示层->业务层->数据层->存储层
- 展示层:负责用户业务设计,不同的业务展示不同的页面。
- 业务层:负责具体业务的处理。
- 数据层:负责完成数据的访问。
- 存储层:负责数据的存储。
- 面向服务的拆分: 将系统拆分成注册、登录、信息管理、安全设置等服务。
- 面向功能的拆分: 可以对每个服务进行更细粒度的拆分,拆分成各个功能。例如注册服务可以包含多种方式的注册。
不同的拆分方式,本质是决定了系统的可扩展方式。
可扩展方式
不同的拆分方式对应扩展时的优势:
面向流程的拆分:
扩展时大部分时候只需要修改某一层,少部分情况下可能需要修改关联的二层,不会出现所有的层都要同时修改。如我们将存储层从mysql扩展到mysql和oracle,只需要修改存储层和数据层即可。
面向服务的拆分:
对某个服务进行扩展时,或者要增加新的功能时,只需要扩展相关服务即可,无需修改所有的服务。
面向功能的拆分: 对某个功能进行扩展时,或者要增加新的功能时,只需要扩展要关的功能即可,无需修改所有的功能。
不同的拆分方式将得到不以有架构:
- 面向流程的拆分:分层架构
- 面向服务的拆分:SOA、微服务
- 面向功能的拆分:微内核架构
要注意的是:这一个架构不是非此即彼的关系,是可以组合使用的。以学生管理系统为例:架构可以是这样子的:
整体是采用面向服务架构中的微服务架构:拆分成注册服务、登录服务等,每个服务是一个独立运行的子系统。
其中注册服务本身又是面向流程的拆分
登录服务采用面向功能拆分的微内核架构