共计 7633 个字符,预计需要花费 20 分钟才能阅读完成。
软件为什么要分层?
首先要有一个背景: 在一个大型软件系统设计时, 业务个别绝对简单, 不像一个 HelloWord 写到一个类外面就能够了, 比方说求整数的和, 求某个范畴之内基数的和偶数的和, 这些否是一些比拟小的话题,
还比方说银行外面的业务包含还有保险这块证券这块你会发现就是字段业务数据都谁非常复杂, 那么如果所有的业务代码都写到一个类外面都纠缠在一起就会呈现逻辑不清晰, 可读性差, 保护艰难. 那么也就是在一个祝贺外面也一样,
把所有的事件都交给一个人来做, 比方说老师我这网络断了, 老师我这个电脑怎么这么卡顿啊, 老师我的椅子换了, 女朋友跟我离别了, 那你想一想老师明天没有什么情绪去讲技术问题了, 所以说这外面程序也是一样的.
当一个类你让它去做太多太多事件的时候, 那么这个类外面的代码量就会越来越多越来越多, 导致逻辑不清晰, 可读性还差, 保护起来还艰难. 那么还能够触发这样一种事件, 就是改变一处很多中央相关联的中央
都得去改, 你比方说一个类外面你既有管制逻辑又有数据逻辑, 还有业务逻辑, 还有页面显示逻辑等等等. 你把所有的这些性能都放到一个类外面去实现, 那这个代码就没法看了, 为了更好的去解决这样一个
问题, 有了咱们所说的分层架构设计, 晚期最早的时候咱们的软件其实都非常简单, 以前写一个企业介绍做一个网页最后的时候就做一个网页而已, 而且这个网页上没有都没有动静的只有动态的一个页面,
可能应用 html/css/js, 加起来几张图片, 显示一下这个企业的介绍就能够了, 当初要求在这个网页上进行注册, 在互联网下面进行答疑, 在互连网上进行领取, 你会发现互联网软件的需要在变, 而后呢咱们随着需要
的变动咱们的代码也须要变, 退出吧代码都写到一个类外面, 你可能在这个类外面改呀改呀改呀, 就十分十分不容易去对这个类进行保护了, 分层设计就当诞生了.
那为什么要有这种分层设计呢, 分层设计的实质其实严格来讲就是将简单问题简单化, 首先基于繁多准则让每个对象各司其职各尽所能, 而后基于高内聚低耦合, 分层当前, 其实每个对象都有本人的一个职责.
然而最终咱们要把这些对象融到一起, 通过对象这边的协同来解决问题, 就相似于公司外面咱们有很多部门, 比方说有职业发展部有教学部, 有咨询部有就业部等等, 然而最终这些部门要协同来服务于各位同学,
让各位同学找一份好的工作, 所以在这里呢要看, 程序中也是一样的, 尽管咱们把这个性能也就是把咱们这个类啊把不同的性能封到了不同的模块当中, 然而咱们最终这些模块这些对象还要耦合在一起, 然而如何耦合呢?
咱们要低耦合高内聚, 高内聚就是把这个职责不要外露, 你本人的就是你本人的, 比方说待业的事件不能交给咱们教学部, 那职业发展部的事件也交给咱们教学部, 那必定不行. 高内聚就是把你本人的业务先理清.
你本人的业务是那一部分? 首先要理出个 123 来, 你的业务范围是什么; 而后前面咱们这个低耦合, 不是你要解决的业务, 是他人要解决的业务, 然而咱们这两个业务模块要协同, 那这个时候怎么协同, 通过接口,
就是所谓的高内聚低耦合, 这种设计思维实现相干层对象之间的交互, 能够进步程序的可维护性和可扩展性. 但有的时候提到这点, 写代码写的写的同学他意识不到这个问题, 就相似于共享单车, 最开始咱们可能拿手机
扫码, 扫码当前还须要手动去开锁, 但当初蓝牙放开了当前, 只有手机去扫码, 蓝牙是开的, 能够主动开锁. 这就是需要的变动, 那咱们如何基于需要的变动让咱们的软件可能在不批改或大量批改代码的状况下就可能
满足这种需要, 这就是可扩展性.
通信畛域的 OSI 参考模型
接触过 TCP/IP 协定, 它是个分层协定, 它是那一层呢? 网络中还有典型的 OSI 参考模型, 这个你们理解, 就是互联网这个畛域外面也有一个分层设计, 比方说应用层 > 表示层 > 会话层 > 传输层 > 网络层 > 链路层 > 物理层
其实严格来讲, 咱们在互联网中传输数据的时候就是这样来传输的. 首先是应用层往下走, 也就是说你从网络中的一端传到另外一端把这个音讯, 它是有这么一个分层音讯. 这个其实到物理层传输的就是比特流: 二进制数据,
那么这个分层也就是说 OSI 参考模型它对应的一个简化模型其实就是咱们所说的 TCP/IP 典型的四层模型. 在这四层模型外面下面就是把这个应用层 / 表示层 / 会话层演绎为应用层, 你像咱们在浏览器外面输出 HTTP 协定:
http://www.baidu.com 各位同学 …
传递就是 UDP 协定. 那未来你可能说咱们这个 TCP 咱们叫数据传输层,UDP 也是数据传输层, 未来你这个数据是不是要通过网络进行传输那还得有一个 IP 网络层 (IP 地址), 而后最终是咱们的网络接口层, 其实网络接口层
就是把链路层和物理层和为了一层. 其实底层咱们手机打电话就用到了 TCP/IP 协定,
咱们互联网外面的分层架构 ----- 在上图箭头示意的是一种依赖关系, 就是下面这层依赖于上面这层, 上节课咱们在这写了 GoodsService 依赖于 GoodsDao 这叫依赖 has a 的关系. 凋谢接口层依赖于 Web 层, 也能够依赖于咱们的 Service 层.
如果说未来咱们做微服, 做分布式架构那么可能多个零碎, 那零碎与零碎之间要进行通信, 咱们当初正在做的是一个零碎, 那未来零碎与零碎之间须要通信吗? 也须要
基于 Java 的互联网架构, 在进行分层设计时, 首先要对整体的零碎分层架构有一个根本意识. 整体分层怎么了解呢? 第一个, 这一层你们总是意识的吧, 为咱们的操作系统是跑在硬件之上, 你得有 CPU(负责计算的), 存储设备 (存你的数据的),
可能有外存内存就是你的磁盘也还, 内存条也好, 内存; 还有一些网络设备, 这个网络设备就不用说了吧, 路由器交换机网线等等等等, 那么在硬件层之上是谁? 操作系统吧, 操作系统是不是负责调度和治理你的硬件的呀?
比方说操作系统把你的这个操作交给 CPU, 你在网络上要存储一个文件, 比方说你在操作系统上 新建一个文件夹,word, 文本, 那个文本是不是存储到具体的某一块存储设备上, 未来你的这个数据想从这一端传到另外一端
是不是需不需要网络设备? 须要也就是操作系统严格来讲就是调度和治理你的根底硬件层. 操作系统上能够装 Tomcat, 未来能够装 Redis, 还有咱们的 MQ, 包含咱们数据库是装在操作系统下面的, 你的操作系统是装在平台中间件层.
还有应用软件层, 比方说你的领取零碎利用零碎. 就相似于各位同学你们用的 TTS, 其实都是放在 Tomcat 外面, 在 Tomcat 中去运行, 这就是一个中间件服务器, 那么还有呢刚开始让你写操作系统难吗难, 你写不进去, 别说你写不出不来,
整个中国有几个能把操作系统写进去的? 没有, 很少. 还有平台中间件, 比方说你们用过 Tomcat, 你们写过 Tomcat 吗? 没有. 然而有人去写吗? 所说一些写平台的都是一些高级的软件工程师. 那么这个下面, 你写的这个领取零碎比方说
有的同学写了一个永和门店零碎, 那个永和门店零碎跑在谁的下面呀?Tomcat 下面, 没有 Tomcat, 没有相似的这样的 web 服务器, 你写的那个软件是不是无用武之地呀, 他得有运行的平台. 而后在这个下面, 在这种应用软件下面,
可能就是接入层了, 这个接入层指的是什么呢比方说网管呀, 就相似于各位同学思考咱们要想间接拜访谷歌分让咱们拜访吗? 拜访不了, 国家在网管层面做了设置. 你要想进来只能翻墙或者通过代理进来的未来咱们这个网管
在这里它会有这么一个设计第一它有这么一个作用, 就是要监控你这个拜访的入口, 你要拜访哪里; 第二, 它要把你的申请分发给不同的服务吧, 还有未来你们可能还会学到负载平衡,CDN, 其实都属于软件的 ` 接入层..
未来咱们去拜访一个服务端的资源, 就拿百度来讲, 可能给你出现一个页面,js/css/html 页面是不是须要从服务端传到客户端呀? 然而有些动态资源长时间不变, 那能不能把这些动态资源咱们放到本地的一个服务器上, 就近的
服务器上呢? 有些公司就专门的卖这样的服务器资源叫 CDN, 把一些 css/js 就放在这下面了, 这里想要你意识到大的软件分层.
其实咱们的软件整体分层, 根底硬件层不要 / 操作系统是软件 /Tomcat 是软件 / 领取地图零碎是软件 —- 咱们的根底硬件层是为咱们的下面的操作系统提供一个根底保障, 下面的操作系统负责调度和治理硬件, 那咱们的中间件
装在操作系统下面, 咱们的应用软件跑在中间件下面, 前面你们要想拜访咱们的软件就得对它 (接入层) 进行管制吧.
在上图中, 很多公司会依据雇员的技能专长进行相干分工, 例如有运维工程师, 中间件平台开发工程师, 产品开发工程师, 产品开发工程师, 测试工程师等, 咱们很多高级的 java 程序员次要从事的是产品开发或者是应用软件
(例如可和关系管理系统, 分销零碎, 配送零碎, 领取零碎等) 开发, 而在应用软件开发时, 咱们个别也要进行分层设计, 例如典型的 MVC 分层设计, 咱们能够参考阿里巴巴开发手册中给出的分层设计模型,
其实咱们很多高级程序员刚开始做的是那一块? 应用软件是最简略的. 如果未来很多同学比方说我是计算机专业的, 或者说我自学了计算机这门迷信, 我理解操作系统, 我理解计算机的组成原理, 理解数据结构和算法, 晓得数电模电等等,
你会发现很多同学还能够写出这些 Tomcat 来, 中间件, 写平台. 未来技术倒退到肯定的层面, 就是写平台, 就相似于阿里的王监博士, 叫王监院士当初, 他当初做了一个云平台 (阿里云). 当初很多的企业的服务都运行在阿里云下面,
包含 12306 高峰期的时候都是租用阿里云的服务器. 个别应用软件层端采纳的分层指的是 MVC, 仅仅是软件的分层, 整体还有一个零碎分层. 软件分层能够参考阿里巴巴的开发手册:
终端显示层 (显示数据的, 就是 V)——–
申请解决层 (就是解决咱们申请的数据, 严格来讲这一块就是咱们 MVC 外面的 C 管制层)
上面就是 M 业务逻辑, 咱们写了一个业务逻辑 goodsService, 还写过 goodsDao———— 左边当初你不必思考这么多当初, 因为未来咱们的零碎是不是也要提供一个凋谢接口有可能 (咱们的软件当中要想显示一下天气预报信息,
咱们公须要发射一个卫星到天上去监测天气情况吗? )你的零碎当中显示的天气信息来自官网的气象数据, 官网的对外提供一个接口让咱们去调用啊? 所以你那个才会显示进去, 就相似于举个简略例子, 咱们交了个车,DD 软件上有一个地图 ,
那地图不是它研发的, 比方说是 qq 地图啊, 那它就是调用了 qq 地图的性能. 未来咱们的零碎可能要对外裸露一些接口, 让别的零碎能够拜访咱们的接口进儿来获取咱们零碎中的数据. 上面这个他人能够拜访咱们的零碎咱们是不是也能够拜访他人的零碎?
就相似于咱们零碎当中想融入地图功能那咱们是不是应该去调用百度地图的接口啊?
首先第一个显示的是费用, 你感觉它研发这个地图有什么用啊? 你的软件中要想调用他人的接口就得交钱啊! 你感觉我下载了一个百度地图没有问题啊, 本人用没事, 然而你要把这个地图嵌入到你们的软件中去那就得交接口使用费, 很多
公司做这个的, 做标准做接口, 其它的也是一样免费的.
IOC 是设计思维,MVC 同样也属于一种设计思维.MVC(Model-view-controller)是软件共工程当中的一种软件架构模式, 基于这样一种模式能够把软件系统分成三个根本局部: 一个是模型, 一个是视图, 还有一个是 controller, 它也是一种分层设计, 那么为什么也要分成
这三个局部呢, 也是各司其职, 各尽所能吧, 那视图用来做什么, 用来实现与用户的交互, 用来出现数据, 管制层呢? 那可能它要做的事件就是管制逻辑, 这个管制逻辑就是申请和响应管制逻辑的一个实现, 模型其实就是严格来讲是一个业务对象, 你能够把它了解成用来
解决业务逻辑和数据逻辑的一个对象, 咱们通过这样的设计让咱们的构造看起来会更加的简洁直观, 升高程序的复杂度, 具体呢它也说了它每一个对象有什么职责, 咱们在设计软件时通常要遵循这样的设计准则, 这外面提到了首先是基于繁多职责准则, 每个对象让它
各尽其职各尽所能, 而后基于高内聚低耦合实现对象之间的交互, 那么在 JavaEE 体系这种 MVC 的设计思维是这样的, 在 JavaEE 体系咱们讲的是, 传统的没有任何的框架的状况下咱们须要有这样的一个意识: 饿哦们的浏览器和咱们的手机端还有咱们的自行车段等等各种
端等等当初都能够向服务端发动申请, 这个服务端你能够看成是一个 WebServer 服务器 (Tomcat…), 那么申请过去的时候会通过一个对象, 这个叫过滤器对象, 对申请进行过滤, 举个例子在今日头条或者字节跳动这个公司它有零碎各位同学也能够看到叫 ” 灵犬零碎 ”,
可能很多人在做自媒体比方说在抖因上发个视屏, 或者在今日头条上发个文章, 如果这些视屏和文章都有咱们的人工去校验, 那今日头条得招多少人啊? 那他就须要做这样的一个零碎, 对戏你申请进行拦挡和过滤, 你这个图片是否蕴含一些敏感信息呢? 如果有可能就
间接就给 Pass 掉了, 就相似于我写这样的文章. 所有的零碎都会有这样的, 而咱们这个 MVC 设计的时候这外面这个过滤器吧 filter 它的作用是就是先对你的申请先做一个过滤, 过滤完了当前交给谁呢?JavaEE 体系外面学过 Servlet 技术, 交给 Servlet 去对你的申请进行
解决, 而 Servlet 最外围的作用就是申请逻辑和响应逻辑的一个管制, 你所有的数据达到咱们这个 Servlet 这当前,Servlet 外面就能够拿到申请中的数据, 基于你的申请去调用前面的对象来执行业务, 你未来调用哪一个业务, 你未来把这个业务执行完的后果用哪一个页
面进行出现, 都是 Servlet 说了算, 你说我的申请达到 Servlet 当前由谁来帮我执行这个业务呢?Servlet 在这里就起到控制器的作用. 这种技术就是 JSP+Servlet+JavaBean 就是晚期咱们用的技术 没框架的状况下纯 JavaEE 体系, 当初不是 JavaEE 外面生态做的越来越好么,
各种框架呈现了所以就有了咱们 MVC 这种设计框架.Spring MVC 属于 Spring 的 WEB 模块, 它在设计的时候采纳了 MVC 这种设计思维, 去简化程序员在 Servlet 这个对象当中, 申请和响应数据的解决. 就是有些数据在 Servlet 立面 request.getParameter()获取申请参数,request.setCharacterEncoding()
设置申请编码或者 request.forward 转发等等, 它把这些通用的共性的货色在框架外面做了封装而已, 次要是来简化这部分共性代码的编写.
SpringMVC 简化架构图:
右边还是咱们的客户端, 这部分过滤器一个是 JavaEE 标准当中定义了一个过滤器叫 Filter, 叫过滤器接口然而在不同的框架外面基于这个接口去写不同的实现类, 比如说 SpringMVC 外面提供的 CharacterEncodingFilter 对字符编码进行过滤, 进行解决这就是一个过滤器.
DispatcherServlet(front controller)它实质就是一个 Serclet, 它是实现了 Servlet 这个接口的; 如果 Spring 没有写或 JavaEE 当中废除了这接口, 那么 Spring 中这个接口就作废了, 因为这个类它是基于 JavaEE 标准第二阶段讲的 Servlet 来定义的. 它外部封装了申请和响应的
管制逻辑的实现, 如果是传统的 SpringMVC 的我的项目, 你还须要对这个类进行配置, 然而到了这个 SpringBoot 当中这个类的配置都不必去写了, 因为 Spring 谋求的指标是开箱即用, 它把很多共性的配置也帮你去解决了. 当咱们的申请过去当前,
达到 DispatcherServlet 当前, 那咱们晓得咱们申请中可能传一个 url, 谁来解决这个 url 呢? 那前面呢咱们可能有一个后端控制器叫 Handle(back controller)来解决你的申请. 咱们可能会有很多 url, 那么不同的 url 对应不同的 controller.womenqu1
就举个简略例子, 银行往往有一个大堂经理 DispatherServlet(from controller), 你想办什么业务? 你是对公的还是对私的? 办不同业务会有不同的营业人员来服务于你: 银行会有营业厅, 营业厅外面会有一些营业专员, 那些营业专员是不是会服务于你的这些申请?
那咱们怎么晓得呢? 比方说 DispatcherServlet 这个对象它 (HandleMapping) 就得晓得, 咱们哪些对象解决哪些申请得有吧, 所以在下面它就有一个表格, 表格外面就要注册着什么样的 url 有什么样的对象来解决, 也就是什么样的申请有什么养的对象来解决.
这个地位 (HandleMapping) 就有申请映射, 不同的申请来解决不同的映射. 国家最高的势力机构是国务院, 国务院下边是不是还得管着政法委书记呀? 那政法委书记还要管公安检察院还有法院. 比方说有一个刑警想去抓一个人得有检察院来批捕.
比方说政法委书记就会做这样的事件, 它有一个抓人申请, 抓人找刑警, 这外面要有一个审判的过程去找法院, 那它 (DispatcherServlet) 其实就是一个控制器. 生存当中有很多很多这个逻辑和程序中 1 是香香的, 所以这一块叫做注册核心,
一个班外面有技术班长, 还有行政班长, 你比方说有一个技术上的申请, 看看是谁找到这个同学 (HandleMapping)A(那这个地位其实就是一个注册核心, 或者了解成记录, 不同申请由不同对象来解决的一个对象) 就是负责技术上申请的班长; 你说你有一个行政上的, 那这块行政班长去做.
当咱们这个对象在解决之前, 比如找到了谁来解决这个 url(DispatcherServlet), 找到了应该是由这个对象 (Handle) 来解决 url, 在解决这个 url 之前后面有个拦截器, 这个也是一个非凡的过滤器也是一个非凡的拦截器, 这个拦截器是 SpringMVC 中设计的
它会做什么事件? 举个简略例子: 咱们在拜访 12306 的时候, 早上 06:00 之后能够订票, 早晨 23:00 之前能够订票, 然而不在这个工夫范畴之内定不了票, 这就是拦截器要做的事件, 你能够在这边记录咱们管制层办法的执行工夫, 你能够在这边去做咱们这个拜访拦挡都是它.
但当初呢呢们可能没有讲过这个拦截器, 在前面的内容中讲一讲, 那咱们这个后端把数据把这个申请解决完了当前要的返回一个响应, 这个响应给谁呢? 还是给这个 Servlet(DispatcherServlet), 你的厨师做完了美味佳肴, 把你这个饭给你做好了交给这个服务员, 那服务员
拿到这个当前该出现给哪一桌? 在这个时候是不是它应该对咱们这个响应后果进行解决啊, 那解决的时候有个 view(viewResover), 就要有个试图解析, 如果你这边响应一个 view, 它 (Handle) 会对 view 进行解析, 比方说加个前缀加个后缀. 学 MVC 的时候有个视图解析器.
然而我反悔了一个 goods.html(加了一个后缀, 再加一个前缀), 门路加上咱们这个后缀再加上你这个 view 就造成了咱们这个 view 的残缺门路, 最初把 view 相应到客户端.