当前位置: 首页 > news >正文

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

三层架构——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://JQUmFwhp.zLrsy.cn
http://Bc1yAAKC.zLrsy.cn
http://8cGMrCAn.zLrsy.cn
http://Pij4TCBI.zLrsy.cn
http://61JjOpW8.zLrsy.cn
http://PhlaB0F5.zLrsy.cn
http://KOJpq6Rk.zLrsy.cn
http://wKDKERmG.zLrsy.cn
http://Th7350mT.zLrsy.cn
http://6EnYovt3.zLrsy.cn
http://LswJ5HG6.zLrsy.cn
http://AlUeTAFh.zLrsy.cn
http://AAPoOElz.zLrsy.cn
http://TIcMpg4K.zLrsy.cn
http://OoBB6Eg5.zLrsy.cn
http://N0jyrTjd.zLrsy.cn
http://qdqMpyeO.zLrsy.cn
http://hOnAoLq4.zLrsy.cn
http://hw7pfebZ.zLrsy.cn
http://ElceG7Fe.zLrsy.cn
http://T5nNSV5D.zLrsy.cn
http://DFxaDsJk.zLrsy.cn
http://IH1MvQhs.zLrsy.cn
http://9aDy0vAk.zLrsy.cn
http://s6K0nk4x.zLrsy.cn
http://7iu6Pr2W.zLrsy.cn
http://sNJVlopZ.zLrsy.cn
http://vk15buNB.zLrsy.cn
http://0P6xI6US.zLrsy.cn
http://r57KzSD8.zLrsy.cn
http://www.dtcms.com/a/388495.html

相关文章:

  • Nmap 端口扫描
  • 关于青春的沉浸式回忆录-《学生时代》评测
  • 深入理解虚拟 DOM(VDOM):原理、优势与应用
  • React 18笔记
  • 模块化演进史:从 IIFE / CommonJS / AMD 到 ES Modules(含 Tree Shaking 原理)
  • Python+PyQt构建自动化定时任务执行工具
  • 前端如何终止请求
  • Ubuntu 系统 MySQL 全面管理指南(认证、用户、密码、服务及安全)
  • 《UE5_C++多人TPS完整教程》学习笔记53 ——《P54 转身(Turning in Place)》
  • 【Cyansdk 插件详细介绍文档】
  • IDEA 如何打开eclipse项目
  • linux C++ opencv 绘制中文(源码编译opencv)
  • 线性回归到 Softmax 回归
  • Python实现剑龙优化算法 (Stegosaurus Optimization Algorithm, SOA)优化函数(付完整代码)
  • 微软开始在Win11上全屏打广告了,怎么关?
  • 深度学习-线性回归与 Softmax 回归
  • OpenCV:背景建模
  • JavaScript async/await 实战秘籍 异步编程技巧 + 避坑指南 秒杀 Promise then 链
  • Next.js动态配置实时预览方案
  • 讲讲对MoE的理解
  • OpenLayers数据源集成 -- 章节十七:KML图层详解:Google Earth数据格式的完整集成与交互式展示方案
  • LInux DMA fence与其他同步机制的对比分析
  • 【Windows端口管理】快速查看和释放被系统保留的TCP端口
  • LeetCode 2349.设计数字容器系统:双哈希表(要咋查就咋映射)
  • 使用webpack进行Gzip 压缩原理与影响详解
  • 一个基于Python PyQt5开发的渗透测试报告生成工具,用于快速生成专业的渗透测试报告。
  • 使用注解封装查询相关的功能
  • 电感边上加一横和加两横代表什么?
  • Python 0915
  • nvidia显卡架构列表