您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

程序员必知的几种软件架构模式

时间:2020-10-30 10:04:01  来源:  作者:

架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案。

一种模式就是特定上下文的问题的一种解决方案。

然而,很多开发者至今还对各种软件架构模式之间的差别搞不清,甚至对其所知甚少。

大体上,主要有下面这几种架构模式:

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

程序员必知的几种软件架构模式

分层架构模式

最常见的架构模式就是分层架构或者称为 n 层架构。

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

程序员必知的几种软件架构模式

一个很流行的 n 层架构示例

上下文

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

问题

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

方案

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

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

封闭层和请求访问

弱点

分层会导致性能下降。这种模式不适合高性能应用程序,因为经过架构中的多层来实现一个业务请求的效率是不高的。

分层还会增加系统的前期成本和复杂性。

用途

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

多层模式

方案

程序员必知的几种软件架构模式

一个多层模式示例:消费者网站 J2EE

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

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

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

弱点:大量前期成本和复杂性。

用途:用在分布式系统中。

管道 - 过滤器架构

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

程序员必知的几种软件架构模式

管道过滤器模式

上下文

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

问题

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

方案

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

在这种模式中,有如下四种过滤器。

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

弱点

不太适合交互性的系统,因为它们的转换特性。

过多的解析和反解析会导致性能损失,也会增加编写过滤器本身的复杂性。

用途

管道 - 过滤器架构用于各种应用程序,特别是简化单项处理的任务,例如 EDI、ETL 工具。

编译器:连续的过滤器执行词法分析、语法分析、语义分析和代码生成。

客户端 - 服务器架构

程序员必知的几种软件架构模式

 

上下文

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

问题

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

方案

在客户端 - 服务器模式中,组件和连接器具有特定的行为。

  • 称为“客户端”的组件将请求发送到称为“服务器”的组件,然后等待回复。
  • 服务器组件接收到客户端的请求并向其发送回复。

弱点

服务器会成为性能瓶颈和单点故障位置。

在系统建成后,关于功能位置(在客户端还是在服务器)的决策通常是复杂的而且变动成本很大。

用途

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

模型 - 视图 - 控制器架构(MVC)

程序员必知的几种软件架构模式

 

上下文

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

问题

用户界面功能如何独立于应用程序功能,同时还还对用户输入或底层应用程序数据的更改做出响应?

当底层应用程序数据更改时,如何创建、维护和协调用户界面的多个视图?

方案

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

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

弱点

对于简单的用户界面,其复杂性并不值得这么做。

模型、视图和控制器抽象可能不适用于某些用户界面工具包。

用途

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

事件驱动架构

上下文

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

问题

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

方案

程序员必知的几种软件架构模式

 

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

弱点

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

用途

使用这个方案的电商应用程序将工作如下:

Order Service 创建一个 Order,这个订单处于待定状态,然后发布一个OrderCreated事件。

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

微服务架构

上下文

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

问题

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

方案

程序员必知的几种软件架构模式

 

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

弱点

系统设计必须能容忍服务失败,需要更多的系统监控。服务编排和事件协作开销比较大。

当然,我们还需要更多钱。

用途

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

原文链接:

https://levelup.gitconnected.com/software-architecture-the-important-architectural-patterns-you-need-to-know-a1f5ea7e4e3d



Tags:架构模式   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在领域驱动架构中,通常会将查询和命令操作分开,我们称之为CQRS(命令查询职责分离Command Query Responsibility Segregation)。这张图是来自Martin Fowler大师的文章CQRS( http...【详细内容】
2021-07-30  Tags: 架构模式  点击:(132)  评论:(0)  加入收藏
作者 | Natan Silnitsky译者 | 平川策划 | 万佳在过去一年里,我一直是数据流团队的一员,负责 Wix 事件驱动的消息传递基础设施(基于 Kafka)。有超过 1400 个微服务使用这个基础...【详细内容】
2021-07-12  Tags: 架构模式  点击:(187)  评论:(0)  加入收藏
架构模式是软件架构中在给定环境下常遇到问题的通用的、可重用的解决方案。类似于软件设计模式但覆盖范围更广,致力于软件工程中不同问题,如计算机硬件性能限制、高可用性、业...【详细内容】
2020-12-28  Tags: 架构模式  点击:(147)  评论:(0)  加入收藏
架构模式是对给定上下文的软件架构中常见问题的一种通用的可复用的解决方案。一种模式就是特定上下文的问题的一种解决方案。然而,很多开发者至今还对各种软件架构模式之间的...【详细内容】
2020-10-30  Tags: 架构模式  点击:(96)  评论:(0)  加入收藏
好莱坞电影中有多少情节?一些电影评论家说只有五个。您可以采用几种架构来实现应用程序?目前大多数程序都使用下面提到的五种架构之一。在本文中,我将五种软件架构模式的优缺点...【详细内容】
2020-07-20  Tags: 架构模式  点击:(65)  评论:(0)  加入收藏
有没有想过企业规模的系统是如何设计的?在主要的软件开发开始之前,我们必须选择一个合适的架构,为我们提供所需的功能和质量属性。因此,在将它们应用于我们的设计之前,我们应该了...【详细内容】
2020-05-11  Tags: 架构模式  点击:(211)  评论:(0)  加入收藏
最常见的架构模式,将系统在横向维度上切分成几个部分,每个部分单一职责。网站一般分为三个层次:应用层、服务层和数据层,其具体结构如下图所示:...【详细内容】
2019-09-10  Tags: 架构模式  点击:(176)  评论:(0)  加入收藏
在做架构设计的时候,一般会采用一些架构模式,便于设计和以后需求变更时修改代码。如果设计模式选择得不正确那么很容易造成架构的混乱,代码也会变成怪物。分层模式分层模式分层...【详细内容】
2019-05-02  Tags: 架构模式  点击:(309)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条