五大主流软件架构模式
在去年底召开的全球软件架构峰会(Global Software Architecture Summit)上,全球各界开发人员齐聚一堂,广泛地讨论了各种业界常见的软件架构模式。在此,我为您梳理并总结这些软件架构师给我们带来的精彩见解。
首先,什么是软件架构模式?
架构模式是那些由软件架构师通过持续实践,进而总结出的、过往已验证的、优秀设计架构。它们往往能够被重复地使用到其他项目或领域之中。更具体地说,架构模式是需要在实践中反复发掘的一组设计决策。它具有明确定义的属性,以及一套可以被重复使用与描述的架构。
其实,开发软件架构可以被看作是针对模式进行选择、定制和组合的一整套过程。而软件架构师的任务就是要决定:如何实例化模式,如何使其与特定的上下文、以及问题的约束相适应。我们将在下文中进行详细的讨论。
Mark Richards在其著作--《软件架构模式》一书中主要介绍了5种软件架构模式,它们分别是:微内核、微服务、分层架构、基于事件(事件驱动)和基于空间。下面我们将根据这个顺序逐一进行介绍。
1.微内核模式
微内核架构模式也称为插件架构模式。它通常是在软件团队创建具有可互换性组件(interchangeable components)的系统时,被使用到。
该模式主要适用于那些必须能够适应不断变化需求的软件系统。微内核模式能够从扩展功能、以及特定于客户的部件中,分离出最小的功能核心。作为一种套接字(socket),它能够插入到各种扩展之中,并协调其相互之间的协作关系。
业界通常认为:微内核架构模式是一种可被用于实施基于产品的应用程序的自然模式。此处所谓基于产品的应用程序,是一种打包的应用程序,可以作为典型的第三方产品版本被下载。当然,许多公司也会据此来开发和发布其内部的业务应用,例如:各种软件产品、版本、发布说明、以及可插入的功能等。
微内核架构模式允许您将其他应用程序的功能作为插件,添加到核心的应用程序上,进而提供可扩展性、以及功能上的分离(隔离)。
微内核架构模式通常由两种类型的架构组件所组成:核心系统和各种插件模块。我们需要将应用程序的逻辑,在各个独立的插件模块和基础核心系统之间进行划分,以提供基于应用功能,和自定义处理逻辑的可扩展性、灵活性和隔离性。在传统概念上,微内核架构模式的核心系统,仅包含那些系统运行所需的最少功能。
微内核架构的最佳示例是Eclipse IDE。通过下载基本的Eclipse产品,您只会获得一个编辑器。而只有在您添加了各种插件之后,它才能成为一个高度可定制的、实用的产品。
优势:
- 具有极大的灵活性和可扩展性。
- 在某些实现场景中,允许应用程序在运行的时候被添加插件。
- 具有良好的可移植性。
- 易于部署。
- 能够快速地响应不断变化的环境。
- 插件模块既可以单独地被测试,又可以由核心系统来轻松地进行模拟,以演示或原型化某项特定的功能,进而达到对核心系统的尽少、甚至不做修改。
- 由于您可以通过自定义和简化应用程序,来仅包括那些必需的功能,因此它能够提供优越的性能。
适合性:
- 那些需要从不同来源获取数据,并在转换数据之后写入不同目标的应用程序。
- 工作流程类应用程序。
- 任务与作业计划类应用程序。
2.微服务模式
当您将应用程序作为一组微服务进行编写时,实际上是在编写可以协同工作的多个微型应用程序。每个微服务都有自己的“职责”,团队可以独立于其他微服务进行开发。他们之间唯一的依赖便是沟通。当微服务彼此进行通信时,您必须确保它们之间发送的消息能够向后兼容。
优势:
- 您可以单独地编写,维护和部署每一个微服务。
- 您可以灵活地仅扩展那些需要的微服务。
- 由于应用程序的各个部分较小,并且与其他部分的耦合较宽松,因此您可以轻松地进行重写。
- 新的团队成员很容易快速上手。
- 能够使得应用程序易于被理解和修改。
- 通过提供良好的可维护性和可测试性,以实现快速且频繁的开发和部署。
- 团队无需与其他团队协调,便可独立地部署其服务。
适合性:
- 适合带有小型组件的站点。
- 有明确边界的企业级数据中心。
- 快速发展的新业务和Web应用。
- 具有遍布全球的开发团队。
3.分层架构模式
最常见的架构模式当属分层架构模式。它是我们用来设计大多数软件的传统方法,同样有具有一定的独立性。分层架构模式是一种多层模式,每个层面上都有多个组件。这就意味着所有的组件虽然是互联的,但是彼此之间并不依赖。在应用程序中,分层架构模式的每一层都有特定的角色和职责。例如:表示层将负责处理所有用户界面和浏览器之间的通信逻辑,而业务层将负责执行与请求相关的特定业务规则。
分层架构模式的主要特点在于各个组件各司其职,相互分离。也就是说,某个特定层面上的组件,仅会处理与该层有关的逻辑。
优势:
- 由于在该架构中,组件只属于某个特定层面,而其他层面可以被模拟出来,因此该模式具有良好的易测试性。
- 由于该模式实现起来并不太复杂,而且大多数公司都能够通过逐层分离的功能集,来开发应用程序,因此它非常易于被开发,当然也就成为了大多数业务应用的自然选择。
- 具有可维护性。
- 易于分配单独的“角色”。
- 方便对不同层面进行单独地更新与增强。
适合性:
- 标准化的业务线应用程序,且在功能上不限于CRUD(增删改查)操作。
- 需要快速构建的新应用。
- 团队中有并不了解其他架构、或经验不足的开发人员。
- 那些需要具有严格的可维护性和可测试性的应用。
4.基于事件(事件驱动)的模式
这是用于开发具有高度可扩展性系统的最常见分布式异步架构。该架构由那些可用于监听事件,并能够异步处理事件的组件所组成。事件驱动类架构构建出一个能够接收所有数据的中央单元。该单元可以被委托给那些具有处理特定类型能力的单独模块。
优势:
- 容易适应复杂且混乱的环境。
- 可被轻松地扩展。
- 当出现新的事件类型时,能够方便地进行扩展。
适合性:
- 那些具有异步数据流的异步系统。
- 各种用户界面。
5.给予空间的模式
基于空间的架构模式被专门设计为解决那些可扩展性和并发性的问题。对于那些具有不定因素和不可测并发用户数的应用来说,它同样也是一种非常实用的架构模式。该模式通过消除对中央数据库的约束,以及使用可复制的内存中数据格(data grids),来实现良好的可扩展性。
此外,基于空间的架构可以通过在多个服务器之间进行拆分处理与存储,以避免高负载下的功能性崩溃。
优势:
- 能够快速地响应不断变化的环境。
- 尽管该架构通常无法实现解耦和分布式,但它是动态的。那些基于云端的复杂工具,能够将应用程序轻松“推送”到服务器处,以简化部署。
- 可以通过内存中的数据访问,以及该模式中内置的缓存机制,来达到高性能。
- 由于较小地、甚至并不依赖于集中式数据库,因此该模式具有非常好的可扩展性。
适合性:
- 具有大体量数据的场景,例如:点击流(clickstreams)和用户日志。
- 低价值数据的偶尔丢失并不会造成严重后果的场景。
- 社交网络环境。