程序员经常谈论的前后端分离,前后端解耦( 三 )


这就是为什么,越是大中型的web应用,他们越是要解耦 。
理论上你可以把你的数据库+应用服务+消息队列+缓存+用户上传的文件+日志+等等都扔在一台服务器上,你也不用玩什么服务治理,也不用做什么性能监控,什么报警机制等等,就乱成一锅粥好了 。
但是这样就好像是你把鸡蛋都放在一个篮子里,隐患非常大 。如果因为一个子应用的内存不稳定导致整个服务器内存溢出而hung住,那你的整个网站就挂掉了 。
如果出意外挂掉,而恰好这时你们的业务又处于井喷式发展高峰期,那么恭喜你,业务成功被技术卡住,很可能会流失大量用户,后果不堪设想 。
注意:技术一定是要走在业务前面的,否则你将错过最佳的发展期 。
此外,你的应用全部都耦合在一起,相当于一个巨石,当服务端负载能力不足时,一般会使用负载均衡的方式,将服务器做成集群,这样其实你是在水平扩展一块块巨石,性能加速度会越来越低,要知道,本身负载就低的功能or模块是没有必要水平扩展的,在本文中的例子就是你的性能瓶颈不在前端,那干嘛要水平扩展前端呢???
还有发版部署上线的时候,我明明只改了后端的代码,为什么要前端也跟着发布呢???(引用:《架构探险-轻量级微服务架构》,黄勇)
正常的互联网架构,是都要拆开的,你的web服务器集群,你的应用服务器集群+文件服务器集群+数据库服务器集群+消息队列集群+缓存集群等等 。
JSP的痛点
以前的javaWeb项目大多数使用jsp作为页面层展示数据给用户,因为流量不高,因此也没有那么苛刻的性能要求,但现在是大数据时代,对于互联网项目的性能要求是越来越高,因此原始的前后端耦合在一起的架构模式已经逐渐不能满足我们,因此我们需要需找一种解耦的方式,来大幅度提升我们的负载能力 。
1、动态资源和静态资源全部耦合在一起,服务器压力大,因为服务器会收到各种http请求,例如css的http请求,js的,图片的等等 。
一旦服务器出现状况,前后台一起玩完,用户体验极差 。
2、UI出好设计图后,前端工程师只负责将设计图切成html,需要由java工程师来将html套成jsp页面,出错率较高(因为页面中经常会出现大量的js代码),
修改问题时需要双方协同开发,效率低下 。
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),以及需要配置各种后端的开发环境,你们有考虑过前端工程师的感受吗 。
基于上述的一些痛点,我们应该把整个项目的开发权重往前移,实现前后端真正的解耦!
开发模式
以前老的方式是:

  • 产品经历/领导/客户提出需求
  • UI做出设计图
  • 前端工程师做html页面
  • 后端工程师将html页面套成jsp页面(前后端强依赖,后端必须要等前端的html做好才能套jsp 。如果html发生变更,就更痛了,开发效率低)
  • 集成出现问题
  • 前端返工
  • 后端返工
二次集成
集成成功
交付
新的方式是:
  • 产品经历/领导/客户提出需求
  • UI做出设计图
  • 前后端约定接口&数据&参数
  • 前后端并行开发(无强依赖,可前后端并行开发,如果需求变更,只要接口&参数不变,就不用两边都修改代码,开发效率高)
  • 前后端集成
  • 前端页面调整
  • 集成成功
  • 交付
请求方式
以前老的方式是:
  • 客户端请求
  • 服务端的servlet或controller接收请求(后端控制路由与渲染页面,整个项目开发的权重大部分在后端)
  • 调用service,dao代码完成业务逻辑
  • 返回jsp
  • jsp展现一些动态的代码
新的方式是: