前言
本篇文章主要总结项目中常见的架构,从前后端的各种耦合到前后端的分离为主线,其他技术作为副线详细总结
未分离时代(各种耦合)
早期主要使用的是 MVC 架构
大致就是所有的请求都被发送给作为控制器的Servlet,它接受请求,并根据请求信息将它们分发给适当的JSP来响应
大致开发流程,值得一提的是,现在仍然有一些小公司在用这套开发流程
MVC 主要缺点
- 前端无法单独测试
- 前端不可避免会遇到后台代码,增加前端开发人员的成本
- JSP第一次运行的时候比较缓慢,因为里头包含一个将JSP翻译为Servlet的步骤
半分离时代
前后端半分离,前端负责开发页面,通过接口(Ajax)获取数据,采用Dom操作对页面进行数据绑定,最终是由前端把页面渲染出来。这也就是Ajax与SPA应用(单页应用)结合的方式,其结构图如下
请求步骤如下
- 浏览器请求,CDN 返回 HTML 页面
- HTML 中的 JS 代码以 ajax 方式,请求后台的 Restuful 接口
- 接口返回 json 数据,页面解析 json 数据,通过 dom 操作渲染页面
为什么说是半分离?
在多页面的情况下,前端没有掌握 colltroller 层,前端需要和后端达成一致,这个页面是同步输出还是异步 json 渲染
这种半分离模式的优点对于 MVC 主要体现在前端不会嵌入任何的后端代码,前端就是专注于 HTML ,css ,js 的开发, 而且还能够自己模拟 json 数据来渲染页面,发现bug 也可以迅速定位出问题来
分离时代
在前后端彻底分离这一时期,前端的范围被扩展,controller层也被认为属于前端的一部分。在这一时期:
- 前端:负责View和Controller层。
- 后端:只负责Model层,业务/数据处理等。
可是服务端人员对前端HTML结构不熟悉,前端也不懂后台代码呀,controller层如何实现呢?这就是node.js的妙用了,node.js适合运用在高并发、I/O密集、少量业务逻辑的场景
可以就把Nodejs当成跟前端交互的api。总得来说,NodeJs的作用在MVC中相当于C(控制器)。Nodejs路由的实现逻辑是把前端静态页面代码当成字符串发送到客户端(例如浏览器),简单理解可以理解为路由是提供给客户端的一组api接口,只不过返回的数据是页面代码的字符串而已。
用 Node.js 来作为桥梁架接服务器端API输出的JSON, 后端处于性能的原因,提供的接口所返回的数据格式也许不太适合前端直接使用,前端所需的排序功能、筛选功能,以及到了视图层的页面展现,也许都需要对接口所提供的数据进行二次处理。这些处理虽可以放在前端来进行,但也许数据量一大便会浪费浏览器性能。因而现今,增加Node中间层便是一种良好的解决方案。
数据流动步骤
- 浏览器请求服务器端的 NodeJS
- NodeJS 再次发起HTTP 请求 jsp
- JSP 依然原样 api 输出 json 给 NodeJS
- NodeJS 收到 json 后再渲染出 HTML 页面
- NodeJS 直接将 HTML 页面 flush 到浏览器
这样浏览器得到的就是 HTML 页面了,而不用再发 ajax 去请求服务器了
增加 Node.js 作为中间层,具体有哪些好处呢?
(1) 适配性提示
我们其实在开发过程中,经常会给PC端、mobile、app端各自研发一套前端。其实对于这三端来说, 大部分端业务逻辑是一样的,唯一的区别就是交互展现逻辑不同,如果controller层在后端手里,后端为了这些不同端页面展示逻辑,自己维护这些controller,模版无法重用,徒增和前端沟通成本。 如果增加了node.js层,此时架构图如下:
在该结构下,每种前端的界面展示逻辑由 node 层自己维护,如果产品经理中途想要改动界面什么的,可以由前端自己专职维护,后端无需操心。前后端各司其职,后端专注自己的业务逻辑开发,前端专注产品效果开发。
(2) 响应速度提升
如果后端给前端响应的数据太过简单,速度其实没有什么大影响,但是当数据量太大的情况下,再加上对数据做分组逻辑运算会有明显的卡顿效果。而中间 node 层其实可以把很多的代码放入 node 层做处理,可以替后端分担一些简单的逻辑,又可以用模板引擎自己掌握前台的输出,使得灵活性和响应速度得到提升
举个例子,即使做了页面静态化之后,前端依然还是有不少需要实时从后端获取的信息,这些信息都在不同的业务系统中,所以需要前端发送5、6个异步请求来。有了NodeJs之后,前端可以在NodeJs中去代理这5个异步请求。还能很容易的做bigpipe,这块的优化能让整个渲染效率提升很多。在PC上你觉得发5、6个异步请求也没什么,但是在无线端,在客户手机上建立一个http请求开销很大。有了这个优化,性能一下提升好几倍。
(3)性能得到提升
大家应该都知道单一职责原则。从该角度来看,我们请求一个页面可能要响应很多个后端接口,请求变多自然速度就变慢了,这种现象在mobile端更加严重。采用node作为中间层,将页面所需要的多个后端数据,直接在内网阶段就拼装好,再统一返回给前端,会得到更好的性能。
(4)异步与模板统一
淘宝首页就是被几十个HTML片段(每个片段一个文件)拼装成,之前PHP同步include这几十个片段,一定是串行的,Node可以异步,读文件可以并行,一旦这些片段中也包含业务逻辑,异步的优势就很明显了,真正做到哪个文件先渲染完就先输出显示。前端机的文件系统越复杂,页面的组成片段越多,这种异步的提速效果就越明显。前后端模板统一在无线领域很有用,PC页面和WIFI场景下的页面适合前端渲染(后端数据Ajax到前端),2G、3G弱网络环境适合后端渲染(数据随页面吐给前端),所以同样的模板,在不同的条件下走不同的渲染渠道,模板只需一次开发。
增加 Node 层后的职业划分
转载:https://blog.csdn.net/qq_43763344/article/details/116799175