❤️ 可观测性

微服务健康检查:保障系统稳定性

深入探讨微服务架构中的健康检查机制,包括健康端点配置、就绪检查、存活检查、自定义检查等技术

一、健康检查概述

健康检查是微服务架构中保障系统稳定性的重要机制,用于检测服务状态和依赖服务的可用性。

二、健康检查类型

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

八、健康检查监控与告警

监控健康检查状态并设置告警。

九、健康检查最佳实践

设计有效的健康检查策略。

十、健康检查案例分析

实际项目中的健康检查配置示例。