三层架构的进一步理解

三层架构理解 采用三层架构实现信息的管理,无偿奉送源代码,希望可以帮助到需要的人。 立即下载

三层架构也有十年的历史了,虽然刚毕业的时候做的就是三层架构的应用,但是今天回想起来当时并没有真正理解三层架构需要解决的问题,只是盲从,生搬硬套而已。

 

现在是人都知道什么是三层架构,无非用户界面(UI)、业务逻辑(Business Logic)和数据层(Data)。UI和Data这两层都好说,数据一般不就数据库(当然还可能是文件系统或者其他数据服务,当然利用DBMS一定是最多的)么,UI也好理解,总要给用户界面才能用,现在基本都是图形界面,无非是窗口、页面或者报表之类的东西。关键是业务逻辑该放点什么东西,这往往是争议最大的地方。看到很多人抱怨三层结构平添了接口的复杂度,中间添加了一层转换,可能会带来性能问题,所以我们往往会困惑,三层架构优点在哪儿?

 

大多数人对于业务逻辑层的理解就是有这么在一组对象,他们封装了所有数据库的操作;用户界面层只是通过调用业务逻辑层的对象进行工作,创建对象、调用对象的方法,总比写SQL看起来简单很多,另外一方面,只能通过业务逻辑层访问数据库,在业务逻辑层能够完成安全性的检查,数据完整性的保证。听起来不错,另外还有人说,三层架构便于分工,让擅长数据库的老兄去开发业务逻辑层对象,而擅长UI的老兄开发界面,或者可以快速的为用户定制功能等等。好像很完美呀,那么我们就用这个架构上吧。

可以做着做着,问题就来了,有几种情况最常见:

i)                    查询结果如何处理。
查询结果通常都是返回很大一组数据,比如1000行的结果集。业务逻辑层查询数据库得到一个1000行记录的结果集,这应该没有疑义,但是如果返回给用户界面呢?是包装成对象,生成1000个对象,再把这1000个对象的集合返回;还是直接把查询到的结果集返回?
如果重新包装返回对象集合,稍微有点良知的人都会有些惶恐,那可是要创建1000对象,然后1000对象属性的赋值,很显然会带来大量的开销,而且这种查询是很频繁发生的,普通的“树-列表”的应用模式下,每一次树节点的选择,都会执行一次查询,那么频繁的对象创建和销毁,势必会产生很多内存碎片,又是一个影响性能的地方。
如果直接把结果集返回,岂不是用户界面这一层需要关心数据库的结构,甚至字段名,本来想对数据库进行隔离的目的不就达不到了么?这时候多个中间层,好处何在?

ii)                  需求变化时修改的地方反而多了。
如果到今天还有人幻想着,需求能在开发之前固定(不要说软件外包,那是编码,不是开发),那么他不适合做开发,可以转行了。需求的变更是永恒的,不变仅存于人们美好的愿景中。
一旦需求变化了,例如业务对象增加了一个特性,大家会发现,我数据库需要增加一个字段,业务对象需要增加一个属性,用户界面可能需要增加一个输入框。慢着,我们不是说三层架构是松耦合的么,怎么还是要改一起改呀。也许高明一点的设计师可以通过数据库扩展字段和对象扩展数据的方法,使业务逻辑层和数据库层适用这种变更。但是当增加一种业务对象,或者业务对象的关系发生变化时怎么办?要知道用户永远比你想象中无知,也永远不可能让用户去服从你的架构,尽管你自以为架构很完美。
天哪,现在当发生变化时我需要修改三个地方,还不如两层结构只需要修改两个地方呢。这不是给自己添麻烦么。

相信仅这两点就可以让很多人信心动摇,不行我们要回忆一下业务逻辑层的好处:

a)      装数据库操作,使业务逻辑与用户操作相分离。但是一般DBMS都有存储过程(Stored Procedure,SP),我可以把业务逻辑放到SP中呀,不也是和用户操作相分离么。

b)      以对象的形式提供业务方法,简化界面的调用。这个优点似乎还在,不过仅仅是为了包装成对象,方便调用,那么其实把业务对象和UI部署在一个物理节点上也可以达到这样的效果,哪我搞台App Server出来干吗?

c)      使开发组内的成员各取所长,专注于自己所擅长的领域。算了吧,没几十个人的团队根本不可能分工如此细致。以笔者招聘的经验,就算是划分三层架构,还不是按模块分配工作,一位老兄从头干到底。

