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

ASP.NET Core中的健康检查端点,简单来说,就是一个应用程序对外暴露的特殊HTTP接口,它允许外部系统(比如负载均衡器、容器编排平台如Kubernetes)以编程方式查询应用程序的运行状态。这不仅仅是判断程序是否崩溃,更可以深入检查它所依赖的数据库、外部服务、消息队列等关键组件是否正常工作。创建它通常涉及在应用程序启动配置中添加健康检查服务和相应的中间件,并定义具体的检查逻辑。
解决方案
在ASP.NET Core中创建健康检查端点,核心步骤是在Program.cs(或旧版Startup.cs)中配置服务和中间件。
首先,你需要安装必要的NuGet包。对于基本的健康检查,Microsoft.Extensions.Diagnostics.HealthChecks 和 Microsoft.AspNetCore.Diagnostics.HealthChecks 通常是内置的或随SDK提供。如果你想集成UI显示或更丰富的检查项,可能需要 AspNetCore.HealthChecks.UI.Client 或 AspNetCore.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<ExternalApiHealthCheck>("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<ExternalApiHealthCheck> _logger;
public ExternalApiHealthCheck(ILogger<ExternalApiHealthCheck> logger)
{
_logger = logger;
}
public async Task<HealthCheckResult> 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.Unhe
althy("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检查就应该失败。
刺鸟创客
一款专业高效稳定的AI内容创作平台
110
查看详情
就绪度检查(Readiness Check),则更关注应用程序是否“准备好”接收流量。一个应用程序可能已经“活着”了,但它可能正在启动、加载配置、预热缓存、连接数据库,或者等待某些关键的外部依赖完全就绪。在这些过程中,它虽然没有“死”,但还没有能力处理用户请求。如果Readiness检查失败,Kubernetes会暂时停止向该Pod发送流量,直到它报告自己已经“就绪”。这对于避免流量被发送到尚未完全启动或尚未准备好处理请求的服务实例至关重要。可以想象成一个商店,虽然老板已经到店了(Liveness),但还没开门,商品还没摆好(Readiness),这时候是不能接待顾客的。
一个典型的场景是,服务启动时需要初始化大量数据,或者预热缓存,这时候Liveness是健康的(因为程序在运行),但Readiness应该是不健康的,直到所有初始化完成。我们曾经因为没有正确区分这两种检查,导致新部署的服务在启动过程中就接收到大量请求,结果不是超时就是500错误,用户体验一塌糊涂。正确区分Liveness和Readiness,就像给你的服务穿上了一层智能的“保护衣”,确保它只在最佳状态下服务用户。
如何扩展ASP.NET Core健康检查以监控自定义或复杂依赖?
ASP.NET Core的健康检查机制设计得非常灵活,它提供了一个IHealthCheck接口,允许我们几乎无限地扩展,去监控任何自定义的或复杂的依赖。这对于那些非标准、内部系统或者一些“奇葩”的外部服务来说,简直是救命稻草。
核心在于实现 IHealthCheck 接口。这个接口只有一个方法:Task<healthcheckresult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)</healthcheckresult>。你可以在这个方法里编写任何逻辑来检查你的依赖项。
例如,如果你需要检查一个内部消息队列的连接状态,或者某个文件共享路径是否可访问,甚至是一个老旧的、没有标准API的遗留系统(比如通过检查特定文件的时间戳来判断其活跃度),都可以通过实现这个接口来完成。
在 CheckHealthAsync 方法中,你需要:
- 执行检查逻辑: 这可能涉及异步操作,比如调用外部API、查询数据库、连接消息队列、检查文件系统、甚至执行一些自定义的业务逻辑。
-
返回结果: 根据检查结果返回
HealthCheckResult.Healthy()、HealthCheckResult.Unhealthy()或HealthCheckResult.Degraded()。-
Healthy:一切正常。 -
Unhealthy:依赖项出现严重问题,服务可能无法正常工作。 -
Degraded:依赖项存在问题,但服务仍能部分工作(例如,某个次要功能受影响)。这个状态对于那些“部分功能受损但还能用”的场景非常有用,它可以给运维人员一个预警,而不是直接标记为完全不健康。
-
-
提供详细信息: 可以在
HealthCheckResult中包含描述信息、异常对象或自定义数据,这些信息在健康检查报告中会显示出来,方便排查问题。
我记得有一次在项目中,我们需要监控一个非常特殊的遗留系统,它没有标准API,只能通过FTP去检查某个文件的存在时间来判断其活跃度。这时候,IHealthCheck 就派上大用场了。我写了一个自定义检查,去连接FTP服务器,读取文件元数据,根据时间戳判断系统是否还在正常更新。这虽然有点“黑科技”,但它确实解决了问题,而且完美融入了ASP.NET Core的健康检查体系。这让我觉得,框架的扩展性真的很重要,它给了我们解决各种奇葩问题的能力。
当然,很多时候我们不需要从头写。社区已经有很多优秀的第三方健康检查库(比如 AspNetCore.HealthChecks.* 系列),它们提供了针对SQL Server、Redis、RabbitMQ、Kafka、Elasticsearch等常见依赖项的预构建检查,大大简化了开发工作。但在遇到非标准或特定业务逻辑时,自定义 IHealthCheck 接口就是你的终极武器。
以上就是ASP.NET Core中的健康检查端点是什么?如何创建?的详细内容,更多请关注其它相关文章!
# 不健康
# 岳塘区网站建设方案公示
# 南京seo排名服务
# 浏阳网站优化品牌
# 前端运维SEO
# 福建咨询网站建设代理商
# 潍坊网站建设与管理
# 服装网站建设心得感悟
# 周口网站建设开发公司
# 大连网站建设酷网科技
# 唐山滦县网站建设
# 可以通过
# 可用性
# 你有
# 还没
# 健康检查
# 是一个
# 还在
# 应用程序
# 均衡器
# 自定义
# .net
# sqlserver
# kubernetes
# 500错误
# microsoft
# ai
# app
# redis
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
Node.js中HTML按钮与J*aScript函数交互的正确姿势
J*aScript教程:根据元素文本内容动态设置背景色
深入理解与实现最大堆的Heapify过程:常见错误与修正
J*aScript打印功能_j*ascript输出控制
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】
CSS Grid如何控制元素对齐_align-items与justify-items组合使用
word中如何让数字纵向排列_Word数字纵向排列方法
高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
J*aScript生成器_j*ascript异步迭代
Archive of Our Own官网直达 AO3最新可用地址一览
浏览器打开即用 美图秀秀网页版入口
印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】
J*aScript中管理异步API调用:确保操作顺序与数据一致性
铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
PDF文件体积过大处理_PDF压缩技巧详解
qq邮箱日历功能怎么用_创建日程与会议邀请的技巧
qq游戏网页版直接玩_qq游戏免下载快速入口
PostgreSQL海量数据高效导入策略:Python与Django实践指南
Typer应用中灵活处理命令行参数的令牌化与解析
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
Angular中父组件异步更新子组件复选框状态的实践指南
ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接
在命令行怎么运行html项目_命令行运行html项目方法【教程】
AO3镜像入口大全 AO3网页版内容访问全集
文本文档写html代码怎么运行_文本文档html代码运行步骤【教程】
圆通快递查询实时追踪 圆通物流包裹状态快速查看
如何提高微信支付的安全性_微信支付安全防护与设置建议
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
J*a应用集成GitHub CLI与API认证指南
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
J*a中实现Go语言select通道多路复用机制
Surface怎么安装系统 微软Surface Pro U盘重装win11教程
CSS Box Model与弹性按钮:维持布局稳定的动画实践
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
zookeeper 都有哪些功能?
Yandex浏览器官方网页版入口 Yandex浏览器最新版官网
处理嵌套交互式控件:前端可访问性指南


2025-11-06
浏览次数:次
返回列表
althy("External API is not responding.");
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Error checking external API health.");
return HealthCheckResult.Unhealthy("Error checking external API.", ex);
}
}
}