.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. 应用程序配置健康检查 UI1. 安装包2. 配置最佳实践1. 分离检查类型2. 设置适当的超时3. 避免昂贵的操作4. 安全性考虑监控和警报1. 集成 Prometheus2. 集成 Application Insights示例完整配置总结概述健康检查端点是 ASP.NET Core 提供的一种机制用于监控应用程序的运行状况通常用于容器编排如Kubernetes、负载均衡器和监控系统。它允许外部系统定期检查应用程序是否正常运行并能够处理请求。核心概念1. 健康状况状态Healthy应用程序正常运行Degraded应用程序运行但性能下降Unhealthy应用程序无法正常运行2. 主要组件IHealthCheck接口定义健康检查逻辑健康检查中间件处理健康检查请求健康检查服务注册和管理检查项基本配置1. 添加健康检查服务// Program.cs 或 Startup.cspublicvoidConfigureServices(IServiceCollectionservices){// 添加基本健康检查services.AddHealthChecks();// 或者添加自定义检查services.AddHealthChecks().AddCheckDatabaseHealthCheck(database).AddCheckExternalApiHealthCheck(external_api,failureStatus:HealthStatus.Degraded);}2. 配置端点路由publicvoidConfigure(IApplicationBuilderapp,IWebHostEnvironmentenv){app.UseRouting();app.UseEndpoints(endpoints{// 基本健康检查端点endpoints.MapHealthChecks(/health);// 带自定义配置的端点endpoints.MapHealthChecks(/health/detailed,newHealthCheckOptions{ResponseWriterWriteResponse});});}创建自定义健康检查实现 IHealthCheck 接口publicclassDatabaseHealthCheck:IHealthCheck{privatereadonlystring_connectionString;publicDatabaseHealthCheck(IConfigurationconfiguration){_connectionStringconfiguration.GetConnectionString(DefaultConnection);}publicasyncTaskHealthCheckResultCheckHealthAsync(HealthCheckContextcontext,CancellationTokencancellationTokendefault){try{usingvarconnectionnewSqlConnection(_connectionString);awaitconnection.OpenAsync(cancellationToken);varcommandconnection.CreateCommand();command.CommandTextSELECT 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.ContentTypeapplication/json;varresponsenew{statusresult.Status.ToString(),totalDurationresult.TotalDuration.TotalSeconds.ToString(0:0.00),checksresult.Entries.Select(enew{namee.Key,statuse.Value.Status.ToString(),duratione.Value.Duration.TotalSeconds.ToString(0:0.00),descriptione.Value.Description,exceptione.Value.Exception?.Message,datae.Value.Data})};returncontext.Response.WriteAsync(JsonSerializer.Serialize(response));}3. 延迟启动和超时设置services.AddHealthChecks().AddCheckStartupHealthCheck(启动检查,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:52. 应用程序配置// 启动时检查services.AddHealthChecks().AddCheckStartupProbe(启动探针,tags:new[]{startup});// 存活检查services.AddHealthChecks().AddCheckLivenessProbe(存活探针,tags:new[]{live});// 就绪检查services.AddHealthChecks().AddCheckReadinessProbe(就绪探针,tags:new[]{ready}).AddCheckDatabaseHealthCheck(数据库,tags:new[]{ready});健康检查 UI1. 安装包dotnetaddpackage AspNetCore.HealthChecks.UI dotnetaddpackage AspNetCore.HealthChecks.UI.Client dotnetaddpackage AspNetCore.HealthChecks.UI.InMemory.Storage2. 配置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,ResponseWriterUIResponseWriter.WriteHealthCheckUIResponse});endpoints.MapHealthChecksUI();});}最佳实践1. 分离检查类型// 存活检查应用是否在运行endpoints.MapHealthChecks(/health/live,newHealthCheckOptions{Predicate_false// 通常很轻量甚至可以是空的});// 就绪检查应用是否准备好处理请求endpoints.MapHealthChecks(/health/ready,newHealthCheckOptions{Predicatecheckcheck.Tags.Contains(ready)});// 启动检查应用是否完成初始化endpoints.MapHealthChecks(/health/startup,newHealthCheckOptions{Predicatecheckcheck.Tags.Contains(startup)});2. 设置适当的超时services.AddHealthChecks().AddUrlGroup(newUri(http://external-service),external_service,timeout:TimeSpan.FromSeconds(3));// 快速失败3. 避免昂贵的操作publicclassLightweightHealthCheck:IHealthCheck{publicTaskHealthCheckResultCheckHealthAsync(HealthCheckContextcontext,CancellationTokencancellationToken){// 避免复杂的数据库查询或外部API调用// 使用缓存结果或简单的ping操作returnTask.FromResult(HealthCheckResult.Healthy());}}4. 安全性考虑app.UseEndpoints(endpoints{endpoints.MapHealthChecks(/health,newHealthCheckOptions{ResponseWriterWriteResponse}).RequireAuthorization();// 需要认证// 或者为监控系统提供公开端点endpoints.MapHealthChecks(/health/public);});监控和警报1. 集成 Prometheus// 添加包AspNetCore.HealthChecks.Prometheus.Metricsservices.AddHealthChecks().AddPrometheusGatewayPublisher(http://prometheus:9091,health_metrics,optsopts.ReportIntervalSeconds30);2. 集成 Application Insightsservices.AddHealthChecks().AddApplicationInsightsPublisher(saveDetailedReport:true,instrumentationKey:Configuration[ApplicationInsights:InstrumentationKey]);示例完整配置// Program.csvarbuilderWebApplication.CreateBuilder(args);// 添加健康检查服务builder.Services.AddHealthChecks().AddCheckDatabaseHealthCheck(database,tags:new[]{ready,live}).AddCheckRedisHealthCheck(cache,tags:new[]{ready}).AddCheckStartupHealthCheck(startup,tags:new[]{startup}).AddUrlGroup(newUri(https://payment.api),payment_api,tags:new[]{ready}).AddDiskStorageHealthCheck(ss.AddDrive(C:\\,1024))// 磁盘空间检查.AddProcessHealthCheck(sqlservr,pp.Length0);// 进程检查// 配置健康检查UIbuilder.Services.AddHealthChecksUI(setup{setup.AddHealthCheckEndpoint(基本检查,/health);setup.AddHealthCheckEndpoint(就绪检查,/health/ready);setup.AddHealthCheckEndpoint(存活检查,/health/live);}).AddInMemoryStorage();varappbuilder.Build();// 配置端点app.MapHealthChecks(/health);app.MapHealthChecks(/health/ready,newHealthCheckOptions{Predicaterr.Tags.Contains(ready)});app.MapHealthChecks(/health/live,newHealthCheckOptions{Predicaterr.Tags.Contains(live),ResponseWriterWriteMinimalResponse});app.MapHealthChecksUI();app.Run();// 最小化响应staticTaskWriteMinimalResponse(HttpContextcontext,HealthReportreport){context.Response.ContentTypeapplication/json;returncontext.Response.WriteAsync(${{\status\:\{report.Status}\}});}总结健康检查端点是现代微服务架构中的重要组件它提高可用性通过快速发现并处理故障支持自动恢复容器编排系统可以根据健康检查自动重启服务提供监控数据为运维团队提供应用程序健康状况的实时视图支持渐进式部署确保新版本完全就绪后再接收流量通过合理配置健康检查端点可以显著提高系统的可靠性和可维护性。

