大家是否思考过如何设计大型企业级系统?在进行主要的软件开发之前,我们先得选择一个合适的架构。这个架构要给我们所需的功能和质量保证。因此,在将这些架构用于我们的设计之前,我们应该理解不同的架构体系。
1. 什么是架构模式
根据 Wikipedia 解释,一个架构模式就是,在给定上下文条件下,解决软件架构中常见问题的一个通用、可复用的解决方案。架构模式类似于软件设计模式,但范围更广。在这篇文章中,我将简单介绍以下十种常见的架构模式的用法,及其优缺点。
- 分层模式
- 客户端-服务器模式
- 主从模式
- 管道-过滤器模式
- Broker 模式
- 点对点模式
- 事件总线模式
- 模型-视图-控制器模式
- 黑板模式
- 解释器模式
2. 分层模式
这种模式用于构建能被拆分为一组子任务的程序,每个子任务是一个特殊的抽象层。每层向更高一层提供服务。下面是通用信息系统中,最常见的 4 层:
- 表示层(也称 UI 层)
- 应用层(也称服务层)
- 业务逻辑层(也称领域层)
- 数据层(也称持久化层)
用法:
- 常见的桌面应用
- 电子商务 Web 应用
3. 客户端-服务器模式
这种模式由两部分组成,一个服务端和多个客户端。服务端组件将给多个客户端组件提供服务。客户端从服务端请求服务,服务端提供相关的服务给这些客户端。此外,服务端会持续监听客户端的请求。用法:
- 在线应用,例如,电子邮件、共享文档和银行业务
4. 主从模式
这种模式由两部分组成,master 和 slaves 。master 组件分发任务给同等的 slave 组件,获取 slave 返回的结果之后,计算最终的结果。用法:
- 在数据库复制中,master 数据库作为权威数据库,slave 数据库从其同步
- 在计算机系统中,连接到总线的外围设备(主、从驱动器)
5. 管道-过滤器模式
这种模式用于构建生产和处理数据流的系统。每个处理步骤都包含一个过滤器组件。需要被处理的数据才能够通过管道。这些管道能起到缓存或同步的作用。用法:
- 编译器。一系列的过滤器完成词法分析、解析、语义分析和代码生成
- 生物信息学的工作流
6. Broker 模式
这种模式用于构建具有解耦组件的分布式系统。这些组件通过远程调用进行通信。 Broker 组件负责协调其他组件的通信。服务将其功能(服务地址和特征)发布到 Broker 。客户端向 Broker 请求一个服务时,Broker 查询注册表,将客户端的请求重定向到合适的服务地址。用法:
- 消息中间件,例如,Apache ActiveMQ、Apache Kafka、RabbitMQ 和 JBoss Messaging
7. 点对点模式
在这种模式下,各个组件被称为对等端。对等端既可以作为客户端,向其他对等端请求服务,也可以作为服务端向其他对等端提供服务。对等端可以充当客户端或服务端,亦或同时都是,而且可以随时改变其角色。用法:
- 文件共享网络,例如,Gnutella 和 G2
- 多媒体协议,例如,P2PTV 和 PDTP
8. 事件总线模式
这种模式主要处理事件,具有 4 个主要的组件,事件源,事件监听者,通道,事件总线。事件源将消息发布到事件总线上特定的通道。事件监听者订阅特定的通道。当有消息进入通道时,之前订阅过相关通道的监听者将会收到消息通知。用法:
- Android 开发
- 通知服务
9. 模型-视图-控制器模式
这种模式也被称为 MVC 模式,将一个交互式应用分为 3 个部分:
这样做是为了将程序内部的信息与展示给用户的信息,以用户能接受的方式分开。从而解耦组件,并且可以提高代码的复用率。用法:
- 使用主流编程语言的互联网应用架构
- Web 框架,例如,Django 和 Rails
10. 黑板模式
这种模式对于没有确定性解决方案的问题很有用。黑板模式主要由 3 部分组成:
- 黑板 - 一个结构化的全局内存,包含来自解决方案空间的对象
- 知识源 - 具有自己表现形式的特殊模块
- 控制组件 - 选择、配置和执行模块
所有的组件都可以访问黑板。组件可以生成新的数据对象添加到黑板。组件可以在黑板上查看特定类型的数据,也可以使用现有知识源通过模式匹配查找数据。用途:
- 语音识别
- 车辆识别和追踪
- 蛋白质结构识别
- 破译声呐信号
11. 解释器模式
这种模式用于设计一个解释专用语言编写的程序的组件。它主要指定如何计算每一行程序,也就是用特定语言编写的句子或表达式。其基本思想是语言的每个符号都有一个类。用法:
- 数据库查询语言,例如 SQL
- 描述通信协议的语言
12. 架构模式的比较
下面的表格给出了每个架构模式的优缺点:
13. 参考
- https://towardsdatascience.com/10-common-software-architectural-patterns-in-a-nutshell-a0b47a1e9013