ASP.NET Core 健康检查机制深度解析
2025-07-06 03:56:01作者:毕习沙Eudora
什么是健康检查
健康检查是应用程序向外部系统报告其运行状态的一种机制。在 ASP.NET Core 中,健康检查通过 HTTP 端点暴露,可以被容器编排系统、负载均衡器或其他监控服务调用,用于判断应用程序是否处于可用状态。
为什么需要健康检查
健康检查在现代应用部署中扮演着关键角色:
- 容器编排:Kubernetes 等系统通过健康检查决定是否重启容器
- 负载均衡:流量管理器根据健康状态路由请求
- 系统监控:运维团队可以实时掌握应用健康状况
- 依赖检查:验证数据库、外部服务等依赖项是否可用
基础健康检查配置
最简单的健康检查只需要确认应用能够响应请求即可:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();
var app = builder.Build();
app.MapHealthChecks("/healthz");
app.Run();
这段代码会:
- 注册健康检查服务
- 创建
/healthz
端点 - 返回
Healthy
、Degraded
或Unhealthy
状态
自定义健康检查实现
要实现自定义检查逻辑,需要创建实现 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
最佳实践
- 保持检查轻量级,避免影响性能
- 为不同环境配置不同的检查策略
- 合理设置检查频率
- 记录检查失败详情
- 考虑安全因素,适当保护端点
通过合理配置健康检查机制,可以显著提升 ASP.NET Core 应用程序的可观测性和可靠性,为运维团队提供关键的运行状态信息。