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

Intro

健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供了健康检查机制来检测应用的健康状态,如果应用本身就提供一个健康检查的机制会更友好,更能真实的反映出应用的健康状态。

我们的开发环境虚拟机配置有点低,所以有时候虚拟机会卡死。。导致接口无响应,有时可能有些服务启动有问题会挂掉,所以需要一个简单的健康检查机制去检查应用的健康状态来第一时间知道应用出现异常。

健康检查扩展实现

实现源码

  1. public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder)

  2. {

  3. return UseHealthCheck(applicationBuilder, new PathString("/api/health"));

  4. }

  5. public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path)

  6. {

  7. return UseHealthCheck(applicationBuilder, new PathString(path));

  8. }

  9. public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path)

  10. {

  11. applicationBuilder.Map(path, builder => builder.Use(

  12. (context, next) =>

  13. {

  14. context.Response.StatusCode = 200;

  15. return context.Response.WriteAsync("healthy");

  16. }));

  17. return applicationBuilder;

  18. }

  19. public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path, Func<IServiceProvider, bool> checkFunc)

  20. {

  21. return UseHealthCheck(applicationBuilder, new PathString(path), serviceProvider => Task.FromResult(checkFunc(serviceProvider)));

  22. }

  23. public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, string path,

  24. Func<IServiceProvider, Task<bool>> checkFunc)

  25. {

  26. return UseHealthCheck(applicationBuilder, new PathString(path), checkFunc);

  27. }

  28. public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path, Func<IServiceProvider, bool> checkFunc)

  29. {

  30. if (checkFunc == null)

  31. {

  32. checkFunc = serviceProvider => true;

  33. }

  34. return UseHealthCheck(applicationBuilder, path, serviceProvider => Task.FromResult(checkFunc(serviceProvider)));

  35. }

  36. public static IApplicationBuilder UseHealthCheck(this IApplicationBuilder applicationBuilder, PathString path, Func<IServiceProvider, Task<bool>> checkFunc)

  37. {

  38. if (checkFunc == null)

  39. {

  40. checkFunc = serviceProvider => Task.FromResult(true);

  41. }

  42. applicationBuilder.Map(path, builder => builder.Use(

  43. async (context, next) =>

  44. {

  45. try

  46. {

  47. var healthy = await checkFunc.Invoke(context.RequestServices);

  48. if (healthy)

  49. {

  50. context.Response.StatusCode = StatusCodes.Status200OK;

  51. await context.Response.WriteAsync("healthy");

  52. }

  53. else

  54. {

  55. context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable;

  56. await context.Response.WriteAsync("unhealthy");

  57. }

  58. }

  59. catch (Exception ex)

  60. {

  61. context.RequestServices.GetService<ILoggerFactory>().CreateLogger("HealthCheck").Error(ex);

  62. context.Response.StatusCode = StatusCodes.Status503ServiceUnavailable;

  63. await context.Response.WriteAsync("unhealthy");

  64. }

  65. }));

  66. return applicationBuilder;

  67. }

配置健康检查

Startup 里配置健康检查,示例代码

  1. app.UseHealthCheck(); // 最基本的健康检查, 默认检查路径为 ""/api/health",直接返回 healthy

  2. app.UseHealthCheck("/heath"); // 配置健康检查的路径为 "/health",直接返回 healthy

  3. app.UseHealthCheck("/health", serviceProvider =>

  4. {

  5. // 检查数据连接是否正常,这里只是一个示例,可以根据需要自定义自己的实现

  6. var configuration = serviceProvider.GetService<IConfiguration>();

  7. var connString = configuration.GetConnectionString("DefaultConnection");

  8. try

  9. {

  10. using (var conn = new SqlConnection(connString))

  11. {

  12. conn.EnsureOpen();

  13. }

  14. return true;

  15. }

  16. catch (Exception)

  17. {

  18. return false;

  19. }

  20. });

实际效果

直接启动访问 "/health"

数据库连接改为一个错误的连接,修改数据库名称为一个不存在的数据库

End

这个实现比较简单,只是实现一个比较简单的检查,最初的想法比较简单只是看某个应用是否正常工作,具体的检查逻辑可以自定义。官方的 HealthChecks 的实现稍为复杂,下次单独写一篇文章介绍。

给 asp.net core 写一个简单的健康检查相关推荐

  1. ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 标签助手 上一章节我们介绍了视图导入,学习了 ...

  2. ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core Identity 迁移数据 - ASP.NET C ...

  3. 给 asp.net core 写个中间件来记录接口耗时

    给 asp.net core 写个中间件来记录接口耗时 Intro 写接口的难免会遇到别人说接口比较慢,到底慢多少,一个接口服务器处理究竟花了多长时间,如果能有具体的数字来记录每个接口耗时多少,别人再 ...

  4. Hangfire在ASP.NET CORE中的简单实现

    hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...

  5. android三角形切图软件,还在为小三角形切图?使用纯CSS写一个简单的三角形

    同学们,当美工给的设计图是这样: 或者这样: 我的内心其实是拒绝的-_-:但工作还得干,大部分同学会写 .icon{width:20px;height:20px;display:block;margi ...

  6. ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...

  7. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础 ...

  8. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单 ...

  9. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单 ...

最新文章

  1. 事务中SET XACT_ABORT各种用法
  2. 不让自己的应用程序在桌面的图标列表里启动显示的方法
  3. 实例7:python
  4. 编程的本质--深入理解类型系统/泛型/函数式编程/面向对象编程
  5. 应用中的图像识别:为什么以及如何使用
  6. 给笔记本更换SSD硬盘
  7. 小区广播背景音乐系统IP网络广播解决方案
  8. linux 下numpy安装包,Linux下安装numpy
  9. Android云手机平台搭建-2020圈钱热潮
  10. STM32精英板连接wifi,通过指令控制继电器
  11. Linux Bridge的IP NAT细节探析-填补又一坑的过程
  12. win8系统保护服务器,Win8整合SmartScreen升级功能保护系统安全
  13. 云服务上搭建halo博客
  14. 理解电脑上的串口对应的端口号(com口)
  15. Spring Cache使用Redis自定义缓存key
  16. super_status_bar与status_bar的关系
  17. 服务器重装系统之浪潮服务器
  18. mybatis入门实例(xml文件配置)
  19. html静态页面作业—西安旅游(7页) 大学生旅游网页作品 出行网页设计作业模板 学生游玩网页制作源代码下载
  20. 破解智慧零售密码 苏宁易购818引爆全民消费狂欢

热门文章

  1. 浏览器显示无法解析服务器的DNS地址,使用搜狗浏览器时突然弹出无法解析服务器的DNS地址该如何处理...
  2. Java并发(二十一):线程池实现原理
  3. 一张图解决Android Studio 项目运行按钮灰色
  4. 10.2.0.5启动enterprise manager
  5. 【CodeForces 577C】Vasya and Petya’s Game
  6. snmpd服务无法更改默认端口
  7. Exchange2003管理
  8. 在 WASI 上运行 .NET 7 应用程序
  9. .NET6下周发布真的香,可不少人却只会.NET Framework!
  10. ShardingCore 如何呈现“完美”分表