0

0

ASP.NET Core中的健康检查端点是什么?如何创建?

幻夢星雲

幻夢星雲

发布时间:2025-11-06 15:49:02

|

877人浏览过

|

来源于php中文网

原创

答案:ASP.NET Core健康检查通过暴露HTTP接口监控应用及依赖状态,支持Liveness和Readiness检查,助力微服务在Kubernetes等平台实现自动恢复与流量管理,提升系统稳定性与故障排查效率。

asp.net core中的健康检查端点是什么?如何创建?

ASP.NET Core中的健康检查端点,简单来说,就是一个应用程序对外暴露的特殊HTTP接口,它允许外部系统(比如负载均衡器、容器编排平台如Kubernetes)以编程方式查询应用程序的运行状态。这不仅仅是判断程序是否崩溃,更可以深入检查它所依赖的数据库、外部服务、消息队列等关键组件是否正常工作。创建它通常涉及在应用程序启动配置中添加健康检查服务和相应的中间件,并定义具体的检查逻辑。

解决方案

在ASP.NET Core中创建健康检查端点,核心步骤是在Program.cs(或旧版Startup.cs)中配置服务和中间件。

首先,你需要安装必要的NuGet包。对于基本的健康检查,Microsoft.Extensions.Diagnostics.HealthChecksMicrosoft.AspNetCore.Diagnostics.HealthChecks 通常是内置的或随SDK提供。如果你想集成UI显示或更丰富的检查项,可能需要 AspNetCore.HealthChecks.UI.ClientAspNetCore.HealthChecks.UIMiddleware

以下是一个在Program.cs中配置健康检查的示例:

using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using System.Threading;
using System.Threading.Tasks;

var builder = WebApplication.CreateBuilder(args);

// 注册健康检查服务
builder.Services.AddHealthChecks()
    // 添加一个简单的“存活”检查,只判断应用程序是否还在运行
    .AddCheck("self_check", () => HealthCheckResult.Healthy("Application is alive."), new[] { "liveness" })
    // 添加一个自定义的“就绪”检查,例如检查某个外部API是否可达
    .AddCheck("external_api_check", tags: new[] { "readiness" })
    // 假设你有一个SQL Server数据库,可以这样添加
    // .AddSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"),
    //               name: "sql_db_check",
    //               failureStatus: HealthStatus.Degraded, // 如果失败,状态为降级
    //               tags: new[] { "readiness", "database" });
    ;

var app = builder.Build();

// 配置健康检查中间件
// 存活度检查端点:/health/liveness
app.MapHealthChecks("/health/liveness", new HealthCheckOptions
{
    Predicate = healthCheck => healthCheck.Tags.Contains("liveness"), // 仅检查带有"liveness"标签的健康项
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse // 需要安装 AspNetCore.HealthChecks.UI.Client 包
});

