持续集成与部署(五):发布策略

简介: 持续集成与部署(五):发布策略

1. 前端发布策略

前端发布的本质,其实是静态资源的发布,一般是 jscss,而不包括动态渲染出来的html模版。

野生状态下的前端资源

  1. 有一个HTML
  2. HTML中引入一个CSS
  3. CSS和HTML模版都有服务器反向代理

这时候他们的网络时序图会如下图所示,htmlcss会依此加载:

image.png

这种情况下我们可能会想到一些优化手段。

比如说能否用HTTP的缓存提高资源的加载速度呢?

我们知道HTTP的缓存有两种

  1. 协商缓存

    使用协商缓存的话,浏览器去请求资源,服务器会告诉浏览器这个资源已经多久没有改变过了,浏览器发现这个时间内自己请求过这个资源,于是就把缓存的资源拿出来直接使用。

![image.png](https://yejiwei.com/static/img/455d457aecb19c383816b03f6ed65d46.image.png)

这种方式省去了重新下载整个资源的时间,但是仍然需要一次协商缓存的过程。
  1. 本地缓存

    另一种是本地缓存,在这种方式下,浏览器在发起请求之前,会对比请求的url,如果发现和之前一致的话,就从硬盘或是内存中,找到对应的缓存,直接使用。

    image.png

显然本地缓存对加载速度更好,但是本地缓存带来了新的问题,如果资源更新了怎么办?用户一直使用老的缓存,即使发布了新的版本,用户不是也用不上吗?

有人想到了一个办法,既然本地缓存更请求的url有关,那么我们在请求资源的后面多加个版本的参数不就好了么,每次更新资源的时候也同步的更新参数。比如说:所有的资源都加上一个v.x.x.x的版本号,在下次更新的时候修改版本号,让用户的缓存失效。

image.png

但是在实际情况中,我们还发现了新的问题,对于一个大型网站来说,静态资源可能非常非常多,每天都会有新的前端代码被修改,如果其中每一个资源被修改了,我们就全量修改所有的版本号的话。那缓存的意义也就不大了。

image.png

针对这个问题,我们可以用hash来解决。

hash是一串字符串,它像是文件的一种特质,只和文件的内容有关,如果一个文件的内容变了,那么它的hash值也会变化。

利用hash的特性,我们可以把上一步的版本号改为hash值,这样的话只有被我们改动过的静态资源的缓存才会失效。

image.png

看起来这是一种比较完美的解决方案。

不过,对于大公司来说,为了进一步提升网站性能,一般都会把静态资源和动态网页分集群部署,静态资源会被部署到CDN节点上,网页中引用的资源也会变成对应的部署路径:

image.png

好了,当我要更新静态资源的时候,同时也会更新html中的引用吧,就好像这样:

image.png

页面和静态资源不在同一个机器上,我们就要面临一个问题,他们两者的部署,就必然会有一个时间差,那么是先上线页面呢,还是先上线静态资源呢?

  1. 先部署页面,再部署资源:在二者部署的时间间隔内,如果有用户访问页面,就会在新的页面结构中加载旧的资源,并且把这个旧版本的资源当做新版本缓存起来,其结果就是:用户访问到了一个样式错乱的页面,除非手动刷新,否则在资源缓存过期之前,页面会一直执行错误。
  2. 先部署资源,再部署页面:在部署时间间隔之内,有旧版本资源本地缓存的用户访问网站,由于请求的页面是旧版本的,资源引用没有改变,浏览器将直接使用本地缓存,这种情况下页面展现正常;但没有本地缓存或者缓存过期的用户访问网站,就会出现旧版本页面加载新版本资源的情况,导致页面执行错误,但当页面完成部署,这部分用户再次访问页面又会恢复正常了。

好想都不太好...

最终方案:非覆盖式发布

image.png

之前的方案之所以有问题,是因为在CDN上同名的文件只能有一份,它要么是老的要么是新的,不能同时存在,这种方式叫做覆盖式发布。非覆盖式发布就是指我们不通过url参数带hash的方法解决缓存问题,而是直接将hash写入到静态资源的文件名中,这样的话不同版本的同一资源,文件名也不会重复,我们在发布时,将新的资源推送到CDN之后并不会覆盖老的资源,它们两者在CDN上同时存在,这个时候访问新页面的用户加载新的资源,访问老的页面的用户加载老的资源,各不冲突,这样就可以完美的解决资源更新的问题了。

2. 后端发布策略

后端发布的本质是后端服务再多台服务器上的分发。

对于大公司,往往不可能用单机承载所有的流量,而是有一个服务器集群,分摊高并发服务的成本,也挺高了服务的可用性。

后端发布关心的问题

  1. 如何减少用户感知上的新旧版本不一致
  2. 如何让发布过程中的服务尽可能的稳定
  3. 如何保证发布的结果最终一致性

下面介绍后端的集中部署方式

  • 滚动部署

    滚动更新的发布过程,是让应用的新版本逐步替换旧版本。在此期间,新旧版本会共存。

    下图显示了该更新策略:旧版本显示为蓝色,新版本显示为绿色,它们部署在集群中的每一台服务器上。
    三台服务器一开始都是老版本,然后在state 1, state 2阶段开始逐渐替换到新版本,最终完全替换成功,这个过程服务不会中断,一个请求可能会落在老版本中,也可能会落在新版本中。

    image.png

    这种部署方式的特点:

    • 节约资源(不需要额外服务器资源)
    • 流量冲击小(应用逐步的被替换,过程是渐进式的,每台服务器承受的压力理论上是相同的)
    • 回滚不及时
    • 存在中间状态,可能会导致不一致
  • 蓝绿部署

    不停止老版本,部署新版本并进行测试,确认OK后,将流量切到新版本。

    image.png

    这种部署方式的特点:

    • 风险小,新的版本有问题不会影响线上
    • 便于快速回滚
    • 切换流量要妥善处理未完成请求
    • 整体切换流量冲击较大
  • 灰度发布/金丝雀发布

    灰度发布是滚动发布的改良,在原有软件生产版本可用的情况下,同时部署一个新的版本,两个版本同时存在于线上,为新版本分配少量流量,线上验证完毕后再将新版本推广。

    image.png

    这种部署方式的特点

    • 渐进式,风险较小
    • 需配合复杂的路由策略

参考文章:
大公司里怎样开发和部署前端代码?
部署策略对比:蓝绿部署、金丝雀发布及其他

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
21天前
|
数据采集 安全 数据管理
深度解析:DataHub的数据集成与管理策略
【10月更文挑战第23天】DataHub 是阿里云推出的一款数据集成与管理平台,旨在帮助企业高效地处理和管理多源异构数据。作为一名已经有一定 DataHub 使用经验的技术人员,我深知其在数据集成与管理方面的强大功能。本文将从个人的角度出发,深入探讨 DataHub 的核心技术、工作原理,以及如何实现多源异构数据的高效集成、数据清洗与转换、数据权限管理和安全控制措施。通过具体的案例分析,展示 DataHub 在解决复杂数据管理问题上的优势。
90 1
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
1月前
|
运维 监控 Devops
DevOps实践:持续集成与部署的自动化之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为提升效率、加速交付和确保质量的关键策略。本文将深入探讨如何通过实施持续集成(CI)和持续部署(CD)来自动化开发流程,从而优化运维工作。我们将从基础概念入手,逐步过渡到实际操作,包括工具选择、流程设计以及监控和反馈机制的建立。最终,我们不仅会展示如何实现这一自动化流程,还会讨论如何克服常见的挑战,以确保成功实施。
64 9
|
1月前
|
监控 Devops 测试技术
DevOps实践:持续集成与部署的自动化之路
【9月更文挑战第30天】在软件工程的世界中,DevOps已成为提升开发效率、确保软件质量和加快交付速度的关键策略。本文将深入探讨如何通过自动化工具和流程实现持续集成(CI)与持续部署(CD),从而优化软件开发周期。我们将从基础概念出发,逐步深入到实际操作,最终展示如何构建一个高效的自动化流水线,以支持快速迭代和高质量发布。
57 7
|
2月前
|
Devops jenkins Java
DevOps实践:持续集成和部署的自动化之旅
【9月更文挑战第20天】在软件开发的世界里,速度和质量是至关重要的。本文将带领读者踏上一场自动化之旅,深入探索DevOps文化中的两大支柱——持续集成(CI)和持续部署(CD)。我们将通过一个实际的案例,展示如何利用现代工具和技术实现代码从编写到部署的无缝转换,确保软件交付的高效性和可靠性。准备好让你的开发流程变得更加流畅和高效了吗?让我们开始吧!
|
30天前
|
安全 Java 测试技术
ToB项目身份认证AD集成(二):快速搞定window server 2003部署AD域服务并支持ssl
本文详细介绍了如何搭建本地AD域控测试环境,包括安装AD域服务、测试LDAP接口及配置LDAPS的过程。通过运行自签名证书生成脚本和手动部署证书,实现安全的SSL连接,适用于ToB项目的身份认证集成。文中还提供了相关系列文章链接,便于读者深入了解AD和LDAP的基础知识。
|
2月前
|
缓存 数据可视化 jenkins
推荐2款实用的持续集成与部署(CI&CD)自动化工具
推荐2款实用的持续集成与部署(CI&CD)自动化工具
177 1
|
3月前
|
Java Devops 持续交付
探索Java中的Lambda表达式:简化代码,提升效率DevOps实践:持续集成与部署的自动化之路
【8月更文挑战第30天】本文深入探讨了Java 8中引入的Lambda表达式如何改变了我们编写和管理代码的方式。通过简化代码结构,提高开发效率,Lambda表达式已成为现代Java开发不可或缺的一部分。文章将通过实际例子展示Lambda表达式的强大功能和优雅用法。
|
3月前
|
测试技术 Java
全面保障Struts 2应用质量:掌握单元测试与集成测试的关键策略
【8月更文挑战第31天】Struts 2 的测试策略结合了单元测试与集成测试。单元测试聚焦于单个组件(如 Action 类)的功能验证,常用 Mockito 模拟依赖项;集成测试则关注组件间的交互,利用 Cactus 等框架确保框架拦截器和 Action 映射等按预期工作。通过确保高测试覆盖率并定期更新测试用例,可以提升应用的整体稳定性和质量。
75 0
|
3月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
83 0