热门标签 | 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工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文介绍了DataTables插件的官方网站以及其基本特点和使用方法,包括分页处理、数据过滤、数据排序、数据类型检测、列宽度自动适应、CSS定制样式、隐藏列等功能。同时还介绍了其易用性、可扩展性和灵活性,以及国际化和动态创建表格的功能。此外,还提供了参数初始化和延迟加载的示例代码。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
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社区 版权所有