ASP.NET Core怎么实现健康检查 HealthChecks配置与使用方法

来源:这里教程网 时间:2026-02-21 17:41:33 作者:

ASP.NET Core 的健康检查(Health Checks)是监控应用运行状态的轻量级机制,能快速识别服务是否就绪、是否存活、依赖是否可用。它不复杂但容易忽略细节,关键是配置好检查项、暴露端点、并结合实际场景定制逻辑。

启用健康检查中间件

Program.cs 中注册健康检查服务并添加中间件:

调用 AddHealthChecks() 注册服务,可链式添加各种检查器(如数据库、HTTP、磁盘等) 调用 MapHealthChecks() 暴露 HTTP 端点,支持自定义路径、响应格式和授权

示例:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks()
    .AddSqlServer(connectionString: "Server=...;Database=Test;...")
    .AddRedis("localhost:6379", name: "redis-cache")
    .AddProcessHostedServiceCheck(); // 自定义检查:确认后台服务是否启动
var app = builder.Build();
app.MapHealthChecks("/health", new HealthCheckOptions
{
    ResponseWriter = async (ctx, report) =>
    {
        ctx.Response.ContentType = "application/json";
        await JsonSerializer.SerializeAsync(ctx.Response.Body, report, new JsonSerializerOptions { WriteIndented = true });
    }
});

定义自定义健康检查

当内置检查器不满足需求时(比如检查第三方 API 可用性、文件写入权限、配置有效性),可实现 IHealthCheck 接口:

重写 CheckHealthAsync 方法,执行检测逻辑 返回 HealthCheckResult.Healthy().Unhealthy().Degraded() 可传入描述、异常、数据字典(用于输出诊断信息)

例如检查某个配置项是否存在:

public class ConfigHealthCheck : IHealthCheck
{
    private readonly IConfiguration _config;
    public ConfigHealthCheck(IConfiguration config) => _config = config;
    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        var value = _config["ExternalApi:BaseUrl"];
        return Task.FromResult(string.IsNullOrWhiteSpace(value)
            ? HealthCheckResult.Unhealthy("External API base URL is missing.")
            : HealthCheckResult.Healthy());
    }
}

然后注册:services.AddHealthChecks().AddCheck("config-check");

区分就绪(Ready)与存活(Live)检查

生产中常需两类检查:

/health/live:只判断进程是否存活(如未崩溃、未被 SIGTERM 中断),通常用 AddLivenessCheck 或简单返回 Healthy /health/ready:判断是否已准备好接收流量(如数据库连通、缓存加载完成、后台任务初始化完毕)

ASP.NET Core 不自带 Live/Ready 区分,但可通过不同端点 + 不同检查集合实现:

app.MapHealthChecks("/health/live", new HealthCheckOptions
{
    Predicate = _ => true // 所有检查都跳过,或只挂一个空检查
});
app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
    Predicate = reg => reg.Tags.Contains("ready") // 只执行带 "ready" 标签的检查
});
// 注册时打标签
services.AddHealthChecks()
    .AddSqlServer(connStr, tags: new[] { "ready" })
    .AddCheck<StartupTaskHealthCheck>("startup-task", tags: new[] { "ready" });

集成到 Kubernetes 或 Prometheus

K8s 的 liveness/readiness 探针可直接对接上述端点;Prometheus 则需启用指标导出:

安装 AspNetCore.HealthChecks.Prometheus.Metrics 调用 AddPrometheusExporter() 并映射 /metrics 健康检查结果会自动转为 Prometheus 格式指标(如 healthcheck_status{check="sql",status="healthy"} 1)

注意:Prometheus 端点默认不启用认证,上线前建议加中间件限制访问来源。

基本上就这些。关键不是堆功能,而是按环境选检查项、合理打标签、让返回信息对运维真正有用。

相关推荐