这就是为什么,越是大中型的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展现一些动态的代码
- 浏览器发送请求
- 直接到达html页面(前端控制路由与渲染页面,整个项目开发的权重前移)
- html页面负责调用服务端接口产生数据(通过ajax等等,后台返回json格式数据,json数据格式因为简洁高效而取代xml)
推荐阅读
- 经常跳街舞可以减肥吗
- 经常跳街舞能瘦身吗
- 雀斑是怎样形成的,你经常照射紫外线吗
- 解密初、中、高级程序员的进化之路
- 晚上经常睡不着觉啊,听说中岳仙茶安神助眠特效,...
- 胃返酸水是怎么回事?
- 穿衣搭配|我,女程序员,月薪三万,36岁单身,很失败吗?
- 老年人经常腿发麻是怎么回事?
- 茶不宜用纸杯泡
- 经常梦见死去的前夫是怎么回事 梦见前夫去世了好不好