热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用场景_几种可直接使用的架构模式及其使用场景

写在前面最开始做架构最好的方式都是基于模仿的,我们可以找到一个类似于我们现有系统的业界解决方案,阅读并分析,看看究竟哪些可以抽象摘借出来为

写在前面

最开始做架构最好的方式都是基于模仿的,我们可以找到一个类似于我们现有系统的业界解决方案,阅读并分析,看看究竟哪些可以抽象摘借出来为我所用。比如在软件系统重构过程中有一些现有的模式是可以直接复用的,相信在平时的重构过程中有些模式你已经使用过了。

可复用的架构模式

列出以下几个自己平时习惯套用的模式:

  • 分层模式;

  • 管道模式(过滤器模式);

  • 聚合网关模式;

  • MVC模式;

  • 事件驱动模式;

多层模式

多层模式是我们做架构设计时最常用的一种模式,我们习惯的基于三层方式对我们的整体架构进行分层,比如说最上层的是展现层,中间是逻辑层,最下面是持久层,比如这样:

00a5c1caa8914984d7868693b288ab8b.png

其实分层设计和分模块分领域设计的思路是一致的,都是通过代码聚合的方式将能力收敛,达到边界清晰的目的,以后每个模块和分层可以独立演进,互不影响,提高了开发效率与扩展性。

当问你分层对于系统带来了哪些好处呢?有人会说实现了更好的解耦,但是分的层越多一定越好吗?

答案肯定是否定的,因为过度的分层反而带来了治理的无序,我个人更将这种分层或分模块看成是一种能力标准化的方式,因为我们目的是提供某种程度上的标准化能力,而这部分能力是需要基于具体支撑的场景来抽象的,也就最终影响到了分层与合并,进而回答那个分层多少的问题。

每一层都是一组模块,这组模块组合起来就是某种标准化能力的收敛。需要注意的是层的依赖必须是单向的,也就是上层依赖于下层,反过来是不行的。理想态是每层是一个完整的分区,对外提供公开的接口。

比如表现层是对于展现的标准化实现,这种展现可能是有用户界面的,或者是通过提供某种聚合形式的api json result间接达成了某个UI上的展现,比如多客户端的展示,甚至是一些IOT设备上的报文、心跳信息等。

分层可以用于单实例的代码逻辑分层,也就是独立部署的进程里面进行分层,另一种方式的分层是物理部署节点的分层,比如网关层独立部署,逻辑层按读写分离独立部署,持久层只做多数据源的聚合于路由,几层都只干了逻辑分层的一部分能力,但又是独立部署的。

9c9dcfd6920ac829687c768ddab6fc1e.png

分层是技术性的分区架构,而不是一个领域的分区架构。分层是围绕于组件形成的,而不是领域本身。

大部分场景可以依据分层方式实现,属于一种通用普世的解决方案。

管道模式

还有一种常见的模式是管道模式,或是过滤器模式。

2f634cee84e7373f61072e74e8efae87.png

说道过滤器模式,大家可能最先想到的是如tomcat或filter这种实现方式,任务过滤器顶多是实现大型系统里面某个组件功能的,很难提升到架构设计维度吧。

其实不是的。

我们接触到的很多系统都有管道模式的影子,特别是那些具有状态机驱动的场景,比如订单有明确的状态机,配送有明确的状态机,很多都可以抽象出一个明确流转不可逆的状态机的,这些具有明确状态机流转特点的系统都可以以管道模式进行设计。

他的设计特点围绕于输入、流转、输出过程中数据流的变化。

引入管道模式去解决复杂业务时,可以设计成一个个的松耦合的组件,组件之间有简单的通用交互机制,可以灵活集合,组件也更易复用,你的数据流转也更清晰。

而一个重复请求的幂等处理或是路由处理,可以很简单的基于状态机将其路由到某个指定的逻辑,精简了链路,去除了没有必要的逻辑处理。

比如以IM系统会话来说,其包括会话创建,会话排队,会话分配,会话聊天,会话结束。我们只需要在会话创建时,建立相关会话上下文,其他后续流程就不需要对上下文信息进行过分的校验与考虑了,只做”读行为“即可,大大降低了编码复杂度和理解成本。

当然管道模式有他的好处,其缺点也极其明显,需要有明确的流转特征的系统,而上下文信息的解析与泛解析成本会比较高,所以我一般会将流程层独立抽象出一层,降低其与领域层直接产生关系,这样可以在扩展状态机时减少开发成本。

聚合网关模式

你可以认为是网关模式,如果没有网关模式的话,一个客户端对应一个server这样很多资源与逻辑是难以复用的,所以好的方式是抽象出一个网关做资源聚合,复用到多个客户端,同时可以提高管控与弹性伸缩的能力。

网关中一般有两个组件,”接收逻辑“与”处理逻辑“,前者负责接收请求,将其发送到处理器,处理器处理之后异步响应回来。

这种模式适用于那些对于吞吐量有高要求,但是处理周期长特点的业务系统。

其缺点也很明显,就是处理逻辑会成为系统的性能瓶颈,故障点。

MVC模式

MVC是我们常用的一种模式,一般用于那些直接和客户端打交道的系统,因为端对于UI及UI所需的格式有一定的要求,而UI部分往往是一个改动频次较高的部分,所以MV就是需要做好UI及UI背后的数据源支撑。

f536c3d0701ea15d2081825cec9ce53a.png

  • 模型:包含属性的数据模型

  • 视图:数据源及展示交互的组合

  • 控制器:承接模型与视图之间的衔接逻辑

事件驱动模式

计算机最常处理的场景就是对于事件的响应,可以将特定业务抽象成事件,并广播出去,这样的好处是,扩展能力好。

而大型系统对于事件的产生与处理使用的还是比较多的,微服务架构下的事件通知往往是基于MQ实现的。

991bb871afd12c88778a3c287896f19f.png

每个事件可以建立独立部署或独立处理逻辑的组件,当事件进入队列后,可以引入调度器根据策略进行调度,或是事件处理器主动拉取事件进行事件处理。

分布式架构下,常用的场景是对于状态机的事件订阅,比如订单的达成、支付,配送状态的变更、流转时间等,其他团队基于事件监听异步跨服务的进行异步逻辑处理。

写在后面

知道了这些模式了,可以在系统设计时有意识的看看是否可以适用,一步步找到不同模式所特有的场景,这种实现可大可小,可以用作模块设计,也可以用作微服务系统的组合搭建。

9fa8dc3d10d0856edab86a4926b63772.png




推荐阅读
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • ssm框架整合及工程分层1.先创建一个新的project1.1配置pom.xml ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
author-avatar
手机用户2502936521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有