如何在 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,一经查实,立即删除!

相关文章

php 鼠标小手,鼠标移动至少一次时创建PHP会话(Create PHP session when mouse moved at least once)...

鼠标移动至少一次时创建PHP会话(Create PHP session when mouse moved at least once)我想在鼠标移动至少一次时创建php会话&#xff0c;如果鼠标继续移动则不需要做任何事情我正在使用此代码&#xff0c;但它没有解决要求jQuery(document).ready(function(){$(document).mouse…

【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(前后端不分离),…

通过百度 vs 奇虎,来谈博客搜索

百度推出了博客搜索&#xff0c;几乎就是一个网页搜索的翻版而已&#xff0c;唯一和网页搜索不同的&#xff0c;就是&#xff1a;1、少了广告&#xff1b;2、增加了一个博客的首页连接。看起来&#xff0c;并无太大新意。当然&#xff0c;也许他留有后着&#xff0c;也未为可知…

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和…

浅谈​与彼得原理和责任管理有关的小故事

浅谈与彼得原理和责任管理有关的小故事一&#xff09;老王虽然今年才3年工作经验&#xff0c;但一直深受领导赏识&#xff0c;因为在大家眼里他是一个责任心特别强的人。无论是领导也好&#xff0c;同事也好&#xff0c;只要有任务安排给他&#xff0c;他都会非常欣然的接受&am…

分布式防火墙技术及主要特点

随着网络的发展和普及&#xff0c;特别是互联网应用的飞速发展和普及&#xff0c;网络安全越来越受到各级用户的普遍关注。人们在享受信息化带来的众多好处的同时&#xff0c;也面临着日益突出的信息安全问题。比如&#xff1a;网络环境中国家秘密和商业秘密的保护&#xff0c;…

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

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

armv7的linux系统,CentOS 7(1611) for ARM(armhfp)发布

需要注意的是&#xff0c;ARM版CentOS 7.3.1611是从Red Hat Enterprise Linux 7.3系统中派生出来的&#xff0c;这就意味着操作系统能够兼容上层系统。尽管CentOS 7 Userland for armhfp来自于CentOS 7 GNU/Linux发行版本&#xff0c;但是部分预安装包已经移除&#xff0c;或者…

proftpd的配置

下载proftp最新版。下载地址&#xff1a;[url]ftp://ftp.proftpd.org/distrib/source/[/url]二、安装tar zxvf proftpd*.gz //解压文件。cd proftpd* //考虑到版本不同&#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…

右击硬盘分区第一项出现Auto的解决办法

最近网上相信有不少的网友和我一样都中了这种病毒&#xff0e;就是说在右键单击你的硬盘的时候第一项不是打开而是&#xff21;&#xff35;&#xff34;&#xff2f;这个选项&#xff0e;而要想在这种情况下打开的话&#xff0c;就必须用右键单击打开&#xff0c;让我们心理真…

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

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