既然好处缺缺,我们是不是可以说三层架构“中看不中用”呢?笔者也曾经困惑过这个问题。

 

不过软件行业毕竟不是娱乐圈,炒作有之,务实的人更多。何况这几十年来软件这个领域集中了全世界那么多聪明的人,计算机科学本身又是和实际应用联系非常紧密的一门学科,大家都是工程师,鼓捣十年,还在继续鼓捣,显然是有实际价值的,要知道这些年来有多少技术已经被抛弃。既然不是三层架构的问题,就应该是我们理解的问题;我们之所以不能理解三层架构本质的优势,是因为我们所构建的应用的规模太小,没有达到那个Level。当我们要选择三层架构时,请先问一下自己:我们系统的并发访问量是否已经高到我们不得不用负载平衡(Load Balance)才能够解决的地方?是否存在多个数据节点,一定要应用分布式事务才能够保证数据访问的有效性;或者数据量巨大到我们不得不划分多个数据节点才能够存储?

分层的目的是为了隔离,隔离的目的是为了当一方的下游发生变化时,它的上游无需随之变化。这种变化不仅仅是功能上的变化,而是性能或者应用模式上的变化,例如:从局域网迁移到Internet上,原先满足1000个用户,现在需要满足100,000个用户。这其实就是系统可伸缩性(Scalability)的问题,三层架构就是为了解决可伸缩性问题的,至于对业务逻辑提供对象形式的包装都是顺带的,老是以这个作为三层架构优点反复鼓噪的人,简直是误人子弟,至少当年笔者就被误了。

为什么我们需要中间层,因为数据层可能会发生变化。系统开始可能使用Access,随着业务量的增大需要升级到SQL Server;原先一张表可以记录一类数据(比如交易数据),现在需要分割成多张表(按年或者月水平分割,或者主从表垂直分割);原先一个数据节点能够存储所有的数据,现在需要部署到多个节点。这时候只需要修改中间层对象以满足数据层的变更,而用户界面层无需任何变化,系统在成长,但是用户的体验是一致的。

在这样的架构中,数据层需要能够能够分割,甚至支持多节点(DBMS通常不支持负载平衡),或者自己实现的负载平衡的数据服务;业务逻辑层(中间层)需要支持负载平衡,以及分布式事务等一些高级的应用;用户界面层,也就是前端服务也需要支持负载平衡,以适应将来可能上万甚至几十万用户的并发访问。只有做到这一点,系统才是可伸缩的。至于业务逻辑层是不是面向对象的,自己看着办吧,这只是设计方法和架构关系不大。

 

总之一句话,只有在高可伸缩性的环境下,三层架构才能体现出自身的价值;如果一台应用服务器和一台数据库服务器就能够覆盖我们全部应用的话,那么除了三层架构,随便玩,分多层不能给我们带来太多好处,反而增加了系统复杂度。

 

PS:WCF是干什么的?站在三层架构的角度,个人理解为:WCF是封装UI Layer和Business Logic Layer之间通讯的框架。

 

 
再谈经典又古老的三层架构 NULL 博文链接:https://wujianjun.iteye.com/blog/1489915 立即下载

相关推荐

简单三层架构解决方案

用C#语言写的简单三层架构解决方案,UI、BLL、DAL三层

什么是三层架构?

