健康检查,检查啥,怎么检查?
在云原生时代,容器大多都提供了检查机制来探测服务的运行状态(异常自动重启,扩容等)。如果应用本身就提供一个健康检查的机制会更友好,更能真实的反映出应用的健康状态。
那么问题来了,健康检查具体检查啥?
现有的应用服务,大多依赖很多子系统,一些集成服务,例如数据库,缓存服务,文件系统,api、rpc等。 某一项子系统或服务失败,可能导致部分功能不可用。这时候,健康检查就可以精准定位到问题,配合k8s等容器编排工具,可以实现自动重启,扩容等操作。
接下来咱们介绍一下,.net core 的健康检查实现的两种方式,框架已内置,开箱即用。
一、简单方式
public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseEndpoints(endpoints => { endpoints.MapControllers(); // 可以自定义名称 endpoints.MapHealthChecks("/health"); }); }
代码修改完成后,请求 localhost/health地址会返回 如下

很简单是不是?就这?直接请求api 根据Http 状态码,我也能知道啊。 但是这也不符合咱们的需求啊,这能检查个啥,数据库,缓存服务,啥状态咱也看不出来啊。
别慌,接下来,咱们来看看进阶版,支持自定义检查逻辑的部分
二、支持之定义扩展检查逻辑
比如想检查数据库,中间件、状态是否正常,可以自定义检查逻辑
新建类 ApiHealthCheck,集成IHealthCheck 接口,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class ApiHealthCheck : IHealthCheck { public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default ) { //todo 可自定义逻辑,验证数据库连接是否正常 或 中间件,缓存服务是否正常 return HealthCheckResult.Healthy($ "API and Database is running." ); } } |
ApiHealthCheck逻辑写好后,在Startup 注入咱们的检查逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | public void ConfigureServices(IServiceCollection services) { services.AddHealthChecks() .AddCheck<ApiHealthCheck>( "apiHealth" ) //注入api检查,key叫 apiHealth .AddCheck<ApiHealthCheck>( "sqlHealth" ); //注入数据库检查,key叫 sqlHealth } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseHealthChecks( "/healthCheck" , //自定义检查路由,并输出信息 new HealthCheckOptions { ResponseWriter = WriteResponse }); } //输出健康检查信息 private static Task WriteResponse(HttpContext context, HealthReport healthReport) { context.Response.ContentType = "application/json" ; //简易报告 var result = JsonConvert.SerializeObject( new { code = context.Response.StatusCode, errors = healthReport.Entries.Select(e => new { key = e.Key, value = e.Value.Status.ToString() }) }); //var allHealthReport = JsonConvert.SerializeObject(healthReport); 完整的健康报告 return context.Response.WriteAsync(result); } |
代码完成后,输入自定义的健康检查路由 localhost/healthCheck 可以看到 上面定义的 api,sql 检查结果都出来了。(这里只是示例,具体逻辑可以自由发挥)
当然,我们也可以输出的健康检查报告,有兴趣的同学,可以自己跑下代码了解。
三、UI
一 般配合K8s 等容器编排工具, 会有更好的界面管理工具。 当然社区提供了 健康检查的UI 集成,咱们也可以了解一下
1 2 | Install-Package AspNetCore.HealthChecks.UI Install-Package AspNetCore.HealthChecks.UI.InMemory.Storage //DB服务,一定要安装,这里咱们安装一个最简单的内存模式。还支持各种数据库及存储服务 |
在StartUp 注入UI包
1 2 3 4 5 6 7 8 9 10 11 12 | public void ConfigureServices(IServiceCollection services) { services.AddHealthChecksUI(setup => { setup.DisableDatabaseMigrations(); }) .AddInMemoryStorage(); //使用内存缓存 } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHealthChecksUI(config => config.UIPath = "/hc-ui" ); } |
注意:网上很多文章没有配置UI的DB服务,直接运行会报错,具体看这个文档
appsetting.json 添加UI配置,(也可通过代码设置,具体看文档)
1 2 3 4 5 6 7 8 9 10 | "HealthChecksUI" : { "HealthChecks" : [ { "Name" : "healthCheck" , "Uri" : "https://localhost:9288/healthCheck" //这个地址要配置ssl证书,不然访问不了 } ], "EvaluationTimeinSeconds" : 10, "MinimumSecondsBetweenFailureNotifications" : 60 } |
输入 localhost/hc-ui , 可以看到已经跑起来了
作者:DanielYao
出处:https://www.cnblogs.com/DanielYao/p/15122361.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎大家关注我的微信公众号,新文章会优先发到公众号!
本文来自博客园,作者:打滚的姚先森,转载请注明原文链接:https://www.cnblogs.com/DanielYao/p/15122361.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异