# 零停机部署方案 - 实现总结 ## 📋 方案概述 已成功为你的 .NET Core 应用实现了**固定端口蓝绿部署方案**,确保在更新应用时客户端不会遇到服务中断。 ### ✨ 核心特性 | 特性 | 说明 | |------|------| | **零停机** | 部署期间服务持续可用,客户端无中断 | | **自动化** | PowerShell脚本全程自动化部署流程 | | **快速回滚** | 故障时秒级回滚到上一个版本 | | **固定端口** | 无需修改Nginx配置,端口固定分配 | | **健康检查** | 自动验证新实例就绪再切换流量 | | **优雅关闭** | 旧实例完成请求后再关闭 | | **完整日志** | 所有操作都详细记录便于追踪 | --- ## 🏗️ 技术架构 ``` 客户端请求 ↓ Nginx (反向代理) ├─ upstream server 127.0.0.1:5000 (蓝/绿 - 活跃) └─ upstream server 127.0.0.1:5001 (绿/蓝 - 备用) ↓ 活跃实例运行 ├─ DEPLOYMENT_INSTANCE=blue → 端口5000 └─ DEPLOYMENT_INSTANCE=green → 端口5001 ``` ### 部署流程图 ``` 部署开始 ↓ [确定非活跃实例] → 假设为 green ↓ [编译到green] ← dotnet build/publish ↓ [启动green] ← 环境变量: DEPLOYMENT_INSTANCE=green ↓ [健康检查] ← GET /api/health (最多30次重试) ↓ [切换流量] ← 更新 instance_state.json ↓ [优雅关闭blue] ← 等待请求完成 (最多30秒) ↓ 部署完成 ✓ ``` --- ## 📁 文件清单 ### 已创建的文件 #### 核心脚本 1. **`deployment/scripts/build-and-publish.ps1`** - 功能:编译源代码并发布到指定目录 - 包含:备份、清理、编译、发布完整流程 2. **`deployment/scripts/deploy-blue-green.ps1`** - 功能:执行蓝绿部署核心逻辑 - 包含:编译、启动、健康检查、流量切换、优雅关闭 3. **`deployment/scripts/health-check.ps1`** - 功能:检查实例健康状态 - 包含:重试机制、指数退避、超时控制 4. **`deployment/scripts/stop-instance.ps1`** - 功能:优雅停止实例 - 包含:等待完成、强制终止、日志记录 5. **`deployment/scripts/rollback.ps1`** - 功能:快速回滚到上一个版本 - 包含:备份恢复、健康检查、流量切换 #### 配置文件 6. **`deployment/config/deployment-config.json`** - 蓝绿实例配置(端口、目录、执行文件) - 健康检查参数 - 部署参数 - 日志位置 #### 文档 7. **`deployment/DEPLOYMENT_GUIDE.md`** (完整部署指南) - 详细的架构说明 - 部署前准备 - 初始化步骤 - 后续部署流程 - 健康检查端点说明 - 回滚流程 - 故障排查 - 监控和日志 - 最佳实践 - FAQ 8. **`deployment/QUICK_START.md`** (快速开始) - 30秒快速了解 - 初始化步骤 - 日常部署方式 - 关键命令 - 常见场景工作流 9. **`deployment/IMPLEMENTATION_SUMMARY.md`** (本文件) - 实现总结 - 技术架构 - 文件清单 ### 已修改的文件 10. **`src/CONTROLLER/Program.cs`** - 添加:固定端口支持(基于DEPLOYMENT_INSTANCE环境变量) - 添加:优雅关闭处理 - 添加:增强的健康检查端点 (`/api/health`) - 添加:版本信息端点 (`/api/version`) 11. **`src/CONTROLLER/appsettings.json`** - 添加:DeploymentSettings 配置节点 - 包含:端口配置、健康检查参数、超时设置 --- ## 🚀 使用流程 ### 初始化(仅一次) ```powershell # 1. 创建目录结构 mkdir D:\EPproject\LabelReplaceServer\deployment\{blue,green,backups,logs,scripts,config} # 2. 复制脚本和配置文件 # 3. 首次部署蓝实例 .\build-and-publish.ps1 -OutputDirectory "...blue" -Version "1.0.0" # 4. 启动蓝实例 cd .\deployment\blue $env:DEPLOYMENT_INSTANCE = "blue" .\CONTROLLER.exe # 5. 配置Nginx(指向5000为主,5001为备用) # 6. 初始化状态文件 ``` ### 日常部署(每次更新) ```powershell # 一条命令完成所有事情 .\deploy-blue-green.ps1 -Version "1.1.0" ``` ### 快速回滚 ```powershell # 一条命令恢复上一个版本 .\rollback.ps1 ``` --- ## 🔍 监控和验证 ### 验证部署成功的3个方法 ```powershell # 1. 检查活跃实例状态 Get-Content "...instance_state.json" | ConvertFrom-Json # 2. 调用版本端点查看版本号 curl http://localhost:5001/api/version # 3. 查看部署日志确认完成 Get-Content "...deployment.log" -Tail 50 ``` ### 关键端点 | 端点 | 说明 | 用途 | |------|------|------| | `GET /api/health` | 健康检查 | 验证实例是否就绪 | | `GET /api/version` | 版本信息 | 确认当前版本 | | `GET /health` | 健康检查(ASP.NET) | ASP.NET Health Check | --- ## 📊 性能指标 ### 部署时间预估 | 步骤 | 时间 | |------|------| | 编译 | ~30-60秒 | | 发布 | ~20-30秒 | | 启动实例 | ~5-10秒 | | 健康检查 | ~2-5秒 | | 流量切换 | <1秒 | | 旧实例关闭 | ~5秒 | | **总计** | **~1-3分钟** | ### 客户端影响 | 场景 | 影响 | |------|------| | 新连接 | 自动转向新实例 ✓ | | 已建立连接 | 保持到旧实例(正常完成) | | 长连接 | 服务平稳转移,无数据丢失 | --- ## ⚙️ 环境变量配置 ### 必需环境变量 ```powershell # 标识实例身份(决定使用的端口) $env:DEPLOYMENT_INSTANCE = "blue" # → 端口5000 # 或 $env:DEPLOYMENT_INSTANCE = "green" # → 端口5001 # 优雅关闭超时 $env:SHUTDOWN_TIMEOUT = "30" # 秒 ``` ### 应用配置 (appsettings.json) ```json "DeploymentSettings": { "BlueInstancePort": 5000, "GreenInstancePort": 5001, "HealthCheckUrl": "/api/health", "HealthCheckTimeout": 10, "HealthCheckRetries": 30, "HealthCheckRetryDelayMs": 1000, "GracefulShutdownTimeoutSeconds": 30, "InstanceStateFile": "instance_state.json" } ``` --- ## 🔒 安全考虑 1. **访问控制**:确保部署脚本只在授权用户可访问的地方 2. **日志敏感信息**:日志中隐藏数据库密码等敏感信息 3. **备份安全**:定期清理旧备份,确保备份目录权限正确 4. **Nginx配置**:确保Nginx配置文件安全,限制到本地IP --- ## 📝 常见问题 **Q: 如果新实例启动失败怎么办?** A: 脚本会检查健康检查是否失败,如失败则自动停止新实例并恢复旧实例,确保服务可用。 **Q: 部署过程中数据会丢失吗?** A: 不会。所有请求都会被完整处理。新连接转向新实例,旧连接继续运行直到完成。 **Q: 可以自定义部署超时时间吗?** A: 可以。在 `deployment-config.json` 中修改 `GracefulShutdownTimeout` 和 `HealthCheckRetries`。 **Q: 如何处理数据库迁移?** A: 建议在部署前手动运行迁移脚本,或在新实例启动时自动运行。 **Q: 能支持多个实例吗?** A: 当前方案支持2个实例(蓝绿)。如需更多,需要使用容器编排如 Kubernetes。 --- ## ✅ 完成清单 - ✅ 修改 Program.cs 支持固定端口、健康检查、优雅关闭 - ✅ 更新 appsettings.json 添加部署配置 - ✅ 创建部署配置文件 (deployment-config.json) - ✅ 编写编译发布脚本 (build-and-publish.ps1) - ✅ 编写健康检查脚本 (health-check.ps1) - ✅ 编写蓝绿部署脚本 (deploy-blue-green.ps1) - ✅ 编写优雅关闭脚本 (stop-instance.ps1) - ✅ 编写回滚脚本 (rollback.ps1) - ✅ 创建完整部署指南 (DEPLOYMENT_GUIDE.md) - ✅ 创建快速开始指南 (QUICK_START.md) - ✅ 创建实现总结 (IMPLEMENTATION_SUMMARY.md) --- ## 🎯 下一步建议 1. **立即开始**:按照 `QUICK_START.md` 进行初始化 2. **充分测试**:在开发/测试环境验证部署流程 3. **监控完善**:添加告警和监控系统 4. **文档更新**:根据实际情况更新部署文档 5. **团队培训**:让团队熟悉新的部署流程 --- ## 📞 支持资源 - **快速开始**:`deployment/QUICK_START.md` - **完整指南**:`deployment/DEPLOYMENT_GUIDE.md` - **配置参考**:`deployment/config/deployment-config.json` - **日志文件**:`deployment/logs/deployment.log` --- ## 📌 重要提醒 1. **首次部署前**:确保已按照 `QUICK_START.md` 完成初始化 2. **Nginx配置**:确保Nginx已按指南配置并正确指向两个端口 3. **备份管理**:定期检查备份目录,确保有足够空间 4. **监控日志**:部署过程中打开日志文件实时监控 5. **版本号**:每次部署使用不同的版本号便于追踪 --- ## 🎉 完成 你的 .NET Core 应用现在已具备零停机部署能力! 从现在开始,你可以在任何时间更新应用而不用担心客户端会遇到服务中断。 祝部署顺利!🚀 --- *实现日期: 2026-05-15* *方案版本: 1.0* *支持: 固定端口蓝绿部署*