asp.net core 健康检查

  • ASP.NET Core 2.2 开始,提供了健康检查中间件和库,用来报告应用基础结构组件的运行状况。官方文档在此

    运行状况检查由应用程序作为 HTTP 终结点公开。 可以为各种实时监视方案配置运行状况检查终结点:

    • 运行状况探测可以由容器业务流程协调程序和负载均衡器用于检查应用的状态。 例如,容器业务流程协调程序可以通过停止滚动部署或重新启动容器来响应失败的运行状况检查。 负载均衡器可以通过将流量从失败的实例路由到正常实例,来应对不正常的应用。
    • 可以监视内存、磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态。
    • 运行状况检查可以测试应用的依赖项(如数据库和外部服务终结点)以确认是否可用和正常工作。
  • 本文主要是介绍这个功能,记录基础用法,以及一些可能除了上述提到的其他场景

安装和运行

  • 引用 Microsoft.AspNetCore.App 元包或Microsoft.AspNetCore.Diagnostics.HealthChecks 包。
  • 配置
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health");
}
}
  • 运行后访问/health,将返回纯文本Healthy,状态枚举HealthStatus共三个:HealthStatus.HealthyHealthStatus.DegradedHealthStatus.Unhealthy 状态
  • 此基本配置注册运行健康检查服务,并对请求进行响应,默认不注册任何其他检查,所以只是简单的响应请求,代表应用正常

自定义检查项

  • 通过实现 IHealthCheck接口创建检查项
public class ExampleHealthCheck : IHealthCheck
{
public ExampleHealthCheck()
{
// 这里可以通过构造函数注入实现获取其他服务
} public Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default(CancellationToken))
{
// 执行健康检查,代码逻辑写在这里
// 这里定义检查结果为true
var healthCheckResultHealthy = true; if (healthCheckResultHealthy)
{
return Task.FromResult(
HealthCheckResult.Healthy("检查表明健康"));
} return Task.FromResult(
HealthCheckResult.Unhealthy("检查表明不健康"));
}
}
  • 注册
public void ConfigureServices(IServiceCollection services)
{
services.AddHealthChecks()
.AddCheck<ExampleHealthCheck>(
name: "example_health_check1",
failureStatus:HealthSus.Unhealthy,
tags: new[] { "example" }); // 或者这样
services.AddHealthChecks()
.AddCheck(
name: "example_health_check2",
check: ()=>HealthCheckResu.Healthy("ok123"),
tags: new[] { "example" });
}
  • 注册参数解释,name 就是检查项名称
  • failureStatus 指定检查结果是失败时响应的状态
  • tags 标签可用于后续筛选。目的是将此标签视为健康检查的消费者,用作健康检查的便捷分组和过滤机制
  • 如果指定了 check 参数则不必实现IHealthCheck接口,检查时调用改 check,因此 failureStatus 也不必指定

运行检查

  • 注册检查中间件,指定访问链接和检查配置

筛选检查

  • Predicate 委托会在遍历所有检查的时候被调用
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
// 过滤掉其他检查,只执行 Foo and Baz 检查
Predicate = (check) => check.Tags.Contains("foo_tag") ||
check.Tags.Contains("baz_tag")
}

自定义 HTTP 状态码

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
// 下面的状态信息是默认分配为HealthStatus属性,可以自定义不同的健康状态返回不同状态码
ResultStatusCodes =
{
[HealthStatus.Healthy] = StatusCodes.Status200OK,
[HealthStatus.Degraded] = StatusCodes.Status200OK,
[HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable
}
});
}

取消缓存头

  • 为了防止健康检查请求响应缓存,健康检查中间件将修改缓存标头,默认AllowCachingResponses为 false,不响应缓存
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHealthChecks("/health", new HealthCheckOptions()
{
// 默认为false
AllowCachingResponses = false
});
}

自定义输出

  • 默认响应是将检查结果状态HealthStatus直接输出成纯文本。这里可以自定义输出,封装统一的响应结果,并输出更多信息
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
ResponseWriter = WriteResponse
} private static Task WriteResponse(HttpContext httpContext,
HealthReport result)
{
httpContext.Response.ContentType = "application/json"; var json = new JObject(
new JProperty("status", result.Status.ToString()),
new JProperty("results", new JObject(result.Entries.Select(pair =>
new JProperty(pair.Key, new JObject(
new JProperty("status", pair.Value.Status.ToString()),
new JProperty("description", pair.Value.Description),
new JProperty("data", new JObject(pair.Value.Data.Select(
p => new JProperty(p.Key, p.Value))))))))));
return httpContext.Response.WriteAsync(
json.ToString(Formatting.Indented));
}

应用

  • 数据库探测,例子可以是执行select 1 from tableName根据数据库响应来判断是否健康
  • 单独的就绪情况和运行情况探测,在某些托管方案中,可能初始化是一个比较耗时的操作,应用正常运行,但是可能还不能正常处理请求并响应
  • 具有自定义响应编写器的基于指标的探测,比如检查内存占用是否超标,cpu 是否占用过高,连接数是否达到上限
  • 按端口筛选,指定端口,一般用于容器环境,根据容器启动时配置的端口号进行响应
  • 分发运行状况检查库,将检查接口实现独立一个类,并通过依赖注入获取参数,检查时根据参数编写逻辑
  • 检查发布服务器,如果向 DI 添加 IHealthCheckPublisher,则运行状态检查系统将定期执行状态检查,并使用结果调用 PublishAsync。适用于需要推送的健康系统,而不是健康系统主动发出健康检查的请求

