介绍
在现代的软件架构中,应用程序的健康状态监测是一个不可或缺的环节。健康检查(Health Checks)为应用程序提供了一种机制,通过 HTTP 端点暴露其运行状态。这些端点不仅可以指示应用程序自身是否健康,还可以检查应用程序依赖的外部服务(如数据库、缓存系统等)的健康状况。本文将详细介绍如何在 ASP.NET Core 中配置和使用健康检查。
健康检查的重要性
健康检查对于应用程序的监控和运维至关重要。它们可以被监控系统用来实时了解应用程序的健康状态,也可以用于流量路由和负载均衡。通过健康检查,运维人员可以及时发现并处理潜在的问题,确保应用程序的稳定运行。
ASP.NET Core 健康检查基础配置
在 ASP.NET Core 中,配置健康检查非常简单。你只需要注册健康检查服务并映射一个端点即可。
以下是一个基础配置的示例:
$$$var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();
var app = builder.Build();
app.MapHealthChecks("/healthz");
app.Run();
$$$
默认情况下,如果没有配置具体的健康检查,该端点将返回一个简单的健康响应,状态码为 200 OK,内容为纯文本。
自定义健康检查
虽然 ASP.NET Core 提供了一些内置的健康检查,但你可能需要根据自己的需求创建自定义的健康检查。为此,你需要实现 IHealthCheck
接口。
以下是一个自定义健康检查的示例:
$$$public class MyHealthCheck : IHealthCheck
{
public Task
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
bool healthy = true; // 这里可以添加你的检查逻辑
if (healthy)return Task.FromResult(HealthCheckResult.Healthy("The API is healthy"));return Task.FromResult(HealthCheckResult.Unhealthy("The API is unhealthy"));
}
}
$$$
注册自定义健康检查也非常简单:
$$$builder.Services
.AddHealthChecks()
.AddCheck
$$$
集成 Entity Framework
如果你的应用程序使用了 Entity Framework,你不需要编写自定义的健康检查来检测数据库连接。你可以通过添加 Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore
NuGet 包来实现这一点。
然后,注册数据库上下文的健康检查:
$$$builder.Services
.AddHealthChecks()
.AddCheck
.AddDbContextCheck
$$$
默认情况下,数据库健康检查会调用 EF 的 CanConnectAsync
方法。你可以通过 AddDbContextCheck
方法的重载来更改这一行为。
如果数据库不可用,你将收到一个不健康的检查结果。
健康检查的状态与自定义
除了 “健康” 和 “不健康” 状态外,健康检查还提供了一个 “降级” 状态。你可以通过 AddCheck
和 AddDbContextCheck
方法的参数或自定义健康检查中的 HealthCheckResult
来更改状态。
以下是一个示例:
$$$builder.Services
.AddHealthChecks()
.AddCheck
.AddDbContextCheck
failureStatus: HealthStatus.Degraded);
$$$
高级配置
ASP.NET Core 的内置健康检查非常灵活。你可以自定义输出、失败状态和 HTTP 状态码。例如,你可以为不同的健康检查配置不同的端点,或者根据不同的环境配置不同的健康检查。
以下是一个高级配置的示例:
$$$var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks()
.AddCheck
.AddDbContextCheck
failureStatus: HealthStatus.Degraded);
var app = builder.Build();
app.MapHealthChecks("/healthz", new HealthCheckOptions
{
ResponseWriter = async (context, report) =>
{
context.Response.ContentType = "application/json";
var response = new
{
status = report.Status.ToString(),
checks = report.Entries.Select(entry => new
{
name = entry.Key,
status = entry.Value.Status.ToString(),
description = entry.Value.Description
})
};
await context.Response.WriteAsync(JsonConvert.SerializeObject(response));
}
});
app.Run();
$$$
总结
健康检查是应用程序运维的重要组成部分。通过本文的介绍,你应该已经了解了如何在 ASP.NET Core 中配置和使用健康检查。无论你的应用程序是否已经使用了健康检查,现在都是一个开始的好时机。希望这个简单的教程能够帮助你更好地监控和管理你的应用程序。