如何在 ASP.Net Core 中实现 健康检查

健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态。

ASP.Net Core 中的 健康检查 落地做法是暴露一个可配置的 Http 端口,你可以使用 健康检查 去做一个最简单的活性检测,比如说:检查网络和系统的资源可用性,数据库资源是否可用,应用程序依赖的消息中间件或者 Azure cloud service 的可用性 等等,这篇文章我们就来讨论如何使用这个 健康检查中间件。

注册健康检查服务

要注册 健康检查 服务,需要在 Startup.ConfigureServices 下调用 AddHealthChecks 方法,然后使用 UseHealthChecks 将其注入到 Request Pipeline 管道中,如下代码所示:

public class Startup{// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();services.AddHealthChecks();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseHealthChecks("/health");app.UseStaticFiles();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});}}

上图的 /health 就是一个可供检查此 web 是否存活的暴露端口。

其他服务的健康检查

除了web的活性检查,还可以检查诸如:SQL Server, MySQL, MongoDB, Redis, RabbitMQ, Elasticsearch, Hangfire, Kafka, Oracle, Azure Storage 等一系列服务应用的活性,每一个服务需要引用相关的 nuget 包即可,如下图所示:

然后在 ConfigureServices 中添加相关服务即可,比如下面代码的 AddSqlServer

public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();services.AddHealthChecks().AddSqlServer("server=.;database=PYZ_L;Trusted_Connection=SSPI");}

自定义健康检查

除了上面的一些开源方案,还可以自定义实现 健康检查 类,比如自定义方式来检测 数据库外部服务 的可用性,那怎么实现呢?只需要实现系统内置的 IHealthCheck 接口并实现 CheckHealthAsync() 即可,如下代码所示:

public class MyCustomHealthCheck : IHealthCheck{public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context,CancellationToken cancellationToken = default(CancellationToken)){bool canConnect = IsDBOnline();if (canConnect)return HealthCheckResult.Healthy();return HealthCheckResult.Unhealthy();}}

这里的 IsDBOnline 方法用来判断当前数据库是否是运行状态,实现代码如下:

private bool IsDBOnline(){string connectionString = "server=.;database=PYZ_L;Trusted_Connection=SSPI";try{using (SqlConnection connection = new SqlConnection(connectionString)){if (connection.State != System.Data.ConnectionState.Open) connection.Open();}return true;}catch (System.Exception){return false;}}

然后在 ConfigureServices 方法中进行注入。

public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();services.AddHealthChecks().AddCheck<MyCustomHealthCheck>("sqlcheck");}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseRouting().UseEndpoints(config =>{config.MapHealthChecks("/health");});app.UseStaticFiles();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});}

接下来可以浏览下 /health 页面,可以看出该端口自动执行了你的 MyCustomHealthCheck 方法,如下图所示:

可视化健康检查

上面的检查策略虽然好,但并没有一个好的可视化方案,要想实现可视化的话,还需要单独下载 Nuget 包:AspNetCore.HealthChecks.UI , HealthChecks.UI.ClientAspNetCore.HealthChecks.UI.InMemory.Storage,命令如下:


Install-Package AspNetCore.HealthChecks.UI
Install-Package AspNetCore.HealthChecks.UI.Client
Install-Package AspNetCore.HealthChecks.UI.InMemory.Storage

一旦包安装好之后,就可以在 ConfigureServices 和 Configure 方法下做如下配置。

