0

0

c# 如何在 ASP.NET Core 中实现健康检查端点来监控并发服务

星降

星降

发布时间:2026-01-07 08:20:57

|

489人浏览过

|

来源于php中文网

原创

健康检查端点需显式注册AddHealthChecks()并启用UseHealthChecks中间件,否则/health返回404或500;并发监控须自定义检查逻辑,推荐用Degraded标识过载,生产环境须配置ResponseWriter过滤敏感信息并禁用异常详情。

c# 如何在 asp.net core 中实现健康检查端点来监控并发服务

健康检查端点必须注册 AddHealthChecks() 且启用中间件

ASP.NET Core 健康检查不是开箱即用的,漏掉任一环节都会导致 /health 返回 404 或 500。你需要显式注册服务并挂载中间件:

  • Program.cs 中调用 builder.Services.AddHealthChecks() —— 否则所有检查器(包括内置的)都不会被注入
  • app.UseHealthChecks("/health") 之前,不能有 app.UseRouting() 之后的其他终结点(如 app.MapControllers())提前拦截请求
  • 若使用 UseEndpoints(旧版),需确保 endpoints.MapHealthChecksMapControllers 之前

并发服务检查要用 AddCheck() 自定义逻辑,不能只依赖 AddSqlServer() 等内置检查

内置检查(如数据库、Redis)只验证连接通断,不反映服务当前并发压力。要监控“并发服务能力”,得自己写检查逻辑,比如:

  • 检查线程池队列长度是否超过阈值:ThreadPool.GetAvailableThreads(out _, out int availableIO)
  • 统计当前正在处理的 HTTP 请求数量(需配合 IHttpContextAccessor 和线程安全计数器)
  • 读取自定义指标(如通过 IMemoryCache 缓存的最近 10 秒请求数)
  • 注意:检查函数必须是同步或返回 Task,且不能阻塞太长(默认超时 30 秒,可通过 timeout 参数调整)
builder.Services.AddHealthChecks()
    .AddCheck("concurrent-requests", async (ctx, ct) =>
    {
        var current = Interlocked.Read(ref _activeRequestCount);
        if (current > 200)
            return HealthCheckResult.Unhealthy($"Too many active requests: {current}");
        return HealthCheckResult.Healthy();
    });

HealthCheckResult.Degraded()Unhealthy() 更适合并发过载场景

当并发接近瓶颈但尚未崩溃时,返回 Degraded 能让上游负载均衡器(如 Kubernetes、Nginx)触发告警或限流,而不是直接摘除实例:

Cursor Directory
Cursor Directory

专为Cursor设计的开源资源库、提示词库

下载
  • Unhealthy 通常触发实例下线,可能加剧剩余节点压力
  • Degraded 保留服务入口,但标记为“能力下降”,适合用于熔断前的缓冲信号
  • Kubernetes 的 livenessProbe 默认只认 Healthy/Unhealthy;若要用 Degraded,需配 startupProbe 或自定义探针解析响应体中的 status 字段
  • 响应体默认是 JSON,包含 statusHealth / Unhealthy / Degraded)、results 和耗时,无需额外序列化

生产环境必须配置 ResponseWriter 并限制暴露敏感信息

默认响应会输出所有检查项的详细异常堆(如果检查失败),这属于信息泄露风险:

  • 禁用详细错误:设置 includeExceptionDetails: false(开发环境可设为 true
  • 自定义响应体:用 responseWriter 参数过滤字段,例如只返回 status 和检查名,隐藏 dataexception
  • 避免在检查中记录日志到控制台或文件——健康检查可能每秒被调用多次,容易打爆 I/O
  • 不要在检查逻辑里调用外部 API(如调第三方鉴权服务),否则健康端点本身就成了故障放大器
app.UseHealthChecks("/health", new HealthCheckOptions
{
    ResponseWriter = async (ctx, result) =>
    {
        ctx.Response.ContentType = "application/json";
        var json = JsonSerializer.Serialize(new
        {
            status = result.Status.ToString(),
            checks = result.Entries.ToDictionary(
                e => e.Key,
                e => new { e.Value.Status, e.Value.Duration })
        });
        await ctx.Response.WriteAsync(json, Encoding.UTF8);
    },
    IncludeExceptionDetails = false
});
并发健康检查真正难的不是写代码,而是定义“过载”的业务含义——是 CPU > 90%?还是请求排队超 500ms?还是某个关键资源(如连接池)剩余不足 10%?这些阈值必须和你的服务 SLA 对齐,而不是拍脑袋定。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

229

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

493

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

498

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3505

2024.08.07

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

175

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

212

2025.12.18

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.2万人学习

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

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