软件体系结构——后端三层架构

三层架构——Controller、Service、Dao
不仅是对代码进行的逻辑分层。其真正的本质,是将业务、技术和数据剥离。搞业务的专心做业务,搞技术的专心搞技术,做数据存储的专心做数据存储。三方通过接口进行对接,任一部分重构,只要输入和输出接口的数据不受影响,就不对其他层造成影响。

三层架构是一种通用型的,面向功能的。具体架设可以结合企业业务的颗粒度进一步细分,增加层数。

我们先来看一下,对于一个项目,比较通用的流程都有什么?
1.接收请求、数据
2.数据合法性验证
3.开启事务
4.执行业务规则、逻辑、流程
5.数据存储
6.事务结束

明显,12可以封装成一个模块,346可以封装,5作为一个模块
划分模块后,就可以做异步了,程序不再是瀑布型,前端不必等业务逻辑全部完成

下面我们通过例子进一步理解

如何理解三层架构?

——服务员、厨子、仓储模型
在这里插入图片描述

Controller——接口层(Web层)——服务员

Service——逻辑层——厨师

Dao——数据层——仓储

为什么选择三层架构?

https://www.bilibili.com/list/watchlater?oid=359096349&bvid=BV1PX4y1J7CC&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
对于小公司,沟通成本低,一人多职,效率快响应快,这样很容易做大。可是做大以后呢?项目不在是你一个人的事,需要大家一起来完成。那么,不同人有不同人的思维方式,有不同的编程习惯,而且沟通效率会直线下降,此时,我们就需要对项目进行架构,对编程方式进行规范,对输入输出做详细要求。

和MVC有何不同,为什么有些地方叫Controller为视图层?

MVC的本质思想是:输入View、处理Model、输出Controller。
其解决的问题是,将系统整体整体分类为三个部分,清晰,便于维护。
但事实上耦合性依然很高,各个功能之间的依赖关系很复杂。

三层架构的本质思想是:数据处理放一层,业务逻辑放一层,数据存储放一层。
将业务和数据处理剥离,前端只需要对接Controller就好了,其余的两部分无需因前端改变而改变。

事实上,在三层架构中,Controller充当的角色是网络服务,相较于视图层View,Controller层一般称为接口处层或Web层。
它的职责是接收HTTP请求、解析参数、调用Service层处理业务、根据处理结果组装响应(跳转页面或返回JSON等)。它扮演的是MVC模式中的协调者(Controller) 角色,而不是视图(View)。

三层架构中View的概念被弱化,它不是一个层,而属于一种技术实现,这个渲染过程通常发生在Controller层内部。
1.Controller返回一个逻辑视图名,如 “user-list”
2.然后由视图解析器(View Resolver),如Thymeleaf、FreeMarker去找到对应的模板,如 user-list.html并渲染
3.最终生成HTML返回给浏览器。

三层架构详细拆解

在这里插入图片描述

必须坚持

接口层
坚决不写任何业务逻辑代码

逻辑层
不接受任何接口层的容器对象,如request、response、cookie、session。如果哪天我的接口层不采用Web,这些对象就通通没有了
不处理任何数据存储相关的SQL语句,不依赖任何数据层对象。这些对象只有连数据库时候才会有,如果我换成缓存,它们也不复存在。

数据层
不处理任何业务逻辑代码

功能拓展

Web层
如果我想要增加WebService、WebSocket两个功能,我只需要在Web层中增加两个模块就可以了,不对另外两层造成任何影响。
如果我想改用JDBC、JSF、JSP做前端,我只需要改Web层就可以了,不对另外两层造成任何影响。

数据层
如果我们发现,某些数据的访问频度非常大,那么我们引入缓存就好了,只需要在数据层增加一个模块,不对另外两层造成任何影响。

进一步划分

看见这个图有没有什么感觉?
没错,这是流水线的感觉,对于多线程,我们通过进一步细化流程,以提升效率。那么如果我们将小模块聚合成服务,这样就成了微服务架构的雏形。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/98101.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/98101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QML学习笔记(一)基本了解和工程配置

前言: 已经从事QT开发几年了,但对于QML这个东西始终是没有彻底掌握,一方面实际工作中没有用到过,其次它的语法对我来说是全新的东西,不像QWidget那一套可以直接在C中去写。这就是为什么网上都说qml更简单,我…

SAP HANA Scale-out 04:缓存

结果缓存静态结果缓存 Vs 动态结果缓存FeatureStatic Result CacheDynamic Result CacheTarget Scenario对复杂视图(通常是顶层视图)的查询频繁更新的大表(例如ACDOCA)上的聚合查询Query result非实时数据实时数据ScopeTarget obj…

嘉兴禾润 HTR7216 (S) LED 驱动芯片:特性与应用

在如今智能设备飞速普及的时代,无论是智能家居的氛围营造、IoT 设备的状态提示,还是个人消费电子的视觉呈现,都离不开高性能 LED 驱动芯片的支撑。嘉兴禾润推出的 HTR7216 (S) LED 驱动芯片,凭借丰富的功能、精准的控制以及出色的…

Python实现剑龙优化算法 (Stegosaurus Optimization Algorithm, SOA)优化函数(付完整代码)

Python实现剑龙优化算法 (Stegosaurus Optimization Algorithm, SOA)优化函数(付完整代码)1.剑龙优化算法介绍剑龙优化算法(Stegosaurus Optimization Algorithm,SOA)是一种受剑龙独特生理结构和行为模式启发而设计的元…

分布式拜占庭容错算法——权益证明(PoS)算法详解

