核心思想:前端html页面通过ajax调用后真个restuful api接口并利用json数据进行交互。
在互联网架构中,
web做事器:一样平常指像nginx,apache这类的做事器,他们一样平常只能解析静态资源。
运用做事器:一样平常指像tomcat,jetty,resin这类的做事器可以解析动态资源也可以解析静态资源,但解析静态资源的能力没有web做事器好。
一样平常都是只有web做事器才能被外网访问,运用做事器只能内网访问。
以前的JavaWeb项目大多数都是java程序员又当爹又当妈,又搞前端(ajax/jquery/js/html/css等等),又搞后端(java/mysql/oracle等等)。
随着时期的发展,逐渐的许多大中小公司开始把前后真个界线分的越来越明确,前端工程师只管前真个事情,后端工程师只管后真个事情。正所谓术业有专攻。
对付后端java工程师:
把精力放在java根本,设计模式,jvm事理,spring+springmvc事理及源码,linux,mysql事务隔离与锁机制,mongodb,http/tcp,多线程,分布式架构(dubbo,dubbox,spring cloud),弹性打算架构,微做事架构(springboot+zookeeper+docker+jenkins),java性能优化,以及干系的项目管理等等。
后端追求的是:三高(高并发,高可用,高性能),安全,存储,业务等等。
对付前端工程师:
把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,webpack,less/sass,gulp,nodejs,Google V8引擎,javascript多线程,模块化,面向切面编程,设计模式,浏览器兼容性,性能优化等等。
前端追求的是:页面表现,速率流畅,兼容性,用户体验等等。
常日我们的JavaWeb项目都是利用了多少后台框架,springmvc/struts + spring + spring jdbc/hibernate/mybatis 等等。大多数项目在java后端都是分了三层,掌握层(controller/action),业务层(service/manage),持久层(dao)。掌握层卖力吸收参数,调用干系业务层,封装数据,以及路由&渲染到jsp页面。然后jsp页面上利用各种标签(jstl/el/struts标签等)或者手写java表达式(<%=%>)将后台的数据展现出来,玩的是MVC那套思路。紧接着系统发布,你须要用maven或者eclipse等工具把你的代码打成一个war包,然后把这个war包发布到你的生产环境下的web容器(tomcat/jboss/weblogic/websphere/jetty/resin)里,对吧?发布完了之后,你要启动你的web容器,开始供应做事,这时候你通过配置域名,dns等等干系,你的网站就可以访问了。这样一来,你的前后端代码全都在那个war包里了,包括你的js,css,图片,各种第三方的库。
在浏览器中输入你的网站域名(www.xxx.com),之后发生了什么?浏览器通过域名,再通过dns做事器找到你的做事器外网ip,将http要求发送到你的做事器,在tcp3次握手之后(http下面是tcp/ip),通过tcp协议开始传输数据,你的做事器得到要求后,开始供应做事,吸收参数,之后返回你的应答给浏览器,浏览器再通过content-type来解析你返回的内容,呈现给用户。
我们先假设你的首页中有100张图片,此时,用户的看似一次http要求,实在并不是一次,用户在第一次访问的时候,浏览器中不会有缓存,你的100张图片,浏览器要连着要求100次http要求(有人会跟我说http长连短连的问题,不在这里谈论),你的做事器吸收这些要求,都须要耗费内存去创建socket来玩tcp传输(花费你做事器上的打算资源)。这样的话,你的做事器的压力会非常大,由于页面中的所有要求都是只要求到你这台做事器上,如果1个人还好,如果10000个人并发访问呢(先不聊做事器集群,这里就说是单实例做事器),那你的做事器能扛住多少个tcp连接?你的带宽有多大?你的做事器的内存有多大?你的硬盘是高性能的吗?你能抗住多少IO?你给web做事器分的内存有多大?会不会宕机?
这便是为什么,越是大中型的web运用,他们越是要解耦。
理论上你可以把你的数据库+运用做事+行列步队+缓存+用户上传的文件+日志+等等都扔在一台做事器上,你也不用玩什么做事管理,也不用做什么性能监控,什么报警机制等等。但是这样把鸡蛋都放在一个篮子里,隐患非常大。如果由于一个子运用的内存不稳定导致全体做事器内存溢出而hung住,那你的全体网站就挂掉了。
JSP的痛点:
以前的javaWeb项目大多数利用jsp作为页面层展示数据给用户,由于流量不高,因此也没有那么苛刻的性能哀求,但现在是大数据时期,对付互联网项目的性能哀求是越来越高。
1.动态资源和静态资源全部耦合在一起,做事器压力大,由于做事器会收到各种http要求,例如css的http要求,js的,图片的等等。一旦做事器涌近况态,前后台一起玩完,用户体验极差。
2.UI出好设计图后,前端工程师只卖力将设计图切成html,须要由java工程师来将html套成jsp页面,出错率较高,修正问题时须要双方协同开拓,效率低下。
3.jsp必须要在支持java的web做事器里运行(例如tomcat,jetty,resin等),无法利用nginx等(nginx听说单实例http并发高达5w,这个上风要用上),性能提不上来。
4.第一次要求jsp,必须要在web做事器中编译成servlet,第一次运行会较慢。
5.每次要求jsp都是访问servlet再用输出流输出的html页面,效率没有直策应用html高。
6.jsp内有较多标签和表达式,前端工程师在修正页面时会碰着很多痛点。
7.如果jsp中的内允许多,页面相应会很慢,由于是同步加载。
8.须要前端工程师利用java的ide(例如eclipse),以及须要配置各种后真个开拓环境,你们有考虑过前端工程师的感想熏染吗。
基于上述的一些痛点,我们该当把全体项目实现前后端真正的解耦!
前后分离的上风:
1.可以实现真正的前后端解耦,前端做事器利用nginx。
前端/WEB做事器放的是css,js,图片等等一系列静态资源(乃至你还可以css,js,图片等资源放到特定的文件做事器,例如阿里云的oss,并利用cdn加速),前端做事器卖力掌握页面引用&跳转&路由,前端页面异步调用后真个接口,后端/运用做事器利用tomcat(把tomcat想象成一个数据供应者),加快整体相应速率。
(这里须要利用一些前端工程化的框架比如nodejs,react,router,react,redux,webpack)
2.创造bug,可以快速定位是谁的问题,不会涌现相互踢皮球的征象。
页面逻辑,跳转缺点,浏览器兼容性问题,脚本缺点,页面样式等问题,全部由前端工程师来卖力。
接口数据出错,数据没有提交成功,应答超时等问题,全部由后端工程师来办理。
双方互不滋扰,前端与后端是相亲相爱的一家人。
3.在大并发情形下,可以同时水平扩展前后端做事器,比如淘宝的一个首页就须要2000+台前端做事器做集群来抗住日均多少亿+的日均pv。
4.减少后端做事器的并发/负载压力
除了接口以外的其他所有http要求全部转移到前端nginx上,接口的要求调用tomcat,参考nginx反向代理tomcat。
且除了第一次页面要求外,浏览器会大量调用本地缓存。
5.纵然后端做事暂时超时或者宕机了,前端页面也会正常访问,只不过数据刷不出来而已。
6.大概你也须要有微信干系的轻运用,那样你的接口完备可以共用,如果也有app干系的做事,
那么只要通过一些代码重构,也可以大量复用接口,提升效率。(多端运用)
7.页面显示的东西再多也不怕,由于是异步加载。
8.nginx支持页面热支配,不用重启做事器,前端升级更无缝。
9.增加代码的掩护性&易读性(前后端耦在一起的代码读起来相称费劲)。
10.提升开拓效率,由于可以前后端并行开拓,而不是像以前的强依赖。
11.在nginx中支配证书,外网利用https访问,并且只开放443和80端口,其他端口一律关闭(防止黑客端口扫描),内网利用http,性能和安全都有保障。
12.前端大量的组件代码得以复用,组件化,提升开拓效率,抽出来!
总结一下新的办法的要求步骤:
大量并发浏览器要求--->web做事器集群(nginx)--->运用做事器集群(tomcat)--->文件/数据库/缓存/行列步队做事器集群
同时又可以玩分模块,还可以按业务拆成一个个的小集群,为后面的架构升级做准备。