首页
/ ASP.NET Core 健康检查机制深度解析

ASP.NET Core 健康检查机制深度解析

2025-07-06 03:56:01作者:毕习沙Eudora

什么是健康检查

健康检查是应用程序向外部系统报告其运行状态的一种机制。在 ASP.NET Core 中,健康检查通过 HTTP 端点暴露,可以被容器编排系统、负载均衡器或其他监控服务调用,用于判断应用程序是否处于可用状态。

为什么需要健康检查

健康检查在现代应用部署中扮演着关键角色:

  1. 容器编排:Kubernetes 等系统通过健康检查决定是否重启容器
  2. 负载均衡:流量管理器根据健康状态路由请求
  3. 系统监控:运维团队可以实时掌握应用健康状况
  4. 依赖检查:验证数据库、外部服务等依赖项是否可用

基础健康检查配置

最简单的健康检查只需要确认应用能够响应请求即可:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();

var app = builder.Build();
app.MapHealthChecks("/healthz");
app.Run();

这段代码会:

  1. 注册健康检查服务
  2. 创建 /healthz 端点
  3. 返回 HealthyDegradedUnhealthy 状态

自定义健康检查实现

要实现自定义检查逻辑,需要创建实现 IHealthCheck 接口的类:

public class SampleHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context, 
        CancellationToken cancellationToken = default)
    {
        var isHealthy = true;
        
        if (isHealthy)
        {
            return Task.FromResult(
                HealthCheckResult.Healthy("服务正常"));
        }
        
        return Task.FromResult(
            new HealthCheckResult(
                context.Registration.FailureStatus, 
                "服务异常"));
    }
}

注册健康检查服务

Program.cs 中注册自定义检查:

builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheck>("示例检查");

可以添加更多配置选项:

builder.Services.AddHealthChecks()
    .AddCheck<SampleHealthCheck>(
        "示例检查",
        failureStatus: HealthStatus.Degraded,
        tags: new[] { "sample" });

端点路由配置

健康检查端点支持多种配置:

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    Predicate = check => check.Tags.Contains("sample"),
    ResponseWriter = WriteResponse
});

常用健康检查类型

数据库健康检查

对于 SQL Server 数据库检查:

builder.Services.AddHealthChecks()
    .AddSqlServer(connectionString);

Entity Framework Core 检查

builder.Services.AddHealthChecks()
    .AddDbContextCheck<AppDbContext>();

高级配置选项

状态码映射

app.MapHealthChecks("/healthz", new HealthCheckOptions
{
    ResultStatusCodes =
    {
        [HealthStatus.Healthy] = StatusCodes.Status200OK,
        [HealthStatus.Degraded] = StatusCodes.Status200OK,
        [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
    }
});

自定义输出格式

private static Task WriteResponse(HttpContext context, HealthReport report)
{
    context.Response.ContentType = "application/json";
    
    return context.Response.WriteAsync(
        JsonSerializer.Serialize(new
        {
            status = report.Status.ToString(),
            checks = report.Entries.Select(e => new
            {
                name = e.Key,
                status = e.Value.Status.ToString(),
                description = e.Value.Description
            })
        }));
}

实际应用场景

区分就绪性和存活检查

// 存活检查
app.MapHealthChecks("/health/live", new HealthCheckOptions
{
    Predicate = _ => false
});

// 就绪检查
app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
    Predicate = check => check.Tags.Contains("ready")
});

Docker 集成

在 Dockerfile 中添加健康检查指令:

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:5000/healthz || exit 1

最佳实践

  1. 保持检查轻量级,避免影响性能
  2. 为不同环境配置不同的检查策略
  3. 合理设置检查频率
  4. 记录检查失败详情
  5. 考虑安全因素,适当保护端点

通过合理配置健康检查机制,可以显著提升 ASP.NET Core 应用程序的可观测性和可靠性,为运维团队提供关键的运行状态信息。