Java 实现权益证明(PoS)算法详解 一、PoS 核心机制 #mermaid-svg-Sbj0HU6MjOl1yo5L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Sbj0HU6MjOl1yo5L .error-icon{fill:#552222;}#mermaid-s…

【论文阅读】谷歌:生成式数据优化,只需请求更好的数据

谷歌DeepMind团队通过Generative Data Refinement(GDR)技术,成功将极端有毒的4chan讨论数据转化为安全且语义丰富的训练素材,推动了LLM训练数据净化的新范式: • GDR利用预训练大模型对原始数据进行“重写”&#xff0…

C++ 多线程实战 10|C++20 的信号量、闩锁与屏障

目录 前言 学习目标 1. 信号量(Semaphore) 示例:限制并发下载任务 2. 闩锁(Latch) 示例:赛跑 3. 屏障(Barrier) 示例:图像处理流水线 4. 常见坑与对策 5. 实践作…

【Java SE】01. 初识Java

1. 认识Java Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终…

解锁仓储智能调度、运输路径优化、数据实时追踪,全功能降本提效的智慧物流开源了

AI 视频监控平台:全链路协同驱动的智能监控解决方案AI 视频监控平台是一款融合高性能功能与轻量化操作的实时算法驱动型视频监控系统,其核心愿景在于深度破除不同芯片厂商间的技术壁垒,省去冗余重复的适配环节,最终达成芯片、算法…

冒泡排序与选择排序以及单链表与双链表

1. 冒泡排序(Bubble Sort) 1. 原理 冒泡排序是一种 简单的排序算法,通过 两两比较相邻元素,把较大的元素逐渐 “冒泡” 到数组末尾。 思路: 从数组头开始,比较相邻两个元素。 如果前一个比后一个大&…

Python实现计算点云投影面积

本次我们分享一种基于 Open3D 的快速、稳健方法,用于从激光点云中自动提取“地面”并计算其投影面积。算法先自适应估计地面高程,再将地面点投影至水平面,随后用凸包或最小外接矩形求取面积。整个流程无需人工干预,单文件即可运行…

AXI4 协议

一、AXI4简介AXI4(Advanced eXtensible Interface 4)是ARM公司推出的高性能片上总线协议,属于AMBA(Advanced Microcontroller Bus Architecture)标准的一部分。它专为高带宽、低延迟的片上通信设计,广泛应用…

《饿殍:明末千里行》Switch版试玩发布 3月13日发售

使用jQuery的常用方法与返回值分析 jQuery是一个轻量级的JavaScript库,旨在简化HTML文档遍历和操作、事件处理以及动画效果的创建。本文将介绍一些常用的jQuery方法及其返回值,帮助开发者更好地理解和运用这一强大的库。 1. 选择器方法 jQuery提供了多种…

[特殊字符] 认识用户手册用户手册(也称用户指南、产品手册)是通过对产品功能的清

一份优秀的用户手册能有效降低用户的使用门槛,提升用户体验和工作效率。下面我将为你梳理编写用户手册的核心要点、步骤和技巧。📖 认识用户手册用户手册(也称用户指南、产品手册)是​​通过对产品功能的清晰解释,为特…

苹果软件代码混淆,iOS混淆、iOS加固、ipa安全与合规取证注意事项(实战指南)

在移动软件交付与合规审计中,苹果软件代码混淆已成为保护知识产权与用户数据的常规手段。但混淆带来的不仅是逆向难度的提升,也会触发崩溃取证、符号化(symbolication)、审计合规与法律证据保存等问题。本文从工程与合规双视角出发…

Redis框架详解

目录 1. redis是什么 主要特点 2. redis中存储的数据类型 2.1 String类型 2.2 List类型 2.3 Hash类型 2.4 Set类型 2.5 Zset类型 2.6 其它类型 3.redis高可用框架 1. redis是什么 Redis 是一个开源的、基于内存的数据结构存储系统,是 Remote Dictionary…

每日随机展示10个wordpress置顶文章

WordPress 置顶文章是博主根据自己的需要设置的&#xff0c;通常用于展示重要或热门的文章。 以下是一个示例代码&#xff0c;用于在 WordPress 主题中展示 10 个置顶文章&#xff1a; <?php // 查询置顶文章 $sticky get_option(sticky_posts); $args array(post__in …

金融工程vs金融数学:谁更贴近量化交易?

在金融行业迈向高度数字化的今天&#xff0c;量化交易已成为顶尖金融机构的核心竞争力之一。它以数学模型为基础&#xff0c;借助编程技术实现策略自动化&#xff0c;在高频、中低频、套利、因子投资等多个领域展现出强大生命力。对于有志于此的大学生而言&#xff0c;选择一个…

实测AI Ping,一个大模型服务选型的实用工具

作为一名长期奋战在一线的AI应用工程师&#xff0c;我在技术选型中最头疼的问题就是&#xff1a;“这个模型服务的真实性能到底如何&#xff1f;” 官方的基准测试总是在理想环境下进行&#xff0c;而一旦投入使用&#xff0c;延迟波动、吞吐下降、高峰期服务不可用等问题就接踵…

深信服软件:aTrustAgent异常占用问题处理

问题&#xff1a;aTrustAgent占用CPU 大早上开电脑&#xff0c;风扇转的飞起&#xff0c;任务管理器看&#xff0c;发现是有几个 aTrustAgent 进程搞得鬼。 印象中&#xff0c;好像没有装过这个软件&#xff0c;搜了下&#xff0c;是深信服的软件&#xff0c;不知道是不是装哪…