如何给asp.net core写个简单的健康检查
2019-05-18 18:01
2031 查看
Intro
健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供了健康检查机制来检测应用的健康状态,如果应用本身就提供一个健康检查的机制会更友好,更能真实的反映出应用的健康状态。
我们的开发环境虚拟机配置有点低,所以有时候虚拟机会卡死。。导致接口无响应,有时可能有些服务启动有问题会挂掉,所以需要一个简单的健康检查机制去检查应用的健康状态来第一时间知道应用出现异常。
健康检查扩展实现
public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder) { return UseHealthCheck(applicationBuilder, new PathString("/api/health")); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path) { return UseHealthCheck(applicationBuilder, new PathString(path)); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path) { applicationBuilder.Map(path, builder => builder.Use( (context, next) => { context.Response.StatusCode = 200; return context.Response.WriteAsync("healthy"); })); return applicationBuilder; } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path, Func<IServiceProvider, bool> checkFunc) { return UseHealthCheck(applicationBuilder, new PathString(path), serviceProvider => Task.FromResult(checkFunc(serviceProvider))); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path, Func<IServiceProvider, Task<bool>> checkFunc) { return UseHealthCheck(applicationBuilder, new PathString(path), checkFunc); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path, Func<IServiceProvider, bool> checkFunc) { if (checkFunc == null) { checkFunc = serviceProvider => true; } return UseHealthCheck(applicationBuilder, path, serviceProvider => Task.FromResult(checkFunc(serviceProvider))); } public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path, Func<IServiceProvider, Task<bool>> checkFunc) { if (checkFunc == null) { checkFunc = serviceProvider => Task.FromResult(true); } applicationBuilder.Map(path, builder => builder.Use( async (context, next) => { try { var healthy = await checkFunc.Invoke(context.RequestServices); if (healthy) { context.Response.StatusCode = StatusCodes.Status200OK; await context.Response.WriteAsync("healthy"); } else { context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; await context.Response.WriteAsync("unhealthy"); } } catch (Exception ex) { context.RequestServices.GetService<ILoggerFactory>().CreateLogger("HealthCheck").Error(ex); context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable; await context.Response.WriteAsync("unhealthy"); } })); return applicationBuilder; }
配置健康检查
在 Startup 里配置健康检查,示例代码
app.UseHealthCheck(); // 最基本的健康检查, 默认检查路径为 ""/api/health",直接返回 healthy app.UseHealthCheck("/heath"); // 配置健康检查的路径为 "/health",直接返回 healthy app.UseHealthCheck("/health", serviceProvider => { // 检查数据连接是否正常,这里只是一个示例,可以根据需要自定义自己的实现 var configuration = serviceProvider.GetService<IConfiguration>(); var connString = configuration.GetConnectionString("DefaultConnection"); try { using (var conn = new SqlConnection(connString)) { conn.EnsureOpen(); } return true; } catch (Exception) { return false; } });
实际效果
直接启动访问 "/health"
数据库连接改为一个错误的连接,修改数据库名称为一个不存在的数据库
End
这个实现比较简单,只是实现一个比较简单的检查,最初的想法比较简单只是看某个应用是否正常工作,具体的检查逻辑可以自定义。官方的 HealthChecks 的实现稍为复杂,下次单独写一篇文章介绍。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。
您可能感兴趣的文章:
相关文章推荐
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
- 如何简单的在 ASP.NET Core 中集成 JWT 认证?
- ASP.NET Core之跨平台的实时性能监控(2.健康检查)
- Hangfire在ASP.NET CORE中的简单实现
- 如何在ASP.NET Core程序启动时运行异步任务(1)
- asp.net如何生成图片验证码(简单)
- ASP.NET Core 打造一个简单的图书馆管理系统 (修正版)(三)密码修改以及密码重置
- Asp.net Core中如何使用中间件来管理websocket
- ASP.NET Core 打造一个简单的图书馆管理系统 (修正版)(六)学生借阅/预约/查询书籍事务
- 详解ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁
- ASP.NET Core Web API 如何 数据分页 以及遇到'OFFSET' 附近有语法错误
- ABP实践(3)-ASP.NET Core 2.x版本(从创建实体到输出api)简单实现商品列表及增删改
- 如何应用Asp.Net Mvc内建功能(DefaultModelBinder)实现简单类型、复杂类型、集合类型,以及字典类型的自动绑定
- Asp.Net Core + Ocelot 网关搭建:路由简单配置
- asp.net如何生成图片验证码(简单)
- [转]Asp.Net Core 简单的使用加密的Cookie保存用户状态
- 详解CentOS 7.4下如何部署Asp.Net Core结合consul