相关新闻

AI核心知识80——大语言模型之Slow Thinking和Deep Reasoning(简洁且通俗易懂版)

AI核心知识80——大语言模型之Slow Thinking和Deep Reasoning(简洁且通俗易懂版)

慢思考 (Slow Thinking) 和 深度推理 (Deep Reasoning) 是 2024 年以 OpenAI o1 和 DeepSeek-R1 为代表的新一代大模型所引入的核心概念。 这一概念标志着 AI 从“靠直觉反应” 的时代,进入了“靠逻辑推导” 的时代。 简单来说:以前的模型是“脱口而出…

2026/7/6 1:44:37 阅读更多 →
图灵奖大佬来听课,竟然只能坐地板!谷歌扫地僧有多离谱?

图灵奖大佬来听课,竟然只能坐地板!谷歌扫地僧有多离谱?

明明离谱到像假话,技术圈却越传越上头!一组被整理进GitHub仓库、在技术圈广泛流传的梗图/段子合集「Jeff Dean Facts」把技术圈玩成了造神现场。技术圈也盛行「造神」运动。只不过不是靠红毯和奖杯,而是靠玩梗:当Jeff Dean在提交代…

2026/7/3 4:31:22 阅读更多 →
定稿前必看!8个AI论文网站测评:本科生毕业论文写作必备工具推荐

