脚本宝典收集整理的这篇文章主要介绍了页面静态化技术演进,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
文章主要包含四部分:
- 传统MVC开发:JSP和Thymeleaf的弊端
- 动静请求分离:异步请求
- 静态请求缓存效率化:CDN
- 动态请求缓存效率化:Nginx shared dic
- 全页面静态化技术:无头浏览器
原理:服务端渲染、模版变量替换。与 Spring Boot,MVC方言完美结合。
优势传统J2E使用JSP方式开发,但 Spring Boot对JSP支持不好。JSP规范与Servlet规范紧密耦合,使用JSP需要唤起servlet进程。
Thymeleaf支持HTML原型,可静态使用。
劣势
动静分离的设计原理:区分动静态请求。
动态请求:每次都从服务端获取数据请求。
静态请求:不必每次从服务端获取的页面展示请求。
优势
架构分离:分层优化
缓存策略分离:例如前端做nginx、浏览器、cdn等缓存。
研发框架分离:提高研发效率。
静态资源服务器,例如nignx;动态请求服务器,例如Tomcat;前后端采用Ajax等前端异步化交互技术发起请求,获取数据,填充静态页面。
Ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
Nginx可以用作动态请求反向代理,也可以用作静态请求使用html resources。
主要是CDN分发技术和Nginx proxy cache文件缓存。
CDN是内容分发网络,具有高性能、高可用、高扩展性的优点。
未使用CDN技术
使用CDN技术缓存静态资源。
客户端发起请求到DNS,查询ip地址,根据CNAME返回CDN管控节点域名,实现DNS解析权移交。管控节点根据请求ip地址分发到最近的CDN节点(负载均衡与分发)。如果在CDN节点命中缓存,直接返回,否则请求静态资源并备份。
运营厂商CDN实现原理中,HTTP 缓存头起到了重要作用。
Http缓存头 cache-ctrol
private:客户端可以缓存.
public:客户端和代理服务器都可以缓存。
max-age=xxx:缓存的内容将在XXX秒后失效。
no- cache:强制向服务端再验证一次,判断是否生效。
no-store:不缓存请求的任何返回内容。
有效性判断(验证时带上如下参数)
ETag:资源唯一标识
If-None-Match:客户端发送的匹配Etag标识符
Last- modified:资源最后被修改的时间
If- Modified- Since:客户端发送的匹配资源最后修改时间的标识符
前置缓存的使用,提高查询速度,减少数据库访问量。
包括主动失效、被动失效,需要解决缓存击穿、降级等问题。
在nginx生命周期中,Lua通过协程机制在某些环节实现钩子机制。例如master进程创建worker进程时,运行初始化脚本;检测到某个url请求时,直接调用Redis返回response,从而省掉springboot webmvc流程。
Nginx proxy cache使用较少,因为再快的文件读写速度也比不上内存的读写速度。
原理:nginx服务器的内存缓存,所有worker进程共享,通过lua操作。
lua脚本获取缓存空间,从中获取list缓存。如果为空则转发请求,获取响应数据并缓存。
原理:服务端通过类似爬虫的技术直接完成动态请求加载完成后的静态页面,将HTML、CSS、JS资源全部加载完后的页面生成后部署到CDN上。
我们访问页面,发起静态请求从CDN中获取html资源文件,发起动态请求访问nginx、tomcat获取响应数据,然后在客户端渲染页面。需要三步操作。
如果将渲染好的页面直接放到CDN上,则客户端可以直接获取。
优势:无需加载、无需动态请求、可全部CDN化
实现:
类似爬虫的技术
无头浏览器:类似浏览器,加载HTML文件,运行JavaScript,执行Ajax请求,获取数据,填充到DOM,输出静态资源文件。
Httpclient无法搞定动态请求,HtmlUnit可用于爬虫,测试自动化工具等
HtmlUnit是一个无界面浏览器Java程序。为HTML文档建模,提供了调用页面、填写表单、单击链接等操作的APl。提供了对 Javascript的支持,甚至可以使用相当复杂的Ajax库,根据配置的不同模拟 Chrome、 Firefox等浏览器。
上图.test.html书写错误
以上是脚本宝典为你收集整理的页面静态化技术演进全部内容,希望文章能够帮你解决页面静态化技术演进所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。