第 7 章:应用程序生命周期:考虑不断变化

本文深入探讨云原生应用程序的生命周期管理,涵盖零停机升级、蓝/绿部署、滚动升级、密码轮换等关键模式,并结合实际案例说明如何在动态环境中保持系统稳定性和高可用性。

本章要点

  • 零停机升级:蓝/绿升级和滚动升级
  • 金丝雀升级
  • 密码轮换模式
  • 应用程序生命周期和故障排除
  • 应用程序健康检查

应用程序生命周期概述

应用程序的生命周期包括部署、启动、运行和关闭等阶段。与传统软件开发生命周期(SDLC)不同,云原生应用关注的是生产环境中应用的运行状态和管理方式。

在云原生环境中,应用程序的生命周期管理尤为重要。下图展示了应用程序在生命周期中经历的基本阶段。

图 7.1 应用程序生命周期阶段
图 7.1 应用程序生命周期阶段

云原生环境下的变化与挑战

云原生应用的两个核心特征——高度分布式和持续变化——使得生命周期管理变得复杂。应用实例需要作为一个整体工作,配置和升级需保证一致性。同时,应用实例会因故障或运维事件频繁重启或迁移,带来级联影响。

运维同理心

作为开发者,理解运维需求至关重要。云原生应用的运维关注点包括:

  • 可管理性:自动化管理功能,配置变更需高效可靠。
  • 弹性:平台需能安全检测应用故障并自动恢复。
  • 响应性:用户体验受应用启动和运行状态影响。
  • 成本管理:按需伸缩,优化资源利用。

单实例与多实例应用生命周期

以帖子服务为例,多个实例需保持配置一致。配置变更(如密码泄露后更换)需通过滚动升级或蓝/绿部署实现。

注意:配置变更通常需要重启应用实例,确保所有实例一致性。

配置更新的挑战

直接刷新单个实例配置(如 Spring 的 /refresh 端点)无法保证所有实例同步更新,需通过统一管理工具在负载均衡器后进行控制。

云原生升级模式

蓝/绿升级

蓝/绿部署通过新旧版本实例并行运行,验证新版本后切换流量,保证零停机。资源需求较高,但实现简单。

图 7.5 当应用程序无法同时运行多个版本时 ( 即多个版本不能作为单个逻辑实体来运行 ),可以使用蓝 / 绿部署。
图 7.5 当应用程序无法同时运行多个版本时 ( 即多个版本不能作为单个逻辑实体来运行 ),可以使用蓝 / 绿部署。

滚动升级

滚动升级允许新旧版本实例同时运行,逐步替换,资源消耗更低,支持更高的敏捷性和并行部署。

图 7.6 在滚动升级过程中,生产环境流量会被路由到应用程序的多个版本上。应用程序必须整体上像是一个单一的逻辑实体一样,即使请求会被分布到多个版本的实例上。
图 7.6 在滚动升级过程中,生产环境流量会被路由到应用程序的多个版本上。应用程序必须整体上像是一个单一的逻辑实体一样,即使请求会被分布到多个版本的实例上。

并行部署与敏捷性

并行部署支持灰度发布和多版本共存,提升系统灵活性。版本管理需同时关注可部署构件和配置版本。

协调多个应用程序生命周期

应用程序生命周期事件会影响依赖服务。例如,密码变更需协调客户端和服务端的升级。常用模式是分阶段密码轮换,服务端支持多个密码,客户端逐步切换。

图 7.9 这个密码轮换模式的案例,是软件架构师 / 开发人员必须注意思考的。目标是确保当应用程序生命周期事件会造成许多其他影响的情况下,软件的升级不会造成停机时间。
图 7.9 这个密码轮换模式的案例,是软件架构师 / 开发人员必须注意思考的。目标是确保当应用程序生命周期事件会造成许多其他影响的情况下,软件的升级不会造成停机时间。

实际案例:密码轮换与生命周期管理

本节以实际操作说明密码轮换流程,涉及配置文件修改、滚动升级、Kubernetes 部署等步骤。具体代码实现可参考如下思路:

  • 服务端通过配置文件维护密码列表,启动时加载所有有效密码。
  • 客户端仅使用最新密码,升级过程中逐步切换。
  • 通过 Kubernetes 滚动升级实现配置同步。

示例代码可参考 Spring Boot 应用中通过监听 ApplicationPreparedEvent 加载配置,并在控制器中校验密码有效性。

处理临时运行时环境

云原生应用频繁销毁和重建实例,要求部署可重现性和故障排查能力。日志应输出到 stdout/stderr,便于平台统一收集。故障排查依赖日志和指标,避免碎片化操作。

应用程序生命周期状态的可见性

应用程序需主动广播生命周期事件,便于依赖服务自动适应变化。健康检查端点和控制循环机制(如 Kubernetes 的 livenessProbe)可持续监控应用状态,实现自动恢复。

图 7.14 在云原生系统中,控制循环扮演了一个重要的角色,通过冗余来修复系统中的“故障”。
图 7.14 在云原生系统中,控制循环扮演了一个重要的角色,通过冗余来修复系统中的“故障”。

无服务器架构(Serverless)简述

无服务器平台按需分配运行环境,极大提升开发和运维效率。每次函数调用都经历完整生命周期,开发者需关注启动成本和执行效率。

图 7.15 一个单独的函数调用要经历生命周期的所有阶段
图 7.15 一个单独的函数调用要经历生命周期的所有阶段

总结

  • 云原生应用需关注应用程序生命周期管理,确保高可用和零停机升级。
  • 升级模式包括蓝/绿部署和滚动升级,后者更具敏捷性和资源效率。
  • 密码轮换等配置变更需分阶段协调,保证服务连续性。
  • 日志和健康检查端点是故障排查和自动恢复的基础。
  • 无服务器架构进一步强化了生命周期管理和资源优化。

参考文献

  1. Cloud Native Patterns - manning.com
  2. Kubernetes 官方文档 - kubernetes.io
  3. Spring Boot 官方文档 - spring.io

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区