关于freemarker:记录MVC项目部署时的CDN缓存问题

34次阅读

共计 1214 个字符,预计需要花费 4 分钟才能阅读完成。

概述

本文将剖析在公布前后端未分离我的项目(freemaker)时遇到的 CDN 缓存问题,次要有以下两个问题:

  • 页面申请获取的 html 外面却是旧版本号的 script 链接
  • script脚本链接是新版本号但拉取到的却是旧脚本代码

问题剖析

1、页面申请获取的 html 外面却是旧版本号的 script 链接

问题剖析前首先咱们要晓得以下知识点:

(1)freemaker我的项目的页面是后端服务将 ftl 解决成 html 返回的

(2)部署时会遍历 ftl 文件,对所有的 script 链接打上版本号

// 构建前 supplierQuoteDetailPaging.ftl

<!DOCTYPE html>
    <head>
        <script type="text/javascript" src="${Global.getConfig("web.app.static.url")}/js/supplierQuoteDetail.js"></script>
    </head>
</html>


// 在 `Jenkins` 构建后会对申请动态脚本的 `url` 加上版本号 supplierQuoteDetailPaging.ftl

<!DOCTYPE html>
    <head>
        <script type="text/javascript" src="${Global.getConfig("web.app.static.url")}/js/supplierQuoteDetail.js?version=1638706227856"></script>
    </head>
</html>

(3)后端是集群服务,部署采纳滚动公布,也就是说部署时节点服务是一批一批来更新的,直到集群中所有的实例都更新成新版本,而不是一次性全量更新

当我的项目还是部署时,因为服务采纳滚动公布,因而在这个期间新服务和旧服务会同时存在。如果在这个阶段拜访页面,页面接口可能命中旧服务,也可能命中新服务,当命中旧服务时,申请失去的 html 外面 script 链接打上的是旧版本号;当部署实现时,群中所有的实例都更新成新版本,页面申请命中新服务,申请失去的 html 外面 script 链接打上的是新版本号。

解决方案:待我的项目部署实现后刷新页面就能够了

2、script脚本链接是新版本号但拉取到的却是旧脚本代码

失常来说,部署我的项目后,浏览器依据新版本号去申请 CDN 上的动态脚本文件,如果 CDN 缓存中没有对应新版本号对应的脚本文件,则会向后端服务拉取新脚本,而后 CDN 在做一次缓存,前面的脚本申请间接由 CDN 返回。

然而,如果部署还未实现浏览器就去拜访了,此时这个阶段新服务和旧服务是同时存在的,当新版本号对应的脚本在 CDN 上找不到时,就会去服务申请,恰好申请命中的是旧服务(服务响应跟版本号无关),旧服务返回旧的脚本,而后 CDN 缓存新版号对应的旧脚本,这样后续每次申请拉取到的都是 CDN 上缓存的就脚本,因而就呈现了上述问题。

解决方案:重新部署一遍,待部署实现后再去拜访页面

正文完
 0