在 IIS + Windows Server 上实现 ASP.NET Core 应用的零停机部署:蓝绿 + 滚动 + 回滚策略
2025-11-17 1299 0
在生产环境中部署新版本时,最忌讳的是服务中断。用户如果在升级过程中遇到 “503 服务不可用”、页面白屏,或者接口暂时不可达,不仅影响体验,还可能造成业务损失。传统部署方式(停止旧版本、覆盖文件、重启服务)很难避免短暂停机。而 零停机部署(Zero Downtime Deployment)旨在使用户在部署时无感知,实现高可用、持续交付。
在 IIS + Windows Server 上部署 ASP.NET Core 应用时,我们可以利用 蓝绿部署 (Blue-Green)、滚动更新 (Rolling Update)、智能回滚 等策略结合 IIS 的特性来做到真正的零停机。
核心理念:多实例 + 流量切换 + 原子切换
要实现零停机,关键在于三点:
-
多版本并行运行:旧版本和新版本同时运行在独立的实例上;
-
流量切换:通过 IIS 绑定、URL 重写、负载均衡、代理等方式,将用户请求从旧版平滑地切换到新版;
-
原子级切换与回退:切换完成后,能够一次性将流量指向新版本;如果新版本出现问题,也能快速回滚到旧版本。
在 Windows Server + IIS 环境下,推荐的方式包括:
-
蓝绿部署 (Blue-Green)
-
滚动更新 (Rolling Update)
-
预热机制 (Warm-up)
-
回滚策略
方案一:蓝绿部署 (Blue-Green)
什么是蓝绿部署
蓝绿部署是指维持两个生产环境版本:绿色 (Green) 为当前线上版本,蓝色 (Blue) 为新版本。新版本部署在独立目录或网站中,待完全验证后再切换流量。
在 IIS 上实现蓝绿部署
-
部署目录结构
在 Windows Server 上准备两个文件夹,比如C:\inetpub\site\app_green和C:\inetpub\site\app_blue。旧版本运行在 app_green,新版本部署到 app_blue。 -
创建两个 IIS 网站 / 应用
创建两个 IIS 网站或两个应用池指向这两个目录。它们可以使用不同端口或不同主机名绑定。 -
预热新版本
部署完成后,对 app_blue 站点进行预热(例如访问预热 URL、调用关键启动逻辑等),确保它启动完整、功能正常。 -
切换流量
一旦新版验证通过,就通过调整 IIS 绑定、Host 记录、URL 重写规则或负载均衡器,把用户流量从旧版 (Green) 切换到新版 (Blue)。 -
回滚机制
如果在新版运行过程中发现问题,可以快速反向切换流量回旧版。因为两个版本并行存在,回滚非常迅速。
优势与挑战
- 优势:安全、简单、切换原子化、支持回滚。
- 挑战:需要双倍磁盘空间、两个 IIS 实例的维护,以及预热准备。
方案二:滚动更新 (Rolling Update)
滚动更新适合一个有多个服务器 (或多台 VM) 的部署环境。在 Windows Server 中可以采用以下架构:
-
多台 Windows Server 实例 部署 ASP.NET Core 应用,每台 IIS + Kestrel 后端。
-
负载均衡器 (LB) 放在前端(硬件 LB 或使用 IIS Application Request Routing (ARR))。
-
逐机器更新:关闭一台机器流量 (从 LB 中剔除),部署新版本,预热,验证后再把它拉回负载池。重复此过程直到所有机器都升级。
优点:单机更新,无需双目录。
缺点:需要多台服务器和负载均衡支持。
预热 (Warm-up) 和应用初始化
预热是零停机部署中非常重要的一环。即使完成了部署和切换,如果新版本没有经过启动或关键路径初始化,也可能在第一次真实用户访问时经历冷启动、JIT 编译、缓存填充等延迟。
在 IIS + ASP.NET Core 场景中,可以:
-
开启 IIS 应用池预加载 (Application Initialization)。启用
startMode=AlwaysRunning,启用doAppInitAfterRestart,设置预加载页面。 -
自定义启动 endpoint,在启动时触发数据加载、服务初始化、缓存构建等逻辑。
-
脚本预热:通过 PowerShell 或 HTTP 请求脚本自动访问预热 URL,完成启动准备。
回滚策略
零停机部署不仅要考虑向前部署,还要考虑紧急回滚能力。
-
蓝绿模式 本身就天然支持回滚,只需将流量切换回旧版本。
-
滚动升级 时:若某台机器在更新后出问题,将其剔除 LB,恢复旧版本,验证旧机健康后再重新加入。
-
数据库变更策略:数据库 schema 变更必须谨慎控制。建议采用兼容性变更(向前/向后兼容的 schema),不要一次性破坏数据库结构。
自动化部署流水线
为了降低人为操作风险,并进一步提高部署效率,我们推荐将上线流水线自动化:
-
CI/CD 工具:使用 Jenkins、GitHub Actions、Azure DevOps 等,将构建、打包、发布部署流程自动化。
-
Web Deploy / MSDeploy:通过 Web Deploy 将发布包同步到目标服务器。
-
PowerShell 脚本:自动完成复制、预热、流量切换、回滚等操作。
-
健康检查:在流水线中加入健康检查 (smoke test) 步骤,验证关键接口是否正常。
注意事项与最佳实践
-
应用池配置:将应用池的 .NET CLR 版本设置为 “无托管代码”,因为 ASP.NET Core 自己托管在 Kestrel。
-
IIS 模块:确保服务器安装了适当版本的 ASP.NET Core Hosting Bundle,并启用 AspNetCoreModule。
-
文件锁定问题:在直接覆盖 DLL 的场景中可能会遇到文件被锁的问题。通过蓝绿部署或多个实例可以规避这个问题。
-
状态与会话管理:如果应用依赖内存中的会话或缓存,要考虑会话粘滞、外部会话存储 (例如 Redis)、或共享缓存策略。
-
监控与日志:部署后持续监控 CPU、内存、请求延迟、错误率等指标。记录日志 (stdout Log) 用于回滚决策依据。
总结
在 IIS + Windows Server 环境下,通过蓝绿部署、滚动更新、预热与回滚策略,可以实现 ASP.NET Core 应用的真正零停机部署。这不仅提升用户体验,还能降低上线风险。结合 CI/CD 自动化流水线与监控机制,企业能够实现可靠、平滑的持续交付。