微服务架构 前后端交互优化 下篇

微服务架构 前后端交互优化 下篇


针对上篇文章中提到 Web缓存优化、HTTP请求加速、多请求优化、页面渲染优化
本篇文章详细介绍

Web缓存优化

分析思考

  • 什么是Web缓存,以及它有哪些类型
  • 为何要使用Web缓存,它如何让请求更高效
  • 基本理念:重验证、更新
  • 工作机制、控制缓存和不缓存、主动/被动清除缓存

01

概述讲解

  • web缓存 指发起请求客户端到执行功能的Web服务器之间用来保存服务器输出的副本、并提供给发起请求的客户端,其类型包括(浏览器缓存、CDN、反向代理服务器缓存如Varnish后续文章详细阐述)
  • 使用Web缓存加快响应速度,提高用户满意度
  • 减少服务端处理压力,以同样资源来支撑更大的访问量和高并发
  • 通常存放缓存中的内容是有时效的,因此经常要对缓存中的内容做有效性检查,也称 “重验证”,更新目的为了保证缓存中内容和服务器中的内容保持一致
  • 工作机制主要通过Http头部增加:Last-Modified,If-Modified-Since,Expires,Cache-Control等标识,可同服务器进行商定,以保证浏览器是否缓存
  • 服务器端返回Http头部设置:Expires,Cache-Control:max-age,同时返回,max-age优先处理,如 response.setHeader(“Cache-Control”:“max-age=100”)

03 02
如图所示,浏览器自动缓存静态资源(css\js\img),缓存策略如Modified,If-Modified,并判断服务器文件是否改动,重验证
自动获取新的内容缓存
如js使用ajax获取后端数据,后端返回是可以设置header头部:如Last-Modified,那么客户端在下一次请求报文中会包含
“If-Modified-Since”,当服务端收到后,服务端会自动比较两个时间,若“Last-Modified” 更大,表明客户端缓存中内容已超时,
服务器会将最新的内容(新Header)返回客户端,状态为“200”,否则会认为客户端缓存中内容是最新的,返回客户端状态“304”
同时包含最新Header头部

参数讲解
response.setHeader(“Cache-Control”:“no-cache”),禁止缓存,浏览器可能会缓存,需要检查服务器一致
response.setHeader(“Cache-Control”:“no-store”),禁止缓存,浏览器删除缓存内容
response.setDateHeader(“Expires”:-1) 过期时间
response.setDateHeader(“max-age”:0),不缓存文档,每次访问缓存前检查

F5和Ctrl+F5刷新实现也有差异,F5让浏览器去执行一次一致性检查,而Ctrl+F5 删除本地缓存后再去执行一次一致性检查

静态资源更新如何主动通知浏览器缓存失效,解决思路

  • 页面上使用ESI来动态引入
  • 资源资源链接后加上“版本号”或者“?时间戳”,因为浏览器是按照url来缓存,更新后浏览器认为是新的地址,故重新加载一次
  • 主动请求PURGE,让Varnish里面缓存这些资源内容失效,这样Varnish会重新获取内容,并将新内容返回客户端
  • 客户端浏览器会发起新的请求,去重验证资源是否有更新,按照新的连接发出的,那么服务端没有连接对应的Etag,重新下载新的
    资源

Http请求加速

分析思考

  • http如何加速,为什么可以加速
  • http加速过程

概述讲解

通常会使用Varnish来让http加速,其原理是利用缓存来提高Web访问效率,见下图
01

外界流量F5/DNS/LVS请求流量进来后指定到Ngnix,部分动态内容和静态资源负载均衡反向代理到Varnish,其中配置VCL,指定相应需要缓存的地址,达到高效状态

在本地通过ab命令对比过以下场景

  • 直接访问tomcat地址,ab 1000个并发,160/TPS
  • 通过Nginx反向代理后,ab 1000个并发,170/TPS
  • 直接访问到Varnish,ab 1000个并发,2300/TPS
  • 通过Nginx反向代理到Varnish,ab 1000个并发,1300/TPS

由此可见 单使用Varnish效果最佳,如果小项目可以直接用Varnish代理,可达最佳效果,大型项目推荐使用Nginx+Varnish,因为Nginx负载均衡处理能力比Varnish高达10倍以上,Varnish优势在于让其Http加速

多请求优化

优化思路

连接请求并发送请求部分优化手段,内联在减少http请求数的同时,也会带来很多问题

  • 没有浏览器缓存

  • 没有边缘缓存 如CDN

  • 没有按需加载

  • 不能进行预加载

  • 非常小的文件,而且使用地方很少,应该使用内联,超过4K文件不要内联

  • 页面中图片(非CSS引用图片)尽量不要内联

  • 谨慎内联css图片 8合理使用异步方式加载内容 如:使用图片延迟加载技术减少http请求数和并发数,同时减少下载数据量

  • 对于AJAX请求单查询尽量使用GET方法,只需要一步,而POST请求要两步,但需要注意GET最大处理URL长度有限制

页面渲染优化

优化思路

  • 尽量加快资源获取
  • 尽量减少DOM节点
  • 尽量减少渲染过程的中断和等待
  • 尽量减少重绘
  • 尽量避免回流

常见问题思考

  • 脚本文件存放在页面顶部会引发问题,优化(存放底部)
    1.使用脚本时,对于位于脚本以下的内容,逐步呈现将被阻塞
    2.在下载脚本时会阻塞并行下载
    3.当脚本没有加载进来,用户触发了脚本事件,可能会出现JS错误问题

  • 样式文件存放在页面底部会引发问题,优化(存放顶部)
    1.白屏
    2.无样式内容闪烁

  • CSS尽量写在Head,不要出现在Body,否则会引起重新渲染

  • iframe会导致重绘,尽量减少使用数量

  • 避免不必要渲染,如 position:fixed 定位在滚动时候会不停渲染,hover特效,建议页面滚动时先取消效果,滚动停止后再加上hover效果。通过外层加类名进行控制,border:none而不是border:0,否则会渲染

总结

前后端交互优化包括 (前后端数据传输压缩,Web缓存优化、HTTP请求加速、多请求优化、页面渲染优化)等,可根据系统现状分别进行优化,从而提高视图渲染,提高用户体验

作者简介:张程 技术研究

更多文章请关注微信公众号:zachary分解狮 (frankly0423)

公众号

猜你喜欢

转载自blog.csdn.net/qaz7225277/article/details/89506662
今日推荐