前后端分离架构

1、背景前后端分离已成为互联网项目开发的业界标准使用方式,通过Nginx+Tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多端化服务(多种客户端,例如:浏览器,车载终端,Android/ target=_blank class=infotextkey>安卓,IOS等等)打下坚实的基础 。这个步骤是系统架构从猿进化成人的必经之路 。
核心思想是前端html页面通过AJAX调用后端的RESTFUL API接口并使用JSON数据进行交互 。

  • Web服务器:一般指像Nginx,Apache这类的服务器,他们一般只能解析静态资源;
  • 应用服务器:一般指像Tomcat,Jetty,Resin这类的服务器可以解析动态资源也可以解析静态资源,但解析静态资源的能力没有web服务器好;
一般都是只有web服务器才能被外网访问,应用服务器只能内网访问 。
以前的JAVA Web项目大多数都是Java程序员又当爹又当妈,又搞前端,又搞后端 。随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只管前端的事情,后端工程师只管后端的事情 。正所谓术业有专攻,一个人如果什么都会,那么他毕竟什么都不精 。大中型公司需要专业人才,小公司需要全才,但是对于个人职业发展来说,前后端需要分离 。
2、未分离时代(各种耦合)早期主要使用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工作流程是: