asp.net core 健康检查
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.Healthy、HealthStatus.Degraded或HealthStatus.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 健康检查的更多相关文章
- EntityFramework Core健康检查
前言 .NET Core提供对应方法可进行健康检查,那么在EF Core中是否也提供了相应的方式呢?EF Core 2.2+(包含2.2)版本提供了针对上下文的健康检查,接下来我们直接利用.NET 5 ...
- [翻译] ASP.NET Core 2.2 正式版发布
本文为翻译,原文地址:https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/ 我(文章 ...
- 在.NET Core 中实现健康检查
.NET Core中提供了开箱即用的运行状况检查,首先,我将在.NET Core API应用程序中执行运行状况检查,接下来,我们将使用DbContext集成SQL Server或数据库的运行状况检查, ...
- 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。
我很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供! 如何获取? 您可以从.NET Core 2.2下载页面下载适用于您的开发机器和构建服务器的新.NET C ...
- ASP.NET Core + SaasKit + PostgreSQL + Citus 的多租户应用程序架构示例
在 确定分布策略 中, 我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改. 当前部分研究如何构建与 Citus 存储后端一起使用的多租户 ASP.NET 应用程序. http:/ ...
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core之跨平台的实时性 ...
- 微服务中的健康监测以及其在ASP.NET Core服务中实现运行状况检查
1 .什么是健康检查? 健康检查几乎就是名称暗示的.它是一种检查您的应用程序是否健康的方法.随着越来越多的应用程序转向微服务式架构,健康检查变得尤其重要(Health Check).虽然微服务架构有很 ...
- 给 asp.net core 写一个简单的健康检查
给 asp.net core 写一个简单的健康检查 Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供 ...
- ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
题外话 笔者有个习惯,就是在接触新的东西时,一定要先搞清楚新事物的基本概念和背景,对之有个相对全面的了解之后再开始进入实际的编码,这样做最主要的原因是尽量避免由于对新事物的认知误区导致更大的缺陷,Bu ...
随机推荐
- Common tasks that you can perform with the Groovy Script test step
https://support.smartbear.com/readyapi/docs/soapui/steps/groovy.html Get test case object To obtain ...
- Delegate,Action,Func,匿名方法,匿名委托,事件 (转载)
Delegate,Action,Func,匿名方法,匿名委托,事件 (转载) 一.委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本 ...
- rsync (转载)
rsync 编辑 rsync是类unix系统下的数据镜像备份工具——remote sync. 目录 1简介 2特性 3操作流程 ▪ 服务器端启动 ▪ 客户端同步 4安装 1简介编辑 rsy ...
- 【C++】c++中栈 队列 的应用
C++中提供了STL模板statck 在使用的时候更为方便 除了一般的队列外 还有STL更有双向队列可以使用 #include<deque> 声明:deque <type > ...
- 【Web】CSS实现绝对定位元素水平垂直居中
网页中常常需用让绝对定位元素水平垂直居中,下面介绍2种方法: 一 元素宽度未知 <!DOCTYPE html> <html lang="en"> <h ...
- unity的三种update
void FixedUpdate () 固定更新 void Update () 更新 void LateUpdate() 晚于更新 FixedUpdate () 和 Update () ...
- sql在最后一行添加合计
select nvl(sno,'合计') sno,sum(score) score from sc group by rollup(sno);
- 爬虫模块之selenium模块
一 模块的介绍 selenium模块最开始是一个自动化测试的工具,驱动浏览器完全模拟浏览器自动测试. from selenium import webdriver # 驱动浏览器 browser=we ...
- Codeforces gym 102062 简要题解
文章目录 A. Bob and BoB B. Vibranium Gift C. The Blood Moon D. Palindrome and Chocolate E. Jumpy Robot F ...
- Le Chapitre IX
Je crois qu'il profita, pour son évasion[evazjɔ̃]逃跑, d'une migration d'oiseaux sauvages[sovaʒ]未驯化的. ...