- 我是一个线程(修订版)
- 我是一个 Java class
- Javascript:一个屌丝的逆袭
- Java : 一个帝国的诞生
- JSP 一个装配工的没落
- TCP/IP 之 大明王朝邮差
- TCP/IP 之大明内阁
- TCP/IP 之蓟辽督师
- CPU 阿甘
- CPU 阿甘之烦恼
- CPU 阿甘:函数调用的秘密
- 我是一个网卡
- 我是一个路由器
- 我是一个进程
- 我是一块硬盘(上)
- 我是一块硬盘(下)
- 我是一个键盘
- 张大胖的 socket
- 张大胖学递归
- 学习面向对象的令狐冲
- 张大胖学数据库
- 数据库村的旺财和小强
- 小李的数据库之旅(上)
- 小李的数据库之旅(下)
- 漫画:什么是机器学习?
- 那些烦人的同步和互斥问题
- IE 为什么把火狐和 Chrome 给打伤了?
- 对浏览器村的第二次采访
- 节约标兵 IE 的自述
- EMail 诞生记
- Email 诞生记(下)
- Http 历险记(上)
- Http 历险记(下)-- Struts 的秘密
- 动物王国的面向对象
- 冯·诺伊曼计算机的诞生
- Http Server : 一个差生的逆袭
- 张大胖的加法器
- 从 1 加到 100:一道简单的数学题挑战下你的大脑
- 编程语言
- Javascript:一个屌丝的逆袭
- 计算机语言之战
- 我和编程语言的爱恨情仇(上)
- 我和编程语言的爱恨情仇(下)
- Android 为什么选择了 Java
- iOS 为什么选择了 Object-C?
- Basic : 一个老兵的自述
- Node.js : 我只需要一个店小二
- 命令式编程 vs 声明式编程
- 编译还是解释?
- 程序人生
- “架构师"小赵
- 师兄说
- 师姐说
- 小王的架构师之路
- 小李的版本管理系统
- 小超穿越记
- 小李的 Build 之路(上)
- 小李的 Build 之路(下)
- 张大胖改 Bug
- 我的编程之路--大学趣事
- 码农小王的一天
- 小李在外企
- 张大胖的需求估算
- 从厨师到码农
- 聊一聊那些神一样的程序员们(上)
- 聊一聊那些神一样的程序员们(中)
- 聊一聊那些神一样的程序员们(下)
- 谁是互联网之父?
- 一个价值百万的创业教训
- 让自己与众不同 - 提升工作的价值
- 看看你的“易燃性”
- 从无聊的工作中寻找价值
- 什么样的学生适合报考计算机?
- 谈谈程序员的职业方向(上)
- 谈谈程序员的职业方向(中)
- 谈谈程序员的职业方向(下)
- 谈谈培训班的作用
- 码农需要知道的“潜规则”
- 学习编程的加速度
- 码农在工作中的必备能力
- 码农和英语
- 老司机经验
- 假如时光能够倒流, 我会这么学习 Java
- 假如我是计算机系老师
- 学会编程, 而不是学会 Java
- 从增删改查中突围
- 抽象:程序员必备的能力
- 懒就一个字
- 编程的自学方法
- 小王买房记
- 从一道面试题谈谈一线码农应该具备的基本素质
- 想写框架的看过来
- 苹果手机变砖头以后
- 如何快速的学习一门技术?
- 唯一不变的是变化: 谈谈微信应用号
- 什么是企业应用?
- 勿以浮沙筑高台
- 为什么敏捷开发难于成功?
- localhost vs 127.0.0.1
- GitHub/Stackoverflow 找工作时有什么用?
- 动词 or 名词 :这是一个问题
- 如何选择入行语言
- 有时候,沉默是金
- 零 Bug 的代码是怎么炼成的?
- 浮点数为什么不精确?
- 文章错误大全
- Open Source--不要为了开源而开源
- 一不留神,代码就腐化了
- 先做个“键盘侠”, 再来写程序
- 不加断点调试的程序员是好程序员
- 码农必备技能:烂代码的处理之道(上)
- 码农必备技能:烂代码的处理之道(下)
- 学习数据结构有用吗?
- 从现在开始,丰富你的简历
- 那些永不过时的书,你看过几本吗?
- 学好编程必备的一个品质你知道吗?
- 你最爱的 Java
- 搞懂了这几点,你就学会了 Web 编程
- Spring 的本质系列(1) -- 依赖注入
- Spring 本质系列(2)-AOP
- 三层架构和 MVC 那点事儿
- Java 帝国之拨云见日识回调
- 小张的 Duck Typing
- JDBC 的诞生
- JDBC 后传
- 一个不安分的 JDBC 驱动
- Java 帝国之 Java bean (上)
- Java 帝国之 Java bean(下)
- Java 帝国之函数式编程
- Java 帝国之函数式编程(下)
- 关于 Java 初学者需要知道的 10 件事
- JUnit 你不知道的那些事儿
- 圣诞礼物:Java EE 的历史
- Java EE 读书指南
- 给小白的 Java EE 指南
- 给小白的 Java EE 指南(2)
- 给小白的 Java EE 生存指南(3) : XML
- 给小白的 Java EE 生存指南(4) : 一只叫 Tom 的猫
- 给小白的 Java EE 指南(5) : AJAX
- 给小白的 Java EE 生存指南(6) :Java 反射
- 闲聊
- "饿了么"初体验
- 来自大脑的控诉
- 一个高中生是怎么玩自媒体的?
- 尝试 分答
- 到底应不应该上培训班?
- 自学编程中遇到问题怎么办?
- 据说 99%的初级程序员看完后都不迷茫了
- 一行代码引发的“血案”
- 对一个死锁问题的思考
- 通过外包进入名企
- 请开往十年前的今天
- 为什么自学中最好有个师傅指导一下?
- 这个网站值得你花时间投入
- 为什么你无法坚持自学编程?
三层架构和 MVC 那点事儿
前言: 这是个老生常谈的话题了, 但我估计很多人还是会有疑惑, 我把自己的思考和大家分享下, 欢迎批评指正。
据说在上个世纪 40 年代, 有个叫 IBM 的公司宣称, 全世界只需要 5 台计算机就够了!
当时的人们肯定预料不到未来蓬勃发展的 PC, 更想不到人们对计算有着多么大的需求。
那时候电脑是一个称为 哑终端 的东西, 这个东西可怜到只能用来发送、接收和显示字符, 不能安装程序, 没有复杂的交互, 即使是这样, 还只能是少数人有机会去使用。
但是,这个哑终端和一个无所不能的庞然大物相连接, 叫做“mainframe”, 这个怪兽掌管着所有的程序和数据。 这些哑终端就像是这个怪兽的触角而已, 离开了母体, 几乎没什么用处。
历史车轮滚滚向前, 从上世纪 80 年代开始, 个人计算机开始迅速的进入千家万户。
这些叫做 PC 的东西具备不错的计算能力,存储能力和显示能力, 完全不需要那个大怪兽就可以生存。
再加上局域网蓬勃发展, 大家马上想到, 能不能把 Mainframe 的部分功能移到 PC 上来?
这样既可以充分的利用资源, 又可以把 Mainframe 给弱化, 也许只用一个普通的服务器就能干活了。
想来想去, 数据库还是不能动, 还得要一个服务器来支持。
但是这业务逻辑,界面处理是不是可以放到客户端 PC 中来了? 于是就出了这么一个结构:
客户端的应用程序可不仅仅是显示字符了,它承担的任务很重, 要负责界面接口(我们常说的表示层逻辑), 业务逻辑, 还要负责和数据库服务器的通信, 有个很形象的词来称呼这些客户端应用程序: 胖客户端(fat client) 。
这就是典型的两层(2-tier)架构, 在 90 年代风靡一时, VB, PowerBuilder, Delphi 可以说是其中的代表, 这些工具都具备快速开发的能力, 通过拖拽控件到表单上, 很容易形成界面, 然后把控件和数据库的数据绑定就可以了。
客户端“变胖”是个进步,计算开始分布, 资源可以平衡, 但是这个架构也有几个缺点。
首先是每个客户端需要直接一个数据库连接, 发出查询, 显示数据。 由于客户端直接连接数据库,而数据库的连接又是非常宝贵的资源, 无法支持大量的客户端来访问,所以 2-tier 架构是用在局域当中的, 很难想象数据库暴露给海量的互联网用户直接访问。
其次业务逻辑和表示层逻辑绑在一起, 一旦业务逻辑有修改, 就意味着客户端的整个应用程序都要改一遍, 哪怕是修改了一点点业务逻辑, 那怕是这点逻辑对界面没有任何影响, 对不起, 请您重新发布, 测试,部署到所有的客户端吧。
所以把业务逻辑层和表示层分离开, 让各个部分各司其职,尽量独立,减少依赖成为了下一步的目标。
随着互联网的兴起, 尤其是应用服务器和中间件的出现, 业务逻辑找到了容身之所, 成功的和表示层逻辑分了家, 2-tier 迅速被 3-tier 架构所替代。
客户端的应用程序减肥成功, 只负责表示层逻辑(界面接口), 可以是一个独立的应用程序, 也可以是 Web 页面, 后者更加流行, 因为一个浏览器就可以工作了, 打开即用, 都不用安装。
那些不讲逻辑的业务逻辑被移到了服务器端, 可以尽情的修改, 只要不影响接口就行。
凡事都有利有弊, 分层要求某一层只能和自己的邻居打交道,不能跨层访问。
例如表示层不能绕过业务逻辑层直接访问数据库, 非得通过业务逻辑层不可。 数据在各层之间传来传去, 效率肯定有损失。
级联的修改也不可避免, 做过 Web 开发的应该深有体会, 客户说我们要在界面上加个新字段啊, 程序员把表示层改了当然不够, 业务层需要改, 数据库也得联动。
注意, 我之前提到层的时候,用的词都是 Tier , 而不是 Layer 。
虽然这两者经常互换使用, 但是确实有差别, 据 Wikipedia 定义, Tier 一般指的是物理的结构, layer 指的是逻辑结构, 举个例子, 一个 3-layer 的解决方案可以部署到一个 tier 上例如一个服务器。
现在我们把视线转向逻辑结构, 抛弃那些 PC, 应用服务器, 数据库服务器 , 把 3-tier 变成 3-layer 。
注意:从现在开始, 我们提到的层都是 layer 了。
你看业务层和数据访问层是不是可以放到一个物理的服务器上的, 实际上我们也是这么做的:例如 Spring 可以认为是个业务层框架, Hibernate 是个数据访问层的框架, 它们俩完全可以部署到一个应用服务器中(如 Tomcat), 没有任何问题。
可能有人要问了, 我钟爱的 Struts/Spring MVC 在哪儿? 这些 MVC 的实现框架实际上应该属于表示层, 至少是说 C(Controller) 和 V(View)属于表示层:
当然这是一个非常简化的图, 现实会复杂的多的多, 例如:
1. 像 Struts 有一个前端控制器(Front End Controller), 会把请求分发给一个个具体的 Action 来处理。
2. 无论是 Controller 还是 Action, 通常不会直接访问 Model, 而是访问一个叫做 Service 层的封装, 其中可以处理安全和事务。
3. View 通常不会直接访问 Model , 也会封装一下 , 例如通过 Helper 类, ViewBean 等等
......
可以看出,这些 MVC 框架实际上都是放在服务器端的, 它接收 HTTP 请求, 输出 HTML+Javascript+CSS 到客户端机器, 在浏览器中运行起来 。
这里说的还是相对“传统”的架构, 现在新的趋势又开始形成, 那就是前后端分离, 服务器只剩下了业务层, 用于执行业务逻辑和提供接口, 表示层完全被移到了浏览器当中,那就是另外一个故事了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论