相关阅读

总结

  • 虽然大部分内容都是官方文档内容,但是写完之后相当于整理了一遍。不仅理解了看文档时不理解的地方,也更进一步了解了它的使用场景。本来以为简单的用法,过了一遍就认为自己懂了会用了,但实际上只是浮于表面,很多地方不懂得为什么这么设计,每个参数都有什么用
  • 一个新的学习思路:先了解它的应用场景,解决了什么问题,再回过头来看,针对各种场景,功能都是怎么设计和实现的,最后看不同的需求都是怎么通过不同使用方式来满足的。

asp.net core 健康检查的更多相关文章

  1. EntityFramework Core健康检查

    前言 .NET Core提供对应方法可进行健康检查,那么在EF Core中是否也提供了相应的方式呢?EF Core 2.2+(包含2.2)版本提供了针对上下文的健康检查,接下来我们直接利用.NET 5 ...

  2. [翻译] ASP.NET Core 2.2 正式版发布

    本文为翻译,原文地址:https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/ 我(文章 ...

  3. 在.NET Core 中实现健康检查

    .NET Core中提供了开箱即用的运行状况检查,首先,我将在.NET Core API应用程序中执行运行状况检查,接下来,我们将使用DbContext集成SQL Server或数据库的运行状况检查, ...

  4. 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。

    我很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供! 如何获取? 您可以从.NET Core 2.2下载页面下载适用于您的开发机器和构建服务器的新.NET C ...

  5. ASP.NET Core + SaasKit + PostgreSQL + Citus 的多租户应用程序架构示例

    在 确定分布策略 中, 我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改. 当前部分研究如何构建与 Citus 存储后端一起使用的多租户 ASP.NET 应用程序. http:/ ...

  6. ASP.NET Core之跨平台的实时性能监控(2.健康检查)

    前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core之跨平台的实时性 ...

  7. 微服务中的健康监测以及其在ASP.NET Core服务中实现运行状况检查

    1 .什么是健康检查? 健康检查几乎就是名称暗示的.它是一种检查您的应用程序是否健康的方法.随着越来越多的应用程序转向微服务式架构,健康检查变得尤其重要(Health Check).虽然微服务架构有很 ...

  8. 给 asp.net core 写一个简单的健康检查

    给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...

  9. ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇

    题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...

随机推荐

  1. DNSlog盲注

    前言 在渗透测试中,经常遇到如下情景: 1,sql盲注 2,blind型ssrf以及xxe 3,无回显命令执行漏洞 ... dnslog盲注原理 开放的DNSlog平台: http://ceye.io ...

  2. pc-H5 适配方案

    一.介绍 在前端项目页面开发中,尤其是H5页面开发,我们常常要适配各种分辨率的屏幕,才能让用户获得最好的体验效果.pc也是如此,很多页面是一屏,也是要适配各种尺寸的分辨率.这时候我们就需要对各种分辨率 ...

  3. 常用jvm参数

    如果你是Eclipse ,可以通过 run -> Run Configurations->Arguments 添加-XX:+PrintGCDetails 打开gc日志 -Xmx 设置jav ...

  4. sqlserver 数据迁移

    转载地址: 1.https://blog.csdn.net/yh_zeng2/article/details/72901892 2.https://www.cnblogs.com/jpfss/p/91 ...

  5. 【转】C#异步的世界【上】

    [转]C#异步的世界[上] 新进阶的程序员可能对async.await用得比较多,却对之前的异步了解甚少.本人就是此类,因此打算回顾学习下异步的进化史. 本文主要是回顾async异步模式之前的异步,下 ...

  6. SLI的相关学习

    今天帮人安装前年的机皇-微星GT80S的操作系统,安装好后用鲁大师测试下跑分,发现双显卡和单显卡鲁大师的跑分竟然一样,就像副显卡根本没有工作,听主人所这台机器能跑到36万以上. 然后就苦逼的尝试,把B ...

  7. join和split 的使用

    var abc = new Array(a,b,c,d,e); abc.join('-') // 结果 : a-b-c-d-e-f var obk = 'a-b-c-d-e'; obk.split(' ...

  8. 学习devexpresschartControl控件

    devexpress官网chart:https://documentation.devexpress.com/WindowsForms/8117/Controls-and-Libraries/Char ...

  9. Clion 教程书写Hello World,C语言开发;Clion 的C语言开发

    一.编译器安装 二.项目搭建 1.新建项目 2.项目类型选择(双红圈是项目名称,可以修改) 3.点击create,自动生成项目. 4.运行项目

  10. UVa 11762 Race to 1 (数学期望 + 记忆化搜索)

    题意:给定一个整数 n ,然后你要把它变成 1,变换操作就是随机从小于等于 n 的素数中选一个p,如果这个数是 n 的约数,那么就可以变成 n/p,否则还是本身,问你把它变成 1 的数学期望是多少. ...