一、健康检查概述
健康检查是微服务架构中保障系统稳定性的重要机制,用于检测服务状态和依赖服务的可用性。
二、健康检查类型
ASP.NET Core支持多种健康检查类型。
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks()
.AddCheck<DatabaseHealthCheck>("database")
.AddCheck<RedisHealthCheck>("redis")
.AddCheck<ExternalApiHealthCheck>("external_api");
}
三、存活检查(Liveness)
存活检查用于判断容器是否应该被重启。
public void Configure(IApplicationBuilder app)
{
app.UseEndpoints(endpoints => {
endpoints.MapHealthChecks("/health/live", new HealthCheckOptions {
Predicate = _ => true,
ResponseWriter = WriteHealthCheckResponse
});
});
}
四、就绪检查(Readiness)
就绪检查用于判断服务是否准备好接收流量。
public void Configure(IApplicationBuilder app)
{
app.UseEndpoints(endpoints => {
endpoints.MapHealthChecks("/health/ready", new HealthCheckOptions {
Predicate = check => check.Tags.Contains("ready"),
ResponseWriter = WriteHealthCheckResponse
});
});
}
五、自定义健康检查
创建自定义健康检查检查特定依赖。
public class DatabaseHealthCheck : IHealthCheck
{
private readonly IDbConnection _connection;
public Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
try
{
_connection.Open();
return Task.FromResult(HealthCheckResult.Healthy("Database connection is healthy"));
}
catch (Exception ex)
{
return Task.FromResult(HealthCheckResult.Unhealthy("Database connection failed", ex));
}
}
}
六、健康检查响应格式
自定义健康检查响应格式。
public static Task WriteHealthCheckResponse(
HttpContext context,
HealthReport report)
{
context.Response.ContentType = "application/json";
var result = JsonConvert.SerializeObject(new {
status = report.Status.ToString(),
checks = report.Entries.Select(entry => new {
name = entry.Key,
status = entry.Value.Status.ToString(),
description = entry.Value.Description
}),
totalDuration = report.TotalDuration
});
return context.Response.WriteAsync(result);
}
七、Kubernetes健康检查集成
配置Kubernetes的存活和就绪探针。
apiVersion: v1
kind: Pod
spec:
containers:
- name: my-app
image: my-app:latest
livenessProbe:
httpGet:
path: /health/live
port: 80
initialDelaySeconds: 10
periodSeconds: 5
readinessProbe:
httpGet:
path: /health/ready
port: 80
initialDelaySeconds: 5
periodSeconds: 3
八、健康检查监控与告警
监控健康检查状态并设置告警。
九、健康检查最佳实践
设计有效的健康检查策略。
十、健康检查案例分析
实际项目中的健康检查配置示例。