2. 健康检查基础:定义、作用与常见类型

健康检查是自动化发布流程中用于判断服务实例是否处于“可用”状态的核心探测机制。在蓝绿部署场景下,健康检查直接决定流量切换的时机与回滚的触发条件。

2.1 健康检查的定义

健康检查(Health Check)是指通过预设的探测规则,定期或按需对目标服务实例进行可达性、响应正确性及资源状态验证的过程。其结果通常为“健康”(Healthy)或“不健康”(Unhealthy),并作为发布系统决策的依据。

核心公式: 健康检查 = 探测策略 + 判定条件 + 超时/重试机制

2.2 健康检查的作用

在蓝绿发布中,健康检查承担以下关键职责:

  • 流量准入闸门: 只有通过健康检查的新版本实例,才会被加入负载均衡器接收用户流量。
  • 自动回滚触发器: 当新版本实例健康检查失败比例超过阈值时,系统自动终止发布并回滚至旧版本。
  • 故障隔离: 快速识别并摘除异常实例,防止请求被路由到已崩溃或响应超时的节点。
  • 发布进度控制: 在滚动更新或金丝雀发布中,每批次实例通过健康检查后才继续下一批。

2.3 常见健康检查类型对比

类型 探测方式 适用场景 优点 缺点
HTTP(S) 检查 发送 HTTP GET 请求到指定端点(如 /health),检查状态码(200-399)及响应体内容。 Web 应用、API 服务、微服务 可验证应用逻辑;支持自定义响应内容;与负载均衡器集成度高。 依赖应用层协议栈;可能受中间件影响;对短时抖动敏感。
TCP 端口检查 尝试建立 TCP 连接到指定 IP:Port,连接成功即视为健康。 数据库、缓存、消息队列、非 HTTP 服务 轻量、快速;不依赖应用层;兼容性好。 无法验证服务逻辑;仅能确认端口监听状态。
进程检查 检查目标进程是否在运行(如 pgrep、ps 命令)。 后台任务、守护进程、传统单体应用 实现简单;系统级探测;资源消耗极低。 无法判断进程是否僵死或响应正常;粒度最粗。

2.4 健康检查类型选择决策流程

以下 SVG 流程图展示了在蓝绿发布脚本中如何根据服务类型选择健康检查策略:

健康检查类型选择决策流程 开始健康检查配置 服务是否提供 HTTP 端点? 是 HTTP 检查 否 是否已知固定 TCP 端口? 是 TCP 检查 否 进程检查 生成健康检查配置 提示:HTTP 检查优先级最高,其次为 TCP 检查,进程检查作为兜底方案。

2.5 健康检查脚本核心参数

在编写自动化健康检查脚本时,以下参数必须可配置:

参数名 类型 默认值 说明
check_type string http 检查类型:http / tcp / process
check_interval int 5 每次探测间隔(秒)
timeout int 3 单次探测超时(秒)
retry_count int 3 连续失败次数阈值
healthy_threshold int 2 连续成功次数阈值

2.6 三种检查类型的脚本实现示例

以下代码片段展示了三种健康检查类型的核心实现逻辑:

#!/bin/bash
# 健康检查脚本核心函数

# HTTP 健康检查
http_health_check() {
    local url="$1"
    local expected_code="${2:-200}"
    local timeout="${3:-3}"
    local response_code
    response_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$timeout" "$url")
    if [[ "$response_code" -ge 200 && "$response_code" -lt 400 ]]; then
        return 0
    else
        return 1
    fi
}

# TCP 端口健康检查
tcp_health_check() {
    local host="$1"
    local port="$2"
    local timeout="${3:-3}"
    timeout "$timeout" bash -c "echo > /dev/tcp/$host/$port" 2>/dev/null
    return $?
}

# 进程健康检查
process_health_check() {
    local process_name="$1"
    if pgrep -x "$process_name" >/dev/null 2>&1; then
        return 0
    else
        return 1
    fi
}
最佳实践: 在蓝绿发布脚本中,建议将三种检查类型封装为统一接口,通过 check_type 参数动态调用,便于扩展和维护。

2.7 健康检查的常见陷阱

  • 仅检查端口存活: 进程可能僵死但端口仍监听,导致误判为健康。
  • 超时设置过短: 在服务启动初期或高负载下,正常服务可能因响应慢被误判为不健康。
  • 忽略依赖服务: 应用健康检查端点应同时验证数据库、缓存等关键依赖是否可用。
  • 检查路径硬编码: 不同版本可能使用不同的健康检查端点,应通过环境变量或配置注入。

2.8 健康检查在蓝绿发布中的集成位置

下图展示了健康检查在蓝绿发布流程中的关键集成点:

健康检查在蓝绿发布中的集成位置 蓝绿发布健康检查集成流程 部署新版本 启动后健康检查 流量切换 持续健康检查 回滚决策 回滚旧版本 关键集成点说明 ① 新版本部署后立即执行健康检查,通过后才允许流量接入。 ② 流量切换后持续执行健康检查,失败超过阈值则触发自动回滚。
注意: 健康检查不是一次性动作,而是贯穿整个发布生命周期的持续过程。在蓝绿发布中,即使流量已完全切换,仍需保持对旧版本实例的健康检查,以便在需要回滚时确认旧版本仍可用。