给 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 实现一个简单的仓储

    一直有自己写个框架的想法,但是一直没有行动起来,最近比较闲,正好可以开工了. 现在已经完成了两部分.1.一个简单仓储,实现使用的是ef 2.IOC部分,这里是把内置的ioc替换成了aotofac,这部 ...

  2. asp.net core下一个简单的分页技术

    在做web应用的时候免不了要对数据进行分页,我最近在做asp.net core的开发的时候就遇到了这个需求,现在简单的记录一下: public class PaginatedList<T> ...

  3. ASP.NET CORE在docker中的健康检查(healthcheck)

    在使用docker-compose的过程中,很多程序都提供了健康检查(healthcheck)的方法,通过健康检查,应用程序能够在确保其依赖的程序都已经启动的前提下启动,减少各种错误的发生,同时,合理 ...

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

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

  5. ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 基础教程总结 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 基础教程总结 ASP.NET Core 基础教程总算是有了个简单 ...

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

    原文:ASP.NET Core Identity 迁移数据 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 迁移数据 上一章节中我们配置了 ...

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

    原文:ASP.NET Core Identity 配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Identity 配置 上一章节我们简单介绍了下 Id ...

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

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

  9. ASP.NET Core Razor 视图起始页 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 视图起始页 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 视图起始页 上一章节中我们介绍了布局视图, ...

随机推荐

  1. Thrift文件加载

    一.简述 通过前面的分析,我们知道无论是创建一个客户端还是服务器,第一步要做的就是调用thriftpy.load对thrift文件进行解析,并在内存中构建相应的module,本文将对load方法进行一 ...

  2. js 跨域复习 window.name | window.domain | iframe | Jsonp

    引起跨域的原因: 浏览器的同源策略,但是当你要发送请求的时候,出于安全性问题,浏览器有严格的要求,必须协议,域名,端口都相同,这个就是同源策略. 影响:a通过js脚本向b发送ajax请求,不同源就会报 ...

  3. javaScript-基础篇(二)

    1.DOM概念 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树) 将HTML代码 ...

  4. stl_vector.h

    stl_vector.h // Filename: stl_vector.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http ...

  5. FFMPEG-AVFilter研究

    FFMPEG中的libswscale是做像素转换的,但是对于一些复杂的操作,比如添加水印等,这个库就不行了,这时候就要说一下另外一个AVFilter.AVFilter完全可以替代libswscale的 ...

  6. 省选/NOI刷题Day1

    bzoj4864 Splay乱搞 bzoj3669 正解LCT,考虑上下界的spfa可过 bzoj3668 位运算 暴力 bzoj3670 KMP DP bzoj3671 含有最小的一个数的路径一定比 ...

  7. CodeForces - 1017 C. The Phone Number(数学)

    Mrs. Smith is trying to contact her husband, John Smith, but she forgot the secret phone number! The ...

  8. 用NodeJS打造多人在线聊天室(NodeJS & SocketIO & Express & EJS & MongoDB & Gulp)

    项目背景 这个项目主要是为了玩玩NodeJS,项目的方向大概是做出类似QQ的在线聊天系统.想要在线体验可以点击在线演示. 项目使用PM2进行部署和管理,功能在不断的迭代开发中.如果你觉得这个项目比较有 ...

  9. RTSP协议分析(二)

    以下是某省IPTV的RTSP协商过程: DESCRIBE rtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1& ...

  10. 使用Visual Studio进行单元测试-Part5

    本文主要介绍Visual Studio(2012+)单元测试框架的一些技巧: 如何模拟类的静态构造函数 如何测试某方法被调用过 如何测试某方法执行的次数 并行编程测试注意事项 一.如何模拟类的静态构造 ...