Files
LabelChange-server/deployment/IMPLEMENTATION_SUMMARY.md
2026-06-01 16:30:29 +08:00

8.7 KiB
Raw Blame History

零停机部署方案 - 实现总结

📋 方案概述

已成功为你的 .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

    • 功能:快速回滚到上一个版本
    • 包含:备份恢复、健康检查、流量切换

配置文件

  1. deployment/config/deployment-config.json
    • 蓝绿实例配置(端口、目录、执行文件)
    • 健康检查参数
    • 部署参数
    • 日志位置

文档

  1. deployment/DEPLOYMENT_GUIDE.md (完整部署指南)

    • 详细的架构说明
    • 部署前准备
    • 初始化步骤
    • 后续部署流程
    • 健康检查端点说明
    • 回滚流程
    • 故障排查
    • 监控和日志
    • 最佳实践
    • FAQ
  2. deployment/QUICK_START.md (快速开始)

    • 30秒快速了解
    • 初始化步骤
    • 日常部署方式
    • 关键命令
    • 常见场景工作流
  3. deployment/IMPLEMENTATION_SUMMARY.md (本文件)

    • 实现总结
    • 技术架构
    • 文件清单

已修改的文件

  1. src/CONTROLLER/Program.cs

    • 添加固定端口支持基于DEPLOYMENT_INSTANCE环境变量
    • 添加:优雅关闭处理
    • 添加:增强的健康检查端点 (/api/health)
    • 添加:版本信息端点 (/api/version)
  2. src/CONTROLLER/appsettings.json

    • 添加DeploymentSettings 配置节点
    • 包含:端口配置、健康检查参数、超时设置

🚀 使用流程

初始化(仅一次)

# 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. 初始化状态文件

日常部署(每次更新)

# 一条命令完成所有事情
.\deploy-blue-green.ps1 -Version "1.1.0"

快速回滚

# 一条命令恢复上一个版本
.\rollback.ps1

🔍 监控和验证

验证部署成功的3个方法

# 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分钟

客户端影响

场景 影响
新连接 自动转向新实例 ✓
已建立连接 保持到旧实例(正常完成)
长连接 服务平稳转移,无数据丢失

⚙️ 环境变量配置

必需环境变量

# 标识实例身份(决定使用的端口)
$env:DEPLOYMENT_INSTANCE = "blue"   # → 端口5000
# 或
$env:DEPLOYMENT_INSTANCE = "green"  # → 端口5001

# 优雅关闭超时
$env:SHUTDOWN_TIMEOUT = "30"  # 秒

应用配置 (appsettings.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 中修改 GracefulShutdownTimeoutHealthCheckRetries

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 支持: 固定端口蓝绿部署