架构师修炼系列【可扩展模式】

软件系统与硬件和建筑系统最大的差异在于软件是可扩展的,如果一个软件系统开发出来后,再也没有任何更新和调整,反而说明了这套软件系统没有发展,没有生命力 。真正有生命力的软件系统,都是在不断迭代和发展的,如 Windows操作系统,从Win3.0到Win95到WinXP…直到现在的Win10,一直在跟着技术的发展而不断地发展

软件系统的这种天生和内在的可扩展的特性,既是其魅力所在,又是其难点所在 。魅力体现在我们可以通过修改和扩展,不断地让软件系统具备更多的功能和特性,满足新的需求或顺 应技术发展的趋势 。 而难点体现在如何以最小的代价去扩展系统,改动的地方越多,投入也越大,出错的可能性也越大。因此,如何避免扩展时改动范围太大,是软件架构可扩展性设计的主要思考点

基本思想

可扩展性架构的设计方法很多,但万变不离其宗,所有的可扩展性架构设计,背后的基本思想都可以总结为一个字拆:将原本大一统的系统拆分成多个规模小的部分,扩展时只修改其中一部分即可,不是对整个系统到处都改,通过这种方式来减少改动范围,降低改动风险

软件系统的拆是建设性的,而不是毁灭性的,其目的是让软件更加灵活的应对时代的飞速发展,优雅的应对变化,也正因为如此软件系统的拆非常难,大致思路有如下几种:

  • 面向流程拆分:将整个业务流程拆分为几个阶段,每个阶段作为一部分
  • 面向服务拆分:将系统提供的服务拆分,每个服务作为一部分
  • 面向功能拆分:将系统提供的功能拆分,每个功能作为一部分

理解这三种思路的关键就在于如何理解“流程”“服务”“功能” 三者的联系和区别
在这里插入图片描述
如图是TCP/IP的协议栈,那么在这个协议栈中什么是流程什么是服务什么是功能:

  • 流程:对应TCP/IP四层模型,因为TCP/IP网络通信流程是:应用层-〉传输层->网络层->物理 +数据链路层,不管最上层的应用层是什么,这个流程都不会变
  • 服务:对应应用层的 HTTP、FTP、SMTP等服务,HTTP提供Web服务,FTP提供文件服务,SMTP提供邮件服务,以此类推
  • 功能:每个服务都会提供相应的功能。例如,HTTP服务提供GET、POST功能,FTP提供上传下载功能,SMTP提供邮件发送和收取功能

如果要拆分一个简单的学生信息管理系统,如何拆分:

  • 面向流程拆分:展示层→业务层→数据层→存储层
    • 展示层: 负责用户页面设计,不同业务有不同的页面 。 例如,登录页面、注册页面、 信息管理页面、安全设置页面等
    • 业务层: 负责具体业务逻辑的处理。例如,登录、注册、信息管理、 修改密码等业务
    • 数据层: 负责完成数据访问 。 例如,增删改查数据库中的数据,记录事件到日志文件等
    • 存储层: 负责数据的存储 。 例如,关系型数据库 MySQL 、缓存系统 Memcache等
      在这里插入图片描述
  • 面向服务拆分:将系统拆分为注册、登录、信息管理 、 安全设置等服务
    在这里插入图片描述
  • 面向功能拆分:每个服务都可以拆分为更多细粒度的功能
  • 注册服务提供多种方式进行注册,包括手机号注册、身份证注册、学生邮箱注册三 个功能
  • 登录服务包括手机号登录、身份证登录、邮箱登录三个功能
  • 信息管理服务包括基本信息管理、课程信息管理、成绩信息管理等功能
  • 安全设置服务包括修改密码、安全于机、找回密码等功能
    在这里插入图片描述
    不同的拆分方式,本质上决定了系统的扩展方式

可扩展方式

当我们谈可扩展性时:一定有一种声音是就算是不拆分系统,只要在设计和写代 码时做好了,同样不会出现到处改的问题啊?例如,在面向服务拆分的案例中,增加“学号注 册”,就算是不拆分为服务, 也可以控制修改的范围,那为何我们要大费周章地去拆分系统呢?
在一个理想的情况下(你的团队都是高手,每个程序员都很厉害,对业务都很熟悉,新来的同事很快就知晓所有的细节……)那确实不拆分也没有问题,但现实却是:团队有菜鸟程序员, 到底是改A处实现功能还是改B处实现功能,完全取决于他觉得哪里容易改;有的程序员比较粗心;有的程序员某天精神状态不太好:新来的同事不知道历史上某行代码为何那么“恶心”。而轻易地将其改漂亮了一些… …所有的这些问题都可能出现,这时候我们就会发现,合理的拆分,能够强制保证即使程序员出错,出错的范围也不会太广,影响也不会太大。

不同拆分方式应对扩展时的优势:

  • 面向流程拆分:扩展时大部分情况只需要修改某一层,少部分情况可能修改关联的两层,不会出现所有层都同时要修改。 例如,学生信息管理系统,如果我们将存储层从MySQL扩展为同时支持MySQL和Oracle,那么只需要扩展存储层和数据层即可,展示层和业务层无须变动
  • 面向服务拆分:对某个服务扩展,或者要增加新的服务时,只需要扩展相关服务即可,无须修改所有的服务。同样以学生管理系统为例,如果我们需要在注册服务中增加一种“学号注册”功 能,则只需要修改 “注册服务”和“登录服务”即可,“信息管理服务 ”和“ 安全设置 ”服务无须修改
  • 面向功能拆分:对某个功能扩展,或者要增加新的功能时,只需要扩展相关功能即可,无须修改所有的服务。同样以学生管理系统为例,如果我们增加“学号注册”功能,则只需要在系统中增加一个新的功能模块,同时修改“登录功能”模块即可,其他功能都不受影响

不同的拆分方式 , 将得到不同典型的可扩展系统架构:

  • 面向流程拆分:分层架构
  • 面向服务拆分:SOA 、微服务
  • 面向功能拆分:微内核架构

当然,这几个系统架构并不是非此即彼的,而是可 以在系统架构设计中进行组合使用的,以学生管理系统为例:

  • 整体系统采用面向服务拆分中的“微服务”架构,拆分为“注册服务”“登录服务” “信息管理服务”“安全服务”,每个服务是一个独立运行的子系统
  • 其中的“注册服务”子系统本身又是采用面向流程拆分的分层架构
  • “登录服务”子系统采用的是面向功能拆分的“微内核”架构

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/108571252