三层架构 三层架构来源于后端开发的一种分层的思想。 引用自百科的解释: 三层架构(3-tier architecture)通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。 区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(

weixin_49066399的博客 4万+

华为云HCS解决方案笔记HUAWEI CLOUD Stack【面试篇】

华为云解决方案介绍、华为云服务介绍,华为云网络平面规划等

weixin_48375618的博客 1万+

三层架构的简单理解

1.什么是三层? 2.为什么使用三层? 3.三层之间数据是怎么传递的呢? 4.三层的优缺点? 5.三层登录实例 一、什么是三层? 在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。三层结构从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。 表示层(UI):主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。 业务逻辑层(BLL):UI层和DA...

Ariel_欢 4114

CentOS 7下Synopsys DC综合工具安装与配置全攻略(附常见报错解决方案)

本文详细介绍了在CentOS 7操作系统上安装与配置Synopsys Design Compiler(DC)综合工具的完整流程。内容涵盖从系统环境准备、软件安装、许可证配置到实战综合的全过程,并针对DC综合工具在安装和运行中常见的报错问题提供了具体的解决方案,帮助数字IC设计初学者快速搭建稳定的EDA学习环境。

weixin_29159441的博客 257

学习笔记:物理信息神经网络(PINN)

PINN 的强大在于它打破了传统数值方法的限制,将神经网络的非线性拟合能力与物理方程的严谨性结合起来。它在处理高维、数据稀缺、复杂物理约束的场景下尤其出色。当然,PINN 也有收敛慢、梯度消失等挑战,比如,复杂 PDE 可能导致梯度传播困难,收敛慢(梯度消失)、于具有快速变化特征的系统,如冲击波,标准 PINN 可能精度不足,需要改进策略,比如自适应采样或多尺度特征提取。但随着研究深入,这些问题正在不断被解决。物理或化学方程为什么往往是偏微分方程?什么是物理信息神经网络(PINN)?x_%7Bi%7D。

qq_52635735的博客 1万+

三层架构介绍

了解三层架构的概念、优势与应用

TestXzing的博客 1万+

从零到一:龙芯杯参赛全攻略(含北理工学长经验PDF、B站培训视频与开源代码合集)

本文详细介绍了龙芯杯全国大学生计算机系统能力大赛的参赛全攻略,包括资源整合、技能树构建、团队协作和避坑指南。提供北理工学长经验PDF、B站培训视频与开源代码合集,帮助参赛者从零基础到站上领奖台。重点解析如何高效获取优质资源、避开新手常见陷阱及构建可落地的学习路径,助力普通学生系统学习CPU设计。

weixin_26802933的博客 542

三层架构知识点

当当当当~~~~欢迎大家阅读,今天我们学习三层架构 一、什么是三层架构 1、三层架构的含义 三层架构就是为了符合“高内聚,低耦合”思想,把各个功能模块划分为UI(表现层)、BLL:(业务逻辑层)、DAL:(数据访问层)三层架构。额外的还有一层实体类(Model),作为数据传递的载体,在各层之间传递数据。 2、高内聚: 内聚:就是一个模块内各个元素彼此结合的紧密程度。 高内聚:就是一个模块内各个元素彼此结合的紧密程度高。(但各个层只负责单一功能)。 3、低耦合: 耦合:一个完整的系统,模...

Z2658172512的博客 1417

无人机机场自动化巡检钢铁厂管廊技术方案

摘要:针对钢厂管廊人工巡检效率低、成本高等问题,提出5G+无人机自主巡检解决方案。该系统由智能机库、5G无人机、AI分析平台等组成,可实现自动起降、实时数据传输、缺陷智能识别等功能。无人机配备四合一云台相机,支持42分钟续航和复杂环境飞行,通过深度学习算法自动生成巡检报告。方案实施后可提升巡检效率3倍以上,降低人工成本和安全风险,实现全天候自动化巡检,为钢厂管廊安全管理提供智能化技术支持。(149字)

gxdhlg的专栏 1685

【LLM数据篇】预训练数据集+指令生成sft数据集

在《Aligning Large Language Models with Human: A Survey》综述中对LLM数据分类为典型的人工标注数据、self-instruct数据集等 优秀的开源sft数据集:alpaca_data、belle、千言数据集、firefly、moss-003-sft-data多轮对话数据集等 文章目录 note 构造指令实例的3种方式 sft:Aligning Large Language Models with Human: A Survey Alpaca 1. self

发现问题,并解决问题,批判性思维 1万+

【C#】—三层总结

前言 三层敲完之后,有很多不理解的,代码直接看的视频并不知道之间的值是怎么传的,后来逐句调试了几遍,把每句话的代码基本都写上了,逐渐理解了。 三层是什么 三层架构把整个软件分为了三个层次:表现层(presentation layer)、业务逻辑层(Business Logic Layer)、数据访问层(Date access layer) UI层称为表现层,像用户展示特定的业务数据,收集用户的...

Alice 1692

YOLOv12涨点改进 | Neck特征融合改进篇 | YOLOv12引 入 BiFPN双向特征金字塔网络,显著提升了多尺度特征融合效率,目标检测、图像分割、图像分类,助力高效涨点

本文提出了一种基于BiFPN特征融合模块优化的YOLOv12目标检测方法。BiFPN通过引入可学习的权重实现高效的多尺度特征融合,结合双向连接机制提升特征提取能力。实验表明,该方法在COCO数据集上实现了优异的检测性能。文章详细介绍了BiFPN模块的原理、核心代码实现,以及如何将其集成到YOLOv12框架中,包括模块添加、配置文件修改等具体步骤。这种改进方案具有参数少、计算量小等优势,为高效目标检测提供了一种新的技术路径。

Ai缝合怪、助力小伙伴高效发论文 391

三层架构入门

在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层、表示层。              1、表示层(WEB):位于系统的最外层,离用户最近。用于显示数据和接受用户输入的数据,只提供软件系统与用户交互的接口界面。        注意:不要在表示层写与业务逻辑和数据访问相关的代码甚至SQL语句。

孙端 2824

C++实现复制粘贴文本功能

要实现这个功能,我们需要使用操作系统提供的函数来操作剪贴板。在Windows操作系统中,我们可以使用Windows API函数来访问剪贴板。总结起来,使用C++实现复制和粘贴文本功能涉及使用操作系统提供的API函数来操作剪贴板。在本篇文章中,我将向您展示如何使用C++编程语言实现复制和粘贴文本的功能。我们将使用操作系统提供的API来进行剪贴板操作,并编写相应的代码来完成这个任务。如果您使用的是Linux操作系统,您需要使用适当的库和函数来访问剪贴板。函数中,我们首先将一个字符串复制到剪贴板中,然后使用。

PixelDyno的博客 1233

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

在路上 -- MVC模式和三层架构

本文简单讲解了MVC模式和三层架构,适合初学者的入门

qq_63094247的博客 155

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

JavaWeb Model1、Model2(MVC)、三层

前言 “解耦”的思想一直是我们倡导的,但在实际项目中怎样去做?这是需要我们去好好思考的。下面以Model1、Model2、三层为切入点,对比下去了解解耦的思想。 一、Model1 使用JSP页面和JavaBean相结合的方式,由JSP页面来接收客户端请求,用JavaBean或其他服务完成业务逻辑、数据库操作和返回页面。我们这里的JavaBean主要是完成特定功能的Java类。 优点...

热心网友 1732

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

三层架构

三层架构 a) 解释 显示层 :只做显示相关的处理 业务逻辑层:业务处理 业务层之间的函数不互相调用 数据库访问层:操作数据库 b) 分包 视图层 com.hpe.view 用户界面 业务逻辑层 com.hpe.service 数据持久层 com.hpe.dao 数据库访问 其它 com.hpe.po 实体类 com.hpe.vo 视图类(联表查询实体类) ...

