.Net Core实现健康检查的示例代码

ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。

运行状况检查由应用程序作为 HTTP 终结点公开。 可以为各种实时监视方案配置运行状况检查终结点:

  • 运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态。 例如,容器业务流程协调程序可以通过停止滚动部署或重新启动容器来响应失败的运行状况检查。 负载均衡器可以通过将流量从失败的实例路由到正常实例,来应对不正常的应用。
  • 可以监视内存、磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态。
  • 运行状况检查可以测试应用的依赖项(如数据库和外部服务终结点)以确认是否可用和正常工作。

这个示例展示数据库的运行状态,他在其验证数据库连接并返回相应的结果

 [Route("health")]
    public ActionResult Health()
    {
      using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
      {
        try
        {
          connection.Open();
        }
        catch (SqlException)
        {
          return new StatusCodeResult(503);

        }
      }

      return new EmptyResult();
    }

当我们请求该地址的时候时,如果连接到数据库时出现任何连接问题,它将显示一条包含200状态代码和503状态代码的空消息​​。

现在基于这些结果状态码,我们可以监视系统采取相关的操作。

从.NET Core2.2开始,我们不需要为运行状态在去自定义检查控制器和接口,而是框架本身已经为我们提供了运行状况的检查服务。

安装和运行

Install-Package Microsoft.Extensions.Diagnostics.HealthChecks

安装后,我们需要在Startup.cs文件的ConfigureServices()和Configure()方法中添加。

  public void ConfigureServices(IServiceCollection services)
    {
      services.AddHealthChecks();
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      app
        .UseHealthChecks("/health");

    }

我们在configure()方法中配置完端点后,我们就可以通过 /health 来请求查看我们的应用程序的健康程度的。

但是这样对于我们刚才的需求是满足不了的,那么我们如何自定义我们的健康度检查呢?

两种方式来处理

option 1

   public void ConfigureServices(IServiceCollection services)
    {
      services.AddHealthChecks()
 .AddCheck("sql", () =>
 {

   using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
   {
     try
     {
       connection.Open();
     }
     catch (SqlException)
     {
       return HealthCheckResult.Unhealthy();
     }
   }

   return HealthCheckResult.Healthy();

 });
    }

在这里我们使用匿名方法AddCheck(),来编写我们的自定义的验证逻辑,结果是HealthCheckResult对象,该对象包含3个选项

  • Healthy 健康
  • Unhealthy 不良
  • Degraded 降级

option 2

实现IHealthCheck接口并实现CheckHealthAsync()方法,如下所示:

 public class DatabaseHealthCheck : IHealthCheck
    {
      public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken =
       default)
      {
        using (var connection = new SqlConnection("Server=.;Initial Catalog=master;Integrated Security=true"))
        {
          try
          {
            connection.Open();
          }
          catch (SqlException)
          {
            return Task.FromResult(HealthCheckResult.Unhealthy());
          }
        }

        return Task.FromResult(HealthCheckResult.Healthy());

      }
    }

创建该类之后,我们需要通过使用一些有效的唯一名称,AddCheck ()方法在ConfigureServices()方法中提及该类,如下所示。

  public void ConfigureServices(IServiceCollection services)
    {
      services.AddHealthChecks()
     .AddCheck<DatabaseHealthCheck>("sql");
    }

现在我们的代码就写完了,我们可以像上面那样添加任意数量的Health Task,它将按照我们在此处声明的顺序运行。

自定义状态码

在之前我们也说过200为健康,503为不健康那么Healthcheck服务甚至通过以下方式使用其options对象提供自定义状态代码,为我们提供了更改此默认的状态码。

config.MapHealthChecks("/health", new HealthCheckOptions
           {
            ResultStatusCodes = new Dictionary<HealthStatus, int> { { HealthStatus.Unhealthy, 420 }, { HealthStatus.Healthy, 200 }, { HealthStatus.Degraded, 419 } }

           }); 

自定义输出

我们可以自定义输出,以获取有关每个运行状况检查任务的更清晰详细的信息。如果我们有多个运行状况检查任务来分析哪个任务使整个服务健康状态变为”不正常“,这将非常有用。

我们可以通过HealthCheckOptions ResponseWriter属性来实现。

   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      app
         .UseRouting()
         .UseEndpoints(config =>
         {
           config.MapHealthChecks("/health", new HealthCheckOptions
           {
            ResponseWriter=CustomResponseWriter

           }); 

         });

    }
    private static Task CustomResponseWriter(HttpContext context, HealthReport healthReport)
    {
      context.Response.ContentType = "application/json";

      var result = JsonConvert.SerializeObject(new
      {
        status = healthReport.Status.ToString(),
        errors = healthReport.Entries.Select(e => new
        {
          key = e.Key,
          value = e.Value.Status.ToString()
        })
      });
      return context.Response.WriteAsync(result);

    }

现在以json显示我们的详细信息,完成了健康状态的检查.

健康检查界面

Install-Package AspNetCore.HealthChecks.UI

安装完成后,需要相应地在ConfigureServices()和Configure()方法中调用相应的服务方法。

public void ConfigureServices(IServiceCollection services)
{
  services.AddHealthChecksUI();
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
  app.UseHealthChecksUI();
} 

配置完成后,您可以运行应用程序并指向/ healthchecks-ui地址,该端点显示如下的UI.

但是界面上没有我们刚才自定义的,那我们在进行配置

Appsetting.json

{
 "ApplicationInsights": {
  "InstrumentationKey": "your-instrumentation-key"
 },
 "Logging": {
  "LogLevel": {
   "Default": "Warning"
  }
 },
 "AllowedHosts": "*",
 "HealthChecksUI": {
  "HealthChecks": [
   {
    "Name": "Test Health",
    "Uri": "https://localhost:44342/health"
   }
  ],
  "EvaluationTimeinSeconds": 10,
  "MinimumSecondsBetweenFailureNotifications": 60
 }
}