// 就绪度检查端点:/health/readiness
app.MapHealthChecks("/health/readiness", new HealthCheckOptions
{
    Predicate = healthCheck => healthCheck.Tags.Contains("readiness"), // 仅检查带有"readiness"标签的健康项
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

// 默认的健康检查端点,检查所有注册的健康项
app.MapHealthChecks("/health");

app.Run();

// 示例:一个自定义的健康检查类
public class ExternalApiHealthCheck : IHealthCheck
{
    private readonly ILogger _logger;

    public ExternalApiHealthCheck(ILogger logger)
    {
        _logger = logger;
    }

    public async Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        // 模拟调用一个外部API,判断其可用性
        try
        {
            // 实际中会使用HttpClient或其他方式调用外部API
            await Task.Delay(100, cancellationToken); // 模拟网络延迟
            bool isApiHealthy = true; // 假设API正常

            if (isApiHealthy)
            {
                _logger.LogInformation("External API check passed.");
                return HealthCheckResult.Healthy("External API is reachable.");
            }
            else
            {
                _logger.LogWarning("External API check failed.");
                return HealthCheckResult.Unhealthy("External API is not responding.");
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error checking external API health.");
            return HealthCheckResult.Unhealthy("Error checking external API.", ex);
        }
    }
}

为什么健康检查在微服务架构中如此关键?

在微服务架构中,健康检查简直是基础设施级别的存在,它不仅仅是锦上添花,更是整个系统稳定运行的基石。我个人觉得,它解决的核心问题是“谁来告诉我这个服务还能不能用?”

首先,服务发现与负载均衡离不开它。想象一下,你有十个相同的服务实例跑在不同的机器上,负载均衡器怎么知道该把请求发给哪个?如果某个实例因为内存泄漏或者数据库连接池耗尽而变得“假死”,它虽然还在运行,但已经无法处理请求了。这时,健康检查就能及时发现这个问题,并告诉负载均衡器:“别再往这儿发请求了,它病了。”这样,流量会被自动导向健康的实例,避免用户遇到超时或错误。

其次,对于容器编排系统(比如Kubernetes),健康检查是其自我修复能力的关键。一个Pod如果Liveness检查失败,Kubernetes会果断地重启它,试图让它恢复正常。如果Readiness检查失败,Kubernetes会暂时将它从服务网格中移除,直到它准备就绪,这对于确保新部署的服务不会在尚未完全启动时就接收到流量至关重要。我记得有一次,我们一个微服务因为某个第三方API偶尔超时,导致整个实例变得“假死”。如果没有细粒度的健康检查,负载均衡器会一直把流量导过去,用户体验极差。引入了健康检查后,一旦那个第三方API响应慢,服务实例就会被标记为不健康,流量自然就被切走了,虽然影响了一部分实例,但至少保证了整体服务的可用性。这比整个系统崩溃要好太多了。

最后,它也是快速故障定位的利器。当系统出现问题时,运维人员可以通过健康检查端点的状态,迅速判断是应用程序本身的问题,还是数据库、消息队列、外部API等依赖服务出了状况,大大缩短了故障排查时间。

区分“存活度检查”(Liveness)和“就绪度检查”(Readiness)的实际意义是什么?

我发现很多人刚接触容器编排,尤其是Kubernetes时,会把Liveness和Readiness这两个概念混淆,或者干脆只用一个。但实际上,它们的用途和背后的逻辑是截然不同的,理解并正确使用它们,能让你的微服务更健壮、更智能。

存活度检查(Liveness Check),顾名思义,是检查应用程序是否“活着”,是否还在正常运行。它的目的是判断应用程序是否已经陷入死锁、无限循环或其他无法恢复的状态。如果Liveness检查失败,Kubernetes会认为这个容器已经“死亡”或“失能”,并会采取重启操作,试图让它恢复到健康状态。可以把它想象成医生的心跳监测,只要有心跳,就认为病人还活着。例如,一个Web服务器可能还在运行,但所有线程都卡死了,Liveness检查就应该失败。

模力视频
模力视频

模力视频 - AIGC视频制作平台 | AI剪辑 | 云剪辑 | 海量模板

下载

就绪度检查(Readiness Check),则更关注应用程序是否“准备好”接收流量。一个应用程序可能已经“活着”了,但它可能正在启动、加载配置、预热缓存、连接数据库,或者等待某些关键的外部依赖完全就绪。在这些过程中,它虽然没有“死”,但还没有能力处理用户请求。如果Readiness检查失败,Kubernetes会暂时停止向该Pod发送流量,直到它报告自己已经“就绪”。这对于避免流量被发送到尚未完全启动或尚未准备好处理请求的服务实例至关重要。可以想象成一个商店,虽然老板已经到店了(Liveness),但还没开门,商品还没摆好(Readiness),这时候是不能接待顾客的。

一个典型的场景是,服务启动时需要初始化大量数据,或者预热缓存,这时候Liveness是健康的(因为程序在运行),但Readiness应该是不健康的,直到所有初始化完成。我们曾经因为没有正确区分这两种检查,导致新部署的服务在启动过程中就接收到大量请求,结果不是超时就是500错误,用户体验一塌糊涂。正确区分Liveness和Readiness,就像给你的服务穿上了一层智能的“保护衣”,确保它只在最佳状态下服务用户。

如何扩展ASP.NET Core健康检查以监控自定义或复杂依赖?

ASP.NET Core的健康检查机制设计得非常灵活,它提供了一个IHealthCheck接口,允许我们几乎无限地扩展,去监控任何自定义的或复杂的依赖。这对于那些非标准、内部系统或者一些“奇葩”的外部服务来说,简直是救命稻草。

核心在于实现 IHealthCheck 接口。这个接口只有一个方法:Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)。你可以在这个方法里编写任何逻辑来检查你的依赖项。

例如,如果你需要检查一个内部消息队列的连接状态,或者某个文件共享路径是否可访问,甚至是一个老旧的、没有标准API的遗留系统(比如通过检查特定文件的时间戳来判断其活跃度),都可以通过实现这个接口来完成。

CheckHealthAsync 方法中,你需要:

  1. 执行检查逻辑: 这可能涉及异步操作,比如调用外部API、查询数据库、连接消息队列、检查文件系统、甚至执行一些自定义的业务逻辑。
  2. 返回结果: 根据检查结果返回 HealthCheckResult.Healthy()HealthCheckResult.Unhealthy()HealthCheckResult.Degraded()
    • Healthy:一切正常。
    • Unhealthy:依赖项出现严重问题,服务可能无法正常工作。
    • Degraded:依赖项存在问题,但服务仍能部分工作(例如,某个次要功能受影响)。这个状态对于那些“部分功能受损但还能用”的场景非常有用,它可以给运维人员一个预警,而不是直接标记为完全不健康。
  3. 提供详细信息: 可以在 HealthCheckResult 中包含描述信息、异常对象或自定义数据,这些信息在健康检查报告中会显示出来,方便排查问题。

我记得有一次在项目中,我们需要监控一个非常特殊的遗留系统,它没有标准API,只能通过FTP去检查某个文件的存在时间来判断其活跃度。这时候,IHealthCheck 就派上大用场了。我写了一个自定义检查,去连接FTP服务器,读取文件元数据,根据时间戳判断系统是否还在正常更新。这虽然有点“黑科技”,但它确实解决了问题,而且完美融入了ASP.NET Core的健康检查体系。这让我觉得,框架的扩展性真的很重要,它给了我们解决各种奇葩问题的能力。

当然,很多时候我们不需要从头写。社区已经有很多优秀的第三方健康检查库(比如 AspNetCore.HealthChecks.* 系列),它们提供了针对SQL Server、Redis、RabbitMQ、Kafka、Elasticsearch等常见依赖项的预构建检查,大大简化了开发工作。但在遇到非标准或特定业务逻辑时,自定义 IHealthCheck 接口就是你的终极武器。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

673

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

344

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1080

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

355

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

670

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

561

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

404

2024.04.29

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号