服务器之家

服务器之家 > 正文

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

时间:2020-06-14 15:57     来源/作者:weihanli

Intro

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

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

健康检查扩展实现

实现源码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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 里配置健康检查,示例代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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"

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

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

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

End

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

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

原文链接:http://www.cnblogs.com/weihanli/p/a-simple-healthcheck-for-aspnetcore.html

相关文章

热门资讯

歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
返回顶部