这样就可以看到健康状态了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

    Intro 健康检查可以帮助我们知道应用的当前状态是不是处于良好状态,现在无论是 docker 还是 k8s 还是现在大多数的服务注册发现大多都提供了健康检查机制来检测应用的健康状态,如果应用本身就提供一个健康检查的机制会更友好,更能真实的反映出应用的健康状态. 我们的开发环境虚拟机配置有点低,所以有时候虚拟机会卡死..导致接口无响应,有时可能有些服务启动有问题会挂掉,所以需要一个简单的健康检查机制去检查应用的健康状态来第一时间知道应用出现异常. 健康检查扩展实现 实现源码 public sta

  • .Net Core实现健康检查的示例代码

    ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况. 运行状况检查由应用程序作为 HTTP 终结点公开. 可以为各种实时监视方案配置运行状况检查终结点: 运行状况探测可以由容器业务流程协调程和负载均衡器用于检查应用的状态. 例如,容器业务流程协调程序可以通过停止滚动部署或重新启动容器来响应失败的运行状况检查. 负载均衡器可以通过将流量从失败的实例路由到正常实例,来应对不正常的应用. 可以监视内存.磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态.

  • ASP.NET Core 实现基本认证的示例代码

    HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authentication)是一种允许网页浏览器或其他客户端程序以(用户名:口令) 请求资源的身份验证方式,不要求cookie,session identifier.login page等标记或载体. - 所有浏览器据支持HTTP基本认证方式 - 基本身证原理不保证传输凭证的安全性,仅被based64编码,并没有encrypted或者hashed,一般部署在客户端和服务端互信的网络,在公网中应用BA认证通常与https结合 http

  • .NET Core使用FluentEmail发送邮件的示例代码

    前言 在实际的项目开发中,我们会遇到许多需要通过程序发送邮件的场景,比如异常报警.消息.进度通知等等.一般情况下我们使用原生的SmtpClient类库居多,它能满足我们绝大多数场景.但是使用起来不够简洁,许多场景需要我们自行封装方法去实现,而且代码量非常可观.庆幸的是,我们有一款非常棒的组件,能满足我们绝大多数应用场景,而且使用简单功能强大,就是我们今天要说的FluentEmail,这也是我们实际在项目中正在使用的邮件发送组件.如果你们在.Net Core中有发送邮件的需求,也推荐去尝试一下.

  • 如何在ASP.NET Core中使用Session的示例代码

    ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且 高度模块化的web框架,Session 可以实现用户信息存储从而可以在同一个客户端的多次请求之间实现用户追踪,在 ASP.Net Core 中可以使用 Microsoft.AspNetCore.Session 中间件来启用 Session 机制. 中间件的价值在于可以在 request -> response 的过程中做一些定制化的操作,比如说:监视数据,切换路由,修改流转过程中的消息体,通常来说:中间件是以链式的方式灌入到

  • 详解如何在ASP.Net Core中实现健康检查

    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态. ASP.Net Core 中的 健康检查 落地做法是暴露一个可配置的 Http 端口,你可以使用 健康检查 去做一个最简单的活性检测,比如说:检查网络和系统的资源可用性,数据库资源是否可用,应用程序依赖的消息中间件或者 Azure cloud service 的可用性 等等,这篇文章我们就来讨论如何使用这个 健康检查中间件. 注册健康检查

  • Spring Boot Actuator自定义健康检查教程

    健康检查是Spring Boot Actuator中重要端点之一,可以非常容易查看应用运行至状态.本文在前文的基础上介绍如何自定义健康检查. 1. 概述 本节我们简单说明下依赖及启用配置,展示缺省健康信息.首先需要引入依赖: compile("org.springframework.boot:spring-boot-starter-actuator") 现在通过http://localhost:8080/actuator/health端点进行验证: {"status"

  • 在.net core中实现字段和属性注入的示例代码

    简单来说,使用Ioc模式需要两个步骤,第一是把服务注册到容器中,第二是从容器中获取服务,我们一个一个讨论并演化.这里不会考虑使用如Autofac等第三方的容器来代替默认容器,只是提供一些简单实用的小方法用于简化应用层的开发. 将服务注入到容器 asp.netcore官方给出的在容器中注册服务方法是,要在Startup类的ConfigureServices方法中添加服务,如下所示: public void ConfigureServices(IServiceCollection services)

  • Java的静态类型检查示例代码详解

    关于静态类型检查和动态类型检查的解释: 静态类型检查:基于程序的源代码来验证类型安全的过程: 动态类型检查:在程序运行期间验证类型安全的过程: Java使用静态类型检查在编译期间分析程序,确保没有类型错误.基本的思想是不要让类型错误在运行期间发生. 在各色各样的编程语言中,总共存在着两个类型检查机制:静态类型检查和动态类型检查. 静态类型检查是指通过对应用程序的源码进行分析,在编译期间就保证程序的类型安全. 动态类型检查是在程序的运行过程中,验证程序的类型安全.在Java中,编译期间使用静态类型

  • .NET core高性能对象转换示例代码

    前言 NET Core(开放源代码,跨平台,x-copy可部署等)有许多令人兴奋的方面,其中最值得称赞的就是其性能了.关于对象转换已经有不少轮子(AutoMapper,TinyMapper) .出于项目需要,手动造一个简单轮子.下面话不多说了,来一起看看详细的介绍吧. 示例代码 g>1.采用静态泛型类缓存,避免了拆箱装箱操作. 2.对于转换对象中有,字段名一样但是类型不一样的类时仍可以用 public static class Mapper<TSource, TTarget> where

随机推荐