一、简介

架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案。一种模式就是特定上下文的问题的一种解决方案。
大体上,主要有下面这7种架构模式:

  • 分层架构
  • 多层架构
  • 管道/过滤器架构
  • 客户端/服务器架构
  • 模型/视图/控制器架构
  • 事件驱动架构
  • 微服务架构

二、分层架构

最常见的架构模式就是分层架构或者称为 n 层架构。大部分软件架构师、设计师和开发者都对这个架构模式非常熟悉。尽管对于层的数量和类型没有具体限制,但大部分分层架构主要由四层组成:展现层、业务层、持久层和数据库层。
如下图所示:

2.1、上下文

所有复杂的系统都会经历独立地发展和衍化系统各个部分的需要。出于这个原因,系统开发者需要对关注点进行清晰且条理分明的分离,以便系统的各个模块可以独立地开发和维护。

2.2、问题

软件需要以这样一种方式分割:各个模块可以独自开发和衍化,各自部分之间的交互非常少,支持可移植性、可修改性和复用性。

2.3、方案

为了实现关注点分离,分层模式将软件分割成各个单元(称为“层”)。每一层都是一组模块,提供了一组高内聚的服务。其使用必须是单向的。层将一组软件作为一个完整的分区,每个分区暴露一个公开接口。

  • 第一个概念是,每一层都有特定的角色和职责。例如,展现层负责处理所有的用户界面。分层架构的这种关注点分离,让构建高效的角色和职责非常简单。
  • 第二个概念是,分层架构模式是一个技术性的分区架构,而非一个领域性的分区架构。它们是由组件组成的,而不是领域。
  • 最后一个概念是,分层架构中的每一层都被标记为封闭或者开放。封闭层意味着请求从一层移到另一层,它必须通过它正下面的这一层才能达到下面这一层的再下一层。请求不能跳过任何层。

2.4、弱点

  • 分层会导致性能下降。这种模式不适合高性能应用程序,因为经过架构中的多层来实现一个业务请求的效率是不高的。
  • 分层还会增加系统的前期成本和复杂性。

2.5、用途

我们应该将这种方式应用于小型简单的应用程序或网站。对于预算和时间非常紧张的场景,这是一个不错的选择。

三、多层架构

3.1、方案


许多系统的执行结构被组织成一系列逻辑组件分组。每个分组被称为一个层。

3.2、上下文

在一个分布式部署中,通常需要将系统的基础设施分到不同的子集中。

3.3、问题

我们如何将系统分割到多个计算上独立的执行结构:由一些通信媒介连接的软件和硬件组?

3.4、弱点

大量前期成本和复杂性。

3.5、用途

用在分布式系统中。

四、管道-过滤器架构

软件架构中反复出现的一种模式是管道 - 过滤器(pipe-filter)模式。

4.1、上下文

许多系统需要转换从输入到输出的离散数据流。许多类型转换在实践中重复出现,因此将其创建成独立的可复用的部分,这是比较理想的。

4.2、问题

这些系统需要被分割成可复用的松耦合的组件,组件之间拥有简单通用的交互机制。这样它们就可以灵活地相互结合。这些通用松耦合的组件就很容易复用。那些独立的组件可以并行执行。

4.3、方案

这种架构中的管道构成了过滤器之间的通信通道。第一个概念是,由于性能原因,每个管道都是非定向的和点对点的,接受来自一个源的输入并经常直接输出到另外一个源。
在这种模式中,有如下四种过滤器。

  • producer(source):一个过程的起点。
  • transformer (map):对一些或所有数据进行转换。
  • tester (reduce):测试一个或多个条件。
  • consumer (sink):终点。

4.4、弱点

  • 不太适合交互性的系统,因为它们的转换特性。
  • 过多的解析和反解析会导致性能损失,也会增加编写过滤器本身的复杂性。

4.5、用途

  • 管道-过滤器架构用于各种应用程序,特别是简化单项处理的任务,例如 EDI、ETL 工具。
  • 编译器:连续的过滤器执行词法分析、语法分析、语义分析和代码生成。

四、客户端-过滤器架构

4.1、上下文

有许多共享资源和服务是大量分布式的客户端希望访问的,我们希望控制访问或服务质量。

4.2、问题

通过管理一组共享资源和服务,我们可以通过分解公共服务并在单个位置或少数位置进行修改来提高可修改性和复用性。我们想要通过在将资源本身分布在多个物理服务器上的同时集中控制这些资源和服务,来提高可伸缩性和可用性。