public class Startup{// This method gets called by the runtime. Use this method to add services to the container.public void ConfigureServices(IServiceCollection services){services.AddControllersWithViews();services.AddHealthChecks();services.AddHealthChecksUI().AddInMemoryStorage();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseRouting().UseEndpoints(config =>{config.MapHealthChecks("/health", new HealthCheckOptions{Predicate = _ => true,ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse});});app.UseHealthChecksUI();app.UseStaticFiles();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});}}

最后还要在 appsettings.json 中配一下 HealthChecks-UI 中的检查项,如下代码所示:


{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","HealthChecks-UI": {"HealthChecks": [{"Name": "Local","Uri": "http://localhost:65348/health"}],"EvaluationTimeOnSeconds": 10,"MinimumSecondsBetweenFailureNotifications": 60}
}

最后在浏览器中输入 /healthchecks-ui 看一下 可视化UI 长成啥样。

使用 ASP.Net Core 的 健康检查中间件 可以非常方便的对 系统资源,数据库 或者其他域外资源进行监控,你可以使用自定义检查逻辑来判断什么样的情况算是 Healthy,什么样的算是 UnHealthy,值得一提的是,当检测到失败时还可以使用失败通知机制,类似 github 发布钩子。

译文链接:https://www.infoworld.com/article/3379187/how-to-implement-health-checks-in-aspnet-core.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【One by One系列】IdentityServer4(四)授权码流程

接下来我们介绍新内容,OAuth2.0叫做授权码(authorization code)&#xff0c;在OpenID Connect中则属于OpenId Connect Flow&#xff0c;称为授权码流程(Authorization Code Flow),这种方式主要场景&#xff1a;保密客户端&#xff0c;服务器端的web应用“例如asp.net core mvc,…

Nemuria UML架构图 第3次迭代. 重构

Nemuria UML架构图 第3次迭代. 重构

suse linux 文件只可读,SUSE LINUX下文件系统变只读的问题解决

现象产生&#xff1a;服务器在挂载SUSE LINUX的系统光盘安装一些系统自带的RPM包后&#xff0c;发现HOME目录文件系统变成只读模式。附图&#xff1a;原因分析&#xff1a;在系统加载光盘之前一切正常&#xff0c;加载后出现这样的问题。加载光盘时&#xff0c;使用了mount命令…

3个值得学习和练手的.net企业级开源项目,强烈推荐

WTM项目名称&#xff1a;WTM项目所用技术栈&#xff1a;wtm mvvm mvc aspnetcore dotnetcore react vue layui layui-admin element-ui ncc等项目简介&#xff1a;WalkingTec.Mvvm框架&#xff08;简称WTM&#xff09;是基于.net core的快速开发框架。支持Layui(前后端不分离),…

linux服务器数据同步,Linux服务器数据定期同步和备份方式

数据安全是做数据分析的人需要关注的一大问题。对于我们分析的关键数据、使用的关键脚本都需要定期备份。scp最简单的备份方式&#xff0c;就是使用cp (本地硬盘)或scp (远程硬盘)命令&#xff0c;给自己的结果文件新建一个拷贝;每有更新&#xff0c;再拷贝一份。具体命令如下&…

2021年了,`IEnumerator`、`IEnumerable`接口还傻傻分不清楚?

IEnumerator、IEnumerable这两个接口单词相近、含义相关&#xff0c;傻傻分不清楚。入行多年&#xff0c;一直没有系统性梳理这对李逵李鬼。最近本人在怼着why神的《其实吧&#xff0c;LRU也就那么回事》&#xff0c;方案1使用数组实现LRU&#xff0c;手写算法涉及这一对接口&a…

vs.Net2003无法打开或创建Web应用程序若干解决办法

昨天到今天搞了一整天,把人都要差点搞崩了! ,以后再也不能乱关机了,因为这次的大意,几乎所有的Net安装&#xff0c;调试问题都被我碰到了&#xff0c;还好&#xff0c;我一个个把他记录下来了&#xff0c;同时&#xff0c;在CSDN找了一些相关的解决方法&#xff0c;不敢独享&am…

linux管理Windows文件,Linux与Windows互传文件,用户组管理和用户管理

一、与Windows互传文件linux和windows互传文件&#xff0c;需要使用Xshell&#xff0c;Linux系统需要安装lrzsz包。yum install -y lrzsz //linux安装lrzsz包# sz a.txt //Linux端传输当前目录下的a.txt到windows# rz //windows端选择传输文件到Linux当前目前二、/etc/passwd和…

微软向Chromium贡献代码以优化浏览器滚动体验

喜欢就关注我们吧&#xff01;近日&#xff0c;微软为 Chromium 社区提交了一个新功能&#xff0c;用于解决以 Chromium 为内核的浏览器在 Windows 10 中滚动响应不够流畅的问题。据悉&#xff0c;Chrome 浏览器在访问某些网站并滚动时会出现抖动的情况&#xff0c;导致其在部分…

[C#.NET 拾遗补漏]14:使用结构体实现共用体

在 C 和 C# 编程语言中&#xff0c;结构体&#xff08;Struct&#xff09;是值类型数据结构&#xff0c;它使得一个单一变量可以存储多种类型的相关数据。在 C 语言中还有一种和结构体非常类似的语法&#xff0c;叫共用体&#xff08;Union&#xff09;&#xff0c;有时也被直译…

linux新建文件夹灰色,Ubuntu新建文件夹灰了

#问题描述&#xff1a;WIn10Ubuntu双系统&#xff0c;其中WIn10系统和Ubuntu的目录“/”和“/boot”在同一块固态中&#xff0c;剩余的其他文件都在另一块机械硬盘里面。在机械硬盘下的软件(E&#xff1a;&分区5)和文档(F&#xff1a;&分区6)盘中无法新建文件夹&#x…

使用 C# 9 的records作为强类型ID - 初次使用

强类型ID实体通常是整数&#xff0c;GUID或者string类型&#xff0c;因为数据库直接支持这些类型&#xff0c;但是&#xff0c;如果实体的ID的类型是一样的&#xff0c;比如都是整数的ID&#xff0c;这有可能会出现ID值传错的问题&#xff0c;看下边的示例。public void AddPro…

用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)

以前的IOServer 是用VB6开发&#xff0c;驱动的配置方式和一般的组态软件没有什么很大的区别&#xff0c;配置起来比较麻烦&#xff0c;对一般的生手来说&#xff0c;要费一番功夫才能配置完毕。 总觉得原有的程序和目前的HMI图元配置环境格格不入&#xff0c;所以重新编写了驱…

MBR的Linux分区机制启动过程,linux系统启动流程(MBR)

总&#xff1a;POST---> Boot Squence ---> Bootloader ---> kernel ---> init---> 完成启动系统&#xff1a;CentOS61、按下电源&#xff0c;cpu找到CMOS中的BIOS并运行起来&#xff0c;这个小程序会完成硬件自检。BIOS&#xff1a;Basic Input and Output Sys…

.netcore 极速接入第三方登录

新年新气象&#xff0c;趁着新年的喜庆&#xff0c;肝了十来天&#xff0c;终于发了第一版&#xff0c;希望大家喜欢。如果有不喜欢看文字的童鞋&#xff0c;可以直接看下面的地址体验一下&#xff1a;Github: https://github.com/mrhuo/MrHuo.OAuth唯一官网&#xff1a;https:…

mongodb可视化工具 linux,Linux中安装启动MongoDB与可视化工具

MongoDB 提供了 linux 各发行版本 64 位的安装包&#xff0c;你可以在官网下载安装包。下载地址&#xff1a;https://www.mongodb.com/download-center#community下载完安装包&#xff0c;并解压 tgz(以下演示的是 64 位 Linux上的安装) 。curl -O https://fastdl.mongodb.org/…

年轻有为的老黄2020

0x01 不知道开篇要说什么好&#xff0c;那就来个经典的 0x01 吧。这个世界不止苟且&#xff0c;还有诗和远方。工作 工作上面还算是比较忙碌的&#xff0c;在20年也做了很多东西&#xff0c;本来面试进公司的时候title是高开&#xff0c;在基础架构组&#xff0c;光杆部门。过完…

推荐:Dapper扩展-Dapper.SimpleCRUD

背景Dapper目前应该是大家比较喜欢的orm框架之一&#xff0c;但是它灵活的背后&#xff0c;还是有很多不尽人意的地方&#xff0c;谁想编写基本的读取/插入/更新/删除语句&#xff1f;下面推荐SimpleCRUD为Dapper提供了简单的CRUD帮助器。解放了大家&#xff0c;提高生产力。功…

群策群力:破机房征求灵丹妙药

我校有一年代久远之计算机教室&#xff0c;现已经迈入日落西山之境。特征求灵丹妙药&#xff0c;不求妙手回春&#xff0c;只愿其能为我校的信息技术教育事业再尽最后一把微力&#xff0c;也为我校即将面临无地授课的教师提供继续上岗的救命稻草一枝。具体情况说明&#xff1a;…