ChaoLingW的博客 409

浅谈Javaweb经典三层架构和MVC框架模式

浅谈javaweb三大框架和MVC设计模式 小序:博主以前在学javaweb的时候开始总不理解javaweb三大框架和MVC框架模式,虽然没有把两者混为一谈,但是也是很晕菜。作为一个Java开发程序员的话,特别是B/S架构的开发来说,MVC框架模式是我们必须要掌握的!!!

做一枚优秀的程序猿,欢迎交流: sunpeng1996 at aliyun dot com 6万+

七层总结

七层登录我已经实现了,现在非常有必要总结一下。 七层登录是三层的延伸,我们首先要理解三层登录,在此基础上拓展。

Baron 741

高性能MySQL(3th)(第一章 MySQL概述) —— 01 MySQL逻辑架构

MySQL逻辑架构 可以分为三层:客户端,服务层,存储引擎层。 书中写到: 注意,第一个行的“最上层的服务“指的不是客户端,而是图中的“连接/线程处理”,实际上,MySQL 和Redis一样,是C/S架构的,客户端只是服务调用者,所有服务都由服务端提供。而我们敲的sql语句(默认自动事务提交)或者事务在敲回车之前,都只是还未发送的客户端请求而已。 而对于上图中服务器层和存储引擎层各...

ProLayman的博客 343

简介常见的四种类型的J2EE架构

简介常见的四种类型的J2EE架构 作者:云飞出处:IT专家网论坛2008-10-30 00:00 J2EE应用一般分成三个主要层(tier),这种分层比客户/服务器方式具有更多的优点;   1.关于J2EE应用的架构层   J2EE应用一般分成三个主要层(tier),这种分层比客户/服务器方式具有更多的优点;   他们分别是Us...

weixin_30411819的博客 190
上一篇: 编码系列--Base32编码的完整示例
下一篇: CSharp Tips:使用OleDb操纵Excel文件(1)
Mittermeyer
博客等级 码龄25年 60粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值