4.3、方案

  • 在客户端-服务器模式中,组件和连接器具有特定的行为。
  • 称为“客户端”的组件将请求发送到称为“服务器”的组件,然后等待回复。
  • 服务器组件接收到客户端的请求并向其发送回复。

4.4、弱点

  • 服务器会成为性能瓶颈和单点故障位置。
  • 在系统建成后,关于功能位置(在客户端还是在服务器)的决策通常是复杂的而且变动成本很大。

4.5、用途

对于有许多组件(客户端)发送请求到另外一些提供服务的组件(服务器)的系统,我们可以使用客户端 - 服务器模式来建模这个系统的一部分:在线应用程序,例如电子邮件、共享文档或银行服务。

五、模型-视图-控制器架构

5.1、上下文

用户界面通常是一个交互性应用程序的最频繁被修改的部分。用户通常希望从不同的视角查看数据,例如柱状图或者饼图。这些表示形式都应该反映数据当前的状态。

5.2、问题

  • 用户界面功能如何独立于应用程序功能,同时还还对用户输入或底层应用程序数据的更改做出响应?
  • 当底层应用程序数据更改时,如何创建、维护和协调用户界面的多个视图?

5.3、方案

模型 - 视图 - 控制器(model-view-controller,即 MVC)模式将应用程序功能分为以下三种类型的组件:

  • 模型,包含应用程序的数据。
  • 视图,显示部分底层数据并与用户交互。
  • 控制器,在模型和视图之间进行中介并管理状态更改的通知。

5.4、弱点

  • 对于简单的用户界面,其复杂性并不值得这么做。
  • 模型、视图和控制器抽象可能不适用于某些用户界面工具包。

5.5、用途

MVC 是网站或移动应用程序开发用户界面常用的一种架构模式。

六、事件驱动架构

6.1、上下文

需要提供计算和信息资源来处理传入的应用程序生成的独立异步事件,这种方式可以随着需求的增加而扩展。

6.2、问题

构建分布式系统,这个系统可以服务异步到达的事件相关信息,并且能从简单小型扩展到复杂大型。

6.3、方案


为事件处理部署独立的事件进程或处理器。到达的事件进入队列。调度程序根据调度策略从队列中拉取事件并将它们分配到合适的事件处理器。

6.4、弱点

性能和错误恢复可能是问题。

6.5、用途

使用这个方案的电商应用程序将工作如下:
Order Service 创建一个 Order,这个订单处于待定状态,然后发布一个OrderCreated事件。

  • Customer Service 接收到这个事件并尝试为这个 Order 扣除信用。然后发布一个Credit Reserved
    事件或者CreditLimitExceeded(超出信用限额)事件。
  • Order Service 接收到 Customer Service 发送的事件并将订单状态更改为已核准或已取消。

七、微服务架构

7.1、上下文

部署基于服务器的企业应用程序,支持各种浏览器和原生移动客户端。应用程序通过执行业务逻辑、访问数据库、与其它系统交换信息并返回响应来处理客户端请求。这个应用程序可能会暴露一个第三方 API。

7.2、问题

一体化应用程序会变得过于庞大和复杂,无法得到有效支持和部署来实现最优的分布式资源利用,例如在云环境中。

7.3、方案


将应用程序构建成服务套件。每个服务都是独立部署和可扩展的,拥有自己的 API 边界。不同的服务可以用不同的编程语言编写,管理它们自己的数据库,由不同的团队开发。

7.4、弱点

  1. 系统设计必须能容忍服务失败,需要更多的系统监控。服务编排和事件协作开销比较大。
  2. 当然,我们还需要更多钱。

7.5、用途

许多使用场景都可以应用微服务架构,特别是那些涉及大量数据管道的场景。例如,一个微服务系统对关于一个公司的零售店销售的报表系统会比较理想。数据展现过程的每一步都会被一个微服务处理:数据收集、清理、规范化、浓缩、聚合、报告等。