定稿前必看!8个AI论文网站测评:本科生毕业论文写作必备工具推荐

在当前学术写作日益依赖智能化工具的背景下,本科生在毕业论文撰写过程中面临选题困难、文献整理繁琐、格式规范不熟等多重挑战。为了帮助学生高效完成论文,我们基于2026年的实测数据与真实用户反馈,对市面上主流的AI论文工具进行了系统性测评…

2026/7/5 5:15:10 阅读更多 →

最新新闻

揭秘gh_mirrors/presentations170/presentations:探索JavaScript组合子的强大世界

揭秘gh_mirrors/presentations170/presentations:探索JavaScript组合子的强大世界

揭秘gh_mirrors/presentations170/presentations:探索JavaScript组合子的强大世界 【免费下载链接】presentations Conference Talks and Proposals 项目地址: https://gitcode.com/gh_mirrors/presentations170/presentations 在软件开发领域,Ja…

2026/7/6 20:27:45 阅读更多 →
如何快速配置yazi:打造高效终端文件管理环境的完整指南

如何快速配置yazi:打造高效终端文件管理环境的完整指南

如何快速配置yazi:打造高效终端文件管理环境的完整指南 【免费下载链接】yazi 💥 Blazing fast terminal file manager written in Rust, based on async I/O. 项目地址: https://gitcode.com/GitHub_Trending/ya/yazi 你是不是还在为终端文件管理…

2026/7/6 20:27:45 阅读更多 →
kkFileView国产化环境中JDK版本选择策略:如何实现最佳兼容性与性能平衡

kkFileView国产化环境中JDK版本选择策略:如何实现最佳兼容性与性能平衡

kkFileView国产化环境中JDK版本选择策略:如何实现最佳兼容性与性能平衡 【免费下载链接】kkFileView Universal File Online Preview Project based on Spring-Boot 项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView kkFileView作为基于Spring-…

2026/7/6 20:25:33 阅读更多 →
Nova视觉小说框架完整指南:程序员构建交互式叙事游戏的终极工具

Nova视觉小说框架完整指南:程序员构建交互式叙事游戏的终极工具

Nova视觉小说框架完整指南:程序员构建交互式叙事游戏的终极工具 【免费下载链接】Nova Programmer-friendly framework for visual novels (VN) / text-based adventure games (AVG) on Unity 项目地址: https://gitcode.com/gh_mirrors/nova1/Nova Nova是一…

2026/7/6 20:25:33 阅读更多 →
WezTerm:重新定义现代终端体验的GPU加速神器

WezTerm:重新定义现代终端体验的GPU加速神器

WezTerm:重新定义现代终端体验的GPU加速神器 【免费下载链接】wezterm A GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust 项目地址: https://gitcode.com/GitHub_Trending/we/wezterm 在开发者日…

2026/7/6 20:25:33 阅读更多 →
6DoF运动追踪技术:IIM-42652与PIC18F46K80的嵌入式实现

6DoF运动追踪技术:IIM-42652与PIC18F46K80的嵌入式实现

1. 从3D到6DoF:运动追踪的技术跃迁在嵌入式系统开发领域,运动追踪技术正经历着从基础3D感知到完整6自由度(6DoF)定位的进化。IIM-42652作为TDK InvenSense推出的新一代6轴IMU(惯性测量单元),配合PIC18F46K80微控制器的…

2026/7/6 20:23:32 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