欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

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

时间:2022-03-02 09:07:19|栏目:.NET代码|点击:

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 的实现稍为复杂,下次单独写一篇文章介绍。

上一篇:C#中实现伪静态页面两种方式介绍

栏    目:.NET代码

下一篇:C#使用DES和AES实现加密解密功能示例

本文标题:如何给asp.net core写个简单的健康检查

本文地址:http://www.codeinn.net/misctech/195029.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有