news 2026/6/13 10:59:42

.NET Core Web 中的健康检查端点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.NET Core Web 中的健康检查端点

.NET Core Web 中的健康检查端点

文章目录

  • .NET Core Web 中的健康检查端点
    • 概述
    • 核心概念
      • 1. 健康状况状态
      • 2. 主要组件
    • 基本配置
      • 1. 添加健康检查服务
      • 2. 配置端点路由
    • 创建自定义健康检查
      • 实现 IHealthCheck 接口
    • 常用内置健康检查
      • 1. 数据库健康检查
      • 2. URL 健康检查
      • 3. 内存检查
    • 高级配置选项
      • 1. 分组和过滤
      • 2. 自定义响应格式
      • 3. 延迟启动和超时设置
    • Kubernetes 集成示例
      • 1. Pod 配置
      • 2. 应用程序配置
    • 健康检查 UI
      • 1. 安装包
      • 2. 配置
    • 最佳实践
      • 1. 分离检查类型
      • 2. 设置适当的超时
      • 3. 避免昂贵的操作
      • 4. 安全性考虑
    • 监控和警报
      • 1. 集成 Prometheus
      • 2. 集成 Application Insights
    • 示例:完整配置
    • 总结

概述

健康检查端点是 ASP.NET Core 提供的一种机制,用于监控应用程序的运行状况,通常用于容器编排(如Kubernetes)、负载均衡器和监控系统。它允许外部系统定期检查应用程序是否正常运行并能够处理请求。

核心概念

1. 健康状况状态

  • Healthy:应用程序正常运行
  • Degraded:应用程序运行但性能下降
  • Unhealthy:应用程序无法正常运行

2. 主要组件

  • IHealthCheck接口:定义健康检查逻辑
  • 健康检查中间件:处理健康检查请求
  • 健康检查服务:注册和管理检查项

基本配置

1. 添加健康检查服务

// Program.cs 或 Startup.cspublicvoidConfigureServices(IServiceCollectionservices){// 添加基本健康检查services.AddHealthChecks();// 或者添加自定义检查services.AddHealthChecks().AddCheck<DatabaseHealthCheck>("database").AddCheck<ExternalApiHealthCheck>("external_api",failureStatus:HealthStatus.Degraded);}

2. 配置端点路由

publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseRouting();app.UseEndpoints(endpoints=>{// 基本健康检查端点endpoints.MapHealthChecks("/health");// 带自定义配置的端点endpoints.MapHealthChecks("/health/detailed",newHealthCheckOptions{ResponseWriter=WriteResponse});});}

创建自定义健康检查

实现 IHealthCheck 接口

publicclassDatabaseHealthCheck:IHealthCheck{privatereadonlystring_connectionString;publicDatabaseHealthCheck(IConfigurationconfiguration){_connectionString=configuration.GetConnectionString("DefaultConnection");}publicasyncTask<HealthCheckResult>CheckHealthAsync(HealthCheckContextcontext,CancellationTokencancellationToken=default){try{usingvarconnection=newSqlConnection(_connectionString);awaitconnection.OpenAsync(cancellationToken);varcommand=connection.CreateCommand();command.CommandText="SELECT 1";awaitcommand.ExecuteScalarAsync(cancellationToken);returnHealthCheckResult.Healthy("数据库连接正常");}catch(Exceptionex){returnHealthCheckResult.Unhealthy("数据库连接失败",exception:ex);}}}

常用内置健康检查

1. 数据库健康检查

// 添加 NuGet 包:AspNetCore.HealthChecks.SqlServerservices.AddHealthChecks().AddSqlServer(connectionString:Configuration.GetConnectionString("DefaultConnection"),name:"SQL Server",failureStatus:HealthStatus.Unhealthy,tags:new[]{"database","sql"});

2. URL 健康检查

// 添加 NuGet 包:AspNetCore.HealthChecks.Urisservices.AddHealthChecks().AddUrlGroup(uri:newUri("https://api.example.com/health"),name:"外部API",failureStatus:HealthStatus.Degraded);

3. 内存检查

services.AddHealthChecks().AddPrivateMemoryHealthCheck(maximumMegabytes:1024,// 最大内存限制 1GBname:"内存使用量");

高级配置选项

1. 分组和过滤

app.UseEndpoints(endpoints=>{// 基本健康检查(仅包含标记为"ready"的检查)endpoints.MapHealthChecks("/health/ready",newHealthCheckOptions{Predicate=(check)=>check.Tags.Contains("ready")});// 详细健康检查(所有检查)endpoints.MapHealthChecks("/health/live",newHealthCheckOptions{Predicate=(_)=>true});});

2. 自定义响应格式

privatestaticTaskWriteResponse(HttpContextcontext,HealthReportresult){context.Response.ContentType="application/json";varresponse=new{status=result.Status.ToString(),totalDuration=result.TotalDuration.TotalSeconds.ToString("0:0.00"),checks=result.Entries.Select(e=>new{name=e.Key,status=e.Value.Status.ToString(),duration=e.Value.Duration.TotalSeconds.ToString("0:0.00"),description=e.Value.Description,exception=e.Value.Exception?.Message,data=e.Value.Data})};returncontext.Response.WriteAsync(JsonSerializer.Serialize(response));}

3. 延迟启动和超时设置

services.AddHealthChecks().AddCheck<StartupHealthCheck>("启动检查",failureStatus:HealthStatus.Degraded,tags:new[]{"ready"},timeout:TimeSpan.FromSeconds(30));

Kubernetes 集成示例

1. Pod 配置

apiVersion:v1kind:Podmetadata:name:aspnetcore-appspec:containers:-name:appimage:myapp:latestports:-containerPort:80livenessProbe:httpGet:path:/health/liveport:80initialDelaySeconds:10periodSeconds:5readinessProbe:httpGet:path:/health/readyport:80initialDelaySeconds:5periodSeconds:5

2. 应用程序配置

// 启动时检查services.AddHealthChecks().AddCheck<StartupProbe>("启动探针",tags:new[]{"startup"});// 存活检查services.AddHealthChecks().AddCheck<LivenessProbe>("存活探针",tags:new[]{"live"});// 就绪检查services.AddHealthChecks().AddCheck<ReadinessProbe>("就绪探针",tags:new[]{"ready"}).AddCheck<DatabaseHealthCheck>("数据库",tags:new[]{"ready"});

健康检查 UI

1. 安装包

dotnetaddpackage AspNetCore.HealthChecks.UI dotnetaddpackage AspNetCore.HealthChecks.UI.Client dotnetaddpackage AspNetCore.HealthChecks.UI.InMemory.Storage

2. 配置

publicvoidConfigureServices(IServiceCollectionservices){services.AddHealthChecks().AddSqlServer(connectionString).AddRedis(redisConnectionString);services.AddHealthChecksUI(settings=>{settings.AddHealthCheckEndpoint("API","/health");settings.SetEvaluationTimeInSeconds(30);// 每30秒检查一次settings.SetApiMaxActiveRequests(1);// 同时只允许一个请求}).AddInMemoryStorage();}publicvoidConfigure(IApplicationBuilderapp){app.UseRouting();app.UseEndpoints(endpoints=>{endpoints.MapHealthChecks("/health",newHealthCheckOptions{Predicate=_=>true,ResponseWriter=UIResponseWriter.WriteHealthCheckUIResponse});endpoints.MapHealthChecksUI();});}

最佳实践

1. 分离检查类型

// 存活检查:应用是否在运行endpoints.MapHealthChecks("/health/live",newHealthCheckOptions{Predicate=_=>false// 通常很轻量,甚至可以是空的});// 就绪检查:应用是否准备好处理请求endpoints.MapHealthChecks("/health/ready",newHealthCheckOptions{Predicate=check=>check.Tags.Contains("ready")});// 启动检查:应用是否完成初始化endpoints.MapHealthChecks("/health/startup",newHealthCheckOptions{Predicate=check=>check.Tags.Contains("startup")});

2. 设置适当的超时

services.AddHealthChecks().AddUrlGroup(newUri("http://external-service"),"external_service",timeout:TimeSpan.FromSeconds(3));// 快速失败

3. 避免昂贵的操作

publicclassLightweightHealthCheck:IHealthCheck{publicTask<HealthCheckResult>CheckHealthAsync(HealthCheckContextcontext,CancellationTokencancellationToken){// 避免复杂的数据库查询或外部API调用// 使用缓存结果或简单的ping操作returnTask.FromResult(HealthCheckResult.Healthy());}}

4. 安全性考虑

app.UseEndpoints(endpoints=>{endpoints.MapHealthChecks("/health",newHealthCheckOptions{ResponseWriter=WriteResponse}).RequireAuthorization();// 需要认证// 或者为监控系统提供公开端点endpoints.MapHealthChecks("/health/public");});

监控和警报

1. 集成 Prometheus

// 添加包:AspNetCore.HealthChecks.Prometheus.Metricsservices.AddHealthChecks().AddPrometheusGatewayPublisher("http://prometheus:9091","health_metrics",opts=>opts.ReportIntervalSeconds=30);

2. 集成 Application Insights

services.AddHealthChecks().AddApplicationInsightsPublisher(saveDetailedReport:true,instrumentationKey:Configuration["ApplicationInsights:InstrumentationKey"]);

示例:完整配置

// Program.csvarbuilder=WebApplication.CreateBuilder(args);// 添加健康检查服务builder.Services.AddHealthChecks().AddCheck<DatabaseHealthCheck>("database",tags:new[]{"ready","live"}).AddCheck<RedisHealthCheck>("cache",tags:new[]{"ready"}).AddCheck<StartupHealthCheck>("startup",tags:new[]{"startup"}).AddUrlGroup(newUri("https://payment.api"),"payment_api",tags:new[]{"ready"}).AddDiskStorageHealthCheck(s=>s.AddDrive("C:\\",1024))// 磁盘空间检查.AddProcessHealthCheck("sqlservr",p=>p.Length>0);// 进程检查// 配置健康检查UIbuilder.Services.AddHealthChecksUI(setup=>{setup.AddHealthCheckEndpoint("基本检查","/health");setup.AddHealthCheckEndpoint("就绪检查","/health/ready");setup.AddHealthCheckEndpoint("存活检查","/health/live");}).AddInMemoryStorage();varapp=builder.Build();// 配置端点app.MapHealthChecks("/health");app.MapHealthChecks("/health/ready",newHealthCheckOptions{Predicate=r=>r.Tags.Contains("ready")});app.MapHealthChecks("/health/live",newHealthCheckOptions{Predicate=r=>r.Tags.Contains("live"),ResponseWriter=WriteMinimalResponse});app.MapHealthChecksUI();app.Run();// 最小化响应staticTaskWriteMinimalResponse(HttpContextcontext,HealthReportreport){context.Response.ContentType="application/json";returncontext.Response.WriteAsync($"{{\"status\":\"{report.Status}\"}}");}

总结

健康检查端点是现代微服务架构中的重要组件,它:

  1. 提高可用性:通过快速发现并处理故障
  2. 支持自动恢复:容器编排系统可以根据健康检查自动重启服务
  3. 提供监控数据:为运维团队提供应用程序健康状况的实时视图
  4. 支持渐进式部署:确保新版本完全就绪后再接收流量

通过合理配置健康检查端点,可以显著提高系统的可靠性和可维护性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 3:23:27

码高教育课后在线小程序_教学 学习开题报告

目录码高教育课后在线小程序介绍开题报告核心内容总结项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作码高教育课后在线小程序介绍 码高教育课后在线小程序是一款专注于教学与学习的在线工具&#xff0c;旨…

作者头像 李华
网站建设 2026/6/10 13:57:20

计算机毕业设计springboot个人理财系统的设计与实现 基于SpringBoot的家庭资产管理系统的设计与实现 SpringBoot框架下的移动理财服务平台开发

计算机毕业设计springboot个人理财系统的设计与实现5rw65las &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着居民可支配收入持续增长与移动互联网技术的深度普及&#xff0…

作者头像 李华
网站建设 2026/6/10 19:02:26

网络资源下载完全攻略:从痛点到解决方案

网络资源下载完全攻略&#xff1a;从痛点到解决方案 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcode.com/GitHub_Trend…

作者头像 李华
网站建设 2026/6/9 22:45:54

设计心得——API和ABI以及ABI的兼容性

一、工程实践需求 在开发的工程实践中&#xff0c;经常会遇到这些情况&#xff0c;在升级了动态库或相关的程序后&#xff0c;项目整体就无法启动了。甚至可能在运行时&#xff0c;直接就崩溃了。而在互联网的应用中&#xff0c;更愿意使用热补丁&#xff0c;即在不停止整体服务…

作者头像 李华
网站建设 2026/6/13 9:00:34

横评后发现,AI论文平台千笔 VS WPS AI 更贴合继续教育需求!

随着人工智能技术的迅猛迭代与普及&#xff0c;AI辅助写作工具已逐步渗透到高校学术写作场景中&#xff0c;成为专科生、本科生、研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生&#xff0c;开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时…

作者头像 李华
网站建设 2026/6/7 15:11:38

显卡性能优化工具:DLSS版本管理效率提升指南

显卡性能优化工具&#xff1a;DLSS版本管理效率提升指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 作为一名游戏玩家&#xff0c;你是否遇到过这样的困境&#xff1a;新买的RTX显卡却因游戏厂商更新滞后&#xff…

作者头像 李华