软件设计7种架构模式相关推荐

  1. 《软件设计精要与模式》前言

    缘起 用过去几年互联网上最酷,而在当下已经被用滥的名词来说,我在2004年成为了一名博客,用日志的方式记录自己成长的经历.坦白说,技术的成长远远比身体的发育更加地艰辛与缓慢,尤其是当今信息爆炸的年代, ...

  2. 踏上《软件设计精要与模式》第二版的征途

    距离<软件设计精要与模式>的出版已有两年多的时间,从出版之初的热销到后来归于平淡,我也经历了从兴奋期到蛰伏期的过程.这本书的反应不算好,也不算坏.在浩瀚如大海一般的书市里,就好似一滴水珠融 ...

  3. [书籍推荐]《软件设计精要与模式(第2版)》-张逸——提高设计模式及软件设计的方法...

    <软件设计精要与模式(第2版)>是园子里张逸大大今年4月出版的关于软件设计及设计模式方面的书,我是5月下旬到手,每天晚上看一章,断断续续的到昨天晚上总算把全书28章看完了,感受很深,以往在 ...

  4. 教你如何阅读本书,如何学好软件设计——软件设计精要与模式前言

    前    言 缘起 用过去几年互联网上最酷,而在当下已经被用滥的名词来说,我在2004年成为了一名博客,用日志的方式记录自己成长的经历.坦白说,技术的成长远远比身体的发育更加地艰辛与缓慢,尤其是当今信 ...

  5. 《软件设计精要与模式》第二版源代码

    <软件设计精要与模式>第二版的代码相较于第一版而言,做了一定的修改.代码采用C#语言编写,并在Windows XP, Visual Studio 2008, SQL Server 2005 ...

  6. 《软件设计精要与模式》推荐序三

    微软MVP InfoQ中文站.NET社区首席编辑 朱永光 很早就在博客园上拜读过张逸的文章,尤其对他在设计模式方面的经验和见解印象深刻.在我把他邀请进InfoQ中文站编辑团队后,经过深入而频繁的交流, ...

  7. 软件设计精要与模式 张逸

    一.设计之道 软件设计两种方法:计划的设计(满足扩展的设计)和演进的设计(极限) 软件架构设计: 1.程序组织(Program ) 需求--系统的功能模块(或子系统)--封装成包(考虑解耦--面向接口 ...

  8. 聊聊 8种 架构模式

    点击关注公众号,实用技术文章及时了解 什么是架构 我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果.哈哈,我理解,架构就是骨架,如下图所示: 人类的身体的支撑是主要由骨架来承担 ...

  9. 《软件设计精要与模式》

    "给我一个支点,我就能撬起地球".关键不在于力量有多大,而在于如何合理地利用力量.软件设计同样如此.思想的确立,技巧的把握,将在很大程度上决定软 件架构的合理性.基于这样的目的,本 ...

最新文章

  1. 线程通信问题--生产者和消费者问题
  2. 网络通信模型(IO模型)
  3. maven 更改项目名称
  4. matlab练习程序(自适应中值滤波RAMF)
  5. linux根目录挂载到2440开发板,飞凌2440开发板挂载NFS
  6. 【学术相关】10篇顶会paper,入选微软学者,上海交大吴齐天的科研思考!
  7. 6/100. Invert Binary Tree
  8. ios 轻扫手势_轻扫即可快速删除iOS计算器中的数字
  9. Semantic Web 文章目录
  10. 如何用脚本可靠关闭一个linux服务或进程
  11. 用redis实现分布式锁
  12. PyTorch 1.0 中文官方教程:什么是 PyTorch
  13. windows批处理文件打印幻方
  14. ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM
  15. websockets_WebSockets简介
  16. visio常用快捷键_Visio快捷键大全
  17. 做饭给自己一人吃,如何最快速,且营养有保证?
  18. 2020考研数学一大纲之完全解析(四)
  19. 刨根究底字符编码之零——前言
  20. EBS中如何实现简单的日记账导入

热门文章

  1. Winform中自定义控件,BackColor,ForeColor系统选择窗口
  2. MIPI D-PHY介绍
  3. 利用4位led显示本机秒表时间的单片机c语言程序,基于单片机的一个2位的led数码显示作为_秒表_设计.doc...
  4. STM32利用STM32CubeMX驱动SDRAM
  5. 附指南原文下载-《GB/T 39725-2020 信息安全技术 健康医疗数据安全指南》解读(二)
  6. 漫画大全更新了。。。。。
  7. 如何展示您的数字作品集:来自创意招聘人员的建议
  8. C/C++黑魔法-神奇蝌蚪运算符
  9. 陕西2021年工程师职称申报主要条件
  10. 诺基亚c6-01支持java吗,简约但很不简单 诺基亚C6-01到站评测