核心思想是前端HTML页面通过AJAX调用后真个RESTFUL API接口并利用JSON数据进行交互。
Web做事器:一样平常指像Nginx,Apache这类的做事器,他们一样平常只能解析静态资源;运用做事器:一样平常指像Tomcat,Jetty,Resin这类的做事器可以解析动态资源也可以解析静态资源,但解析静态资源的能力没有web做事器好;一样平常都是只有web做事器才能被外网访问,运用做事器只能内网访问。
以前的Java Web项目大多数都是Java程序员又当爹又当妈,又搞前端,又搞后端。随着时期的发展,逐渐的许多大中小公司开始把前后真个界线分的越来越明确,前端工程师只管前真个事情,后端工程师只管后真个事情。正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精。大中型公司须要专业人才,小公司须要全才,但是对付个人职业发展来说,前后端须要分离。

早期紧张利用MVC框架,Jsp+Servlet的构造图如下:
大致便是所有的要求都被发送给作为掌握器的Servlet,它接管要求,并根据要求信息将它们分发给适当的JSP来相应。同时,Servlet还根据JSP的需求天生JavaBeans的实例并输出给JSP环境。JSP可以通过直接调用方法或利用UseBean的自定义标签得到JavaBeans中的数据。
须要解释的是,这个View还可以采取 Velocity、Freemaker 等模板引擎。利用了这些模板引擎,可以使得开拓过程中的职员分工更加明确,还能提高开拓效率。
那么,在这个期间,开拓办法有如下两种:
办法一
办法二
办法二已经逐渐淘汰。紧张缘故原由有两点:
前端在开拓过程中严重依赖后端,在后端没有完成的情形下,前端根本无法干活;由于趋势问题,会JSP,懂velocity,freemarker等模板引擎的前端越来越少;因此,办法二逐渐不被采取。然而,不得不说一点,办法一,实在很多小型传统软件公司至今还在利用。那么,办法一和办法二具有哪些共同的缺陷呢?
1、前端无法单独调试,开拓效率低;
2、前端不可避免会碰着后台代码,例如:
<body> <% request.setCharacterEncoding("utf-8") String name=request.getParameter("username"); out.print(name); %></body>
这种办法耦合性太强。那么,就算你用了freemarker等模板引擎,不能写Java代码。那前端也不可避免的要去重新学习该模板引擎的模板语法,无谓增加了前真个学习本钱。正如我们后端开拓不想写前端一样,你想想如果你的后台代码里嵌入前端代码,你是什么感想熏染?因此,这种办法十分欠妥。
3、JSP本身所导致的一些其他问题 比如,JSP第一次运行的时候比较缓慢,由于里头包含一个将JSP翻译为Servlet的步骤。再比如由于同步加载的缘故原由,在JSP中有很多内容的情形下,页面相应会很慢。
3、半分离时期前后端半分离,前端卖力开拓页面,通过接口(Ajax)获取数据,采取Dom操为难刁难页面进行数据绑定,终极是由前端把页面渲染出来。这也便是Ajax与SPA运用(单页运用)结合的办法,其构造图如下:
步骤如下:
浏览器要求,CDN返回HTML页面;HTML中的JS代码以Ajax办法要求后台的Restful接口;接口返回Json数据,页面解析Json数据,通过Dom操作渲染页面;后端供应的都因此JSON为数据格式的API接口供Native端利用,同样供应给WEB的也是JSON格式的API接口。
那么意味着WEB事情流程是:
打开web,加载基本资源,如CSS,JS等;发起一个Ajax要求再到做事端要求数据,同时展示loading;得到json格式的数据后再根据逻辑选择模板渲染出DOM字符串;将DOM字符串插入页面中web view渲染出DOM构造;这些步骤都由用户所利用的设备中逐步实行,也便是说用户的设备性能与APP的运行速率联系的更紧换句话说便是如果用户的设备很低端,那么APP打开页面的速率会越慢。
为什么说是半分离的?由于不是所有页面都是单页面运用,在多页面运用的情形下,前端由于没有节制controller层,前端须要跟后端谈论,我们这个页面是要同步输出呢,还是异步Json渲染呢?而且,纵然在这一期间,常日也是一个工程师搞定前后端所有事情。因此,在这一阶段,只能算半分离。
首先,这种办法的优点是很明显的。前端不会嵌入任何后台代码,前端专注于HTML、CSS、JS的开拓,不依赖于后端。自己还能够仿照Json数据来渲染页面。创造Bug,也能迅速定位出是谁的问题。
然而,在这种架构下,还是存在明显的弊端的。最明显的有如下几点:
JS存在大量冗余,在业务繁芜的情形下,页面的渲染部分的代码,非常繁芜;在Json返回的数据量比较大的情形下,渲染的十分缓慢,会涌现页面卡顿的情形;SEO( Search Engine Optimization,即搜索引擎优化)非常未便利,由于搜索引擎的爬虫无法爬下JS异步渲染的数据,导致这样的页面,SEO会存在一定的问题;资源花费严重,在业务繁芜的情形下,一个页面可能要发起多次HTTP要求才能将页面渲染完毕。可能有人不服,以为PC端建立多次HTTP要求也没啥。那你考虑过移动端么,知道移动端建立一次HTTP要求须要花费多少资源么?正是由于如上缺陷,我们才亟需真正的前后端分离架构。
4、分离时期在前后端彻底分离这一期间,前真个范围被扩展,controller层也被认为属于前真个一部分。在这一期间:
前端:卖力View和Controller层。后端:只卖力Model层,业务/数据处理等。可是做事端职员对前端HTML构造不熟习,前端也不懂后台代码呀,controller层如何实现呢?这便是node.js的妙用了,node.js适宜利用在高并发、I/O密集、少量业务逻辑的场景。最主要的一点是,前端不用再学一门其他的措辞了,对前端来说,上手度大大提高。
可以就把Nodejs当成跟前端交互的api。总得来说,Nodejs的浸染在mvc中相称于C(掌握器)。Nodejs路由的实现逻辑是把前端静态页面代码当成字符串发送到客户端(例如浏览器),大略理解可以理解为路由是供应给客户真个一组api接口,只不过返回的数据是页面代码的字符串而已。
用NodeJs来作为桥梁架接手事器端API输出的JSON。后端出于性能和别的缘故原由,供应的接口所返回的数据格式大概不太适宜前端直策应用,前端所需的排序功能、筛选功能,以及到了视图层的页面展现,大概都须要对接口所供应的数据进行二次处理。这些处理虽可以放在前端来进行,但大概数据量一大便会摧残浪费蹂躏浏览器性能。因而现今,增加Node中间层便是一种良好的办理方案。
浏览器(webview)不再直接要求JSP的API,而是:
浏览器要求做事器真个NodeJS;NodeJS再发起HTTP去要求JSP;JSP依然原样API输出JSON给NodeJS;NodeJS收到JSON后再渲染出HTML页面;NodeJS直接将HTML页面flush到浏览器;这样,浏览器得到的便是普通的HTML页面,而不用再发Ajax去要求做事器了。
淘宝的前端团队提出的中途岛(Midway Framework)的架构如下图所示:
增加node.js作为中间层,详细有哪些好处呢?
1、适配性提升;我们其实在开拓过程中,常常会给PC端、mobile、app端各自研发一套前端。实在对付这三端来说,大部分端业务逻辑是一样的。唯一差异便是交互展现逻辑不同。
如果controller层在后端手里,后端为了这些不同端页面展示逻辑,自己掩护这些controller,模版无法重用,徒增和前端沟通端本钱。如果增加了node.js层,此时架构图如下:
在该构造下,每种前真个界面展示逻辑由node层自己掩护。如果产品经理中途想要改动界面什么的,可以由前端自己专职掩护,后端无需操心。前后端各司其职,后端专注自己的业务逻辑开拓,前端专注产品效果开拓。
2、相应速率提升;我们有时候,会碰着后端返回给前真个数据太大略了,前端须要对这些数据进行逻辑运算。那么在数据量比较小的时候,对其做运算分组等操作,并无影响。但是当数据量大的时候,会有明显的卡顿效果。这时候,node中间层实在可以将很多这样的代码放入node层处理、也可以替后端分担一些大略的逻辑、又可以用模板引擎自己节制前台的输出。这样做灵巧度、相应度都大大提升。
3、性能得到提升;大家该当都知道单一职责原则。从该角度来看,我们,要求一个页面,可能要相应很多个后端接口,要求变多了,自然速率就变慢了,这种征象在mobile端更加严重。采取node作为中间层,将页面所须要的多个后端数据,直接在内网阶段就拼装好,再统一返回给前端,会得到更好的性能。
4、异步与模板统一;淘宝首页便是被几十个HTML片段(每个片段一个文件)拼装成,之前PHP同步include这几十个片段,一定是串行的,Node可以异步,读文件可以并行,一旦这些片段中也包含业务逻辑,异步的上风就很明显了,真正做到哪个文件先渲染完就先输出显示。
前端机的文件系统越繁芜,页面的组成片段越多,这种异步的提速效果就越明显。前后端模板统一在无线领域很有用,PC页面和WIFI场景下的页面适宜前端渲染(后端数据Ajax到前端),2G、3G弱网络环境适宜后端渲染(数据随页面吐给前端),以是同样的模板,在不同的条件下走不同的渲染渠道,模板只需一次开拓。
增加NodeJS中间层后的前后端职责划分:
5、总结
从经典的JSP+Servlet+JavaBean的MVC时期,到SSM(Spring + SpringMVC + Mybatis)和SSH(Spring + Struts + Hibernate)的Java 框架时期,再到前端框架(KnockoutJS、AngularJS、vueJS、ReactJS)为主的MV时期,然后是Nodejs引领的全栈时期,技能和架构一贯都在进步。虽然“基于NodeJS的全栈式开拓”模式很让人愉快,但是把基于Node的全栈开拓变成一个稳定,让大家都能接管的东西还有很多路要走。
创新之路不会止步,无论是前后端分离模式还是其他模式,都是为了更方便得办理需求,但它们都只是一个“中转站”。前端项目与后端项目是两个项目,放在两个不同的做事器,须要独立支配,两个不同的工程,两个不同的代码库,不同的开拓职员。前端只须要关注页面的样式与动态数据的解析及渲染,而后端专注于详细业务逻辑。(来源:互联网架构师 )