ps做电商网站尺寸是多少,wordpress移动端加底部导航,健康管理咨询公司,什么软件做网站链接写在前面我们的系统可能因为正在部署、服务异常终止或者其他问题导致系统处于非健康状态#xff0c;这个时候我们需要知道系统的健康状况#xff0c;而健康检查可以帮助我们快速确定系统是否处于正常状态。一般情况下#xff0c;我们会提供公开的HTTP接口#xff0c;用于专… 写在前面我们的系统可能因为正在部署、服务异常终止或者其他问题导致系统处于非健康状态这个时候我们需要知道系统的健康状况而健康检查可以帮助我们快速确定系统是否处于正常状态。一般情况下我们会提供公开的HTTP接口用于专门化健康检查。NET Core提供的健康检查库包括Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions和Microsoft.Extensions.Diagnostics.HealthChecks。这两个库共同为我们提供了最基础的健康检查的解决方案后面扩展的组件主要有下面几个本文不作其他说明。AspNetCore.HealthChecks.System AspNetCore.HealthChecks.Network AspNetCore.HealthChecks.SqlServer AspNetCore.HealthChecks.MongoDb AspNetCore.HealthChecks.Npgsql AspNetCore.HealthChecks.Redis AspNetCore.HealthChecks.AzureStorage AspNetCore.HealthChecks.AzureServiceBus AspNetCore.HealthChecks.MySql AspNetCore.HealthChecks.DocumentDb AspNetCore.HealthChecks.SqLite AspNetCore.HealthChecks.Kafka AspNetCore.HealthChecks.RabbitMQ AspNetCore.HealthChecks.IdSvr AspNetCore.HealthChecks.DynamoDB AspNetCore.HealthChecks.Oracle AspNetCore.HealthChecks.Uris源码探究Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions是.NET Core健康检查的抽象基础从中我们可以看出这个库的设计意图。它提供了一个统一的接口IHealthCheck用于检查应用程序中各个被监控组件的状态包括后台服务、数据库等。这个接口只有一个方法CheckHealthAsync该方法有一个参数是HealthCheckContext它表示当前健康检查执行时所关联的上下文对象它的返回值HealthCheckResult表示当前健康检查结束后所产生的被监控组件的运行状态。源码如下所示public interface IHealthCheck{ TaskHealthCheckResult CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken default);}HealthCheckRegistrationHealthCheckContext里面只有一个成员就是HealthCheckRegistration实例。而HealthCheckRegistration是一个相当重要的对象它体现了健康检查需要关注和注意的地方其内部涉及到五个属性分别用于标识健康检查名称创建IHealthCheck实例健康检查的超时时间防止我们因为健康检查而过多占用资源失败状态标识一个标签集合可用于健康检查过滤这五个属性的相关源码如下public FuncIServiceProvider, IHealthCheck Factory{ get _factory; set { if (value null) { throw new ArgumentNullException(nameof(value)); } _factory value; }} public HealthStatus FailureStatus { get; set; } public TimeSpan Timeout{ get _timeout; set { if (value TimeSpan.Zero value ! System.Threading.Timeout.InfiniteTimeSpan) { throw new ArgumentOutOfRangeException(nameof(value)); } _timeout value; }} public string Name{ get _name; set { if (value null) { throw new ArgumentNullException(nameof(value)); } _name value; }} public ISetstring Tags { get; }HealthCheckResultHealthCheckResult是一个结构体可以看出这里更多的是基于承担数据存储和性能问题的考量。HealthCheckResult用于表示健康检查的相关结果信息同样的通过该类我们知道了健康检查需要关注的几个点组件的当前状态异常信息友好的描述信息不管是异常还是正常额外可描述当前组件的键值对这是一个开放式的属性方面我们记录更多信息该类含有四个公共属性和三个方法相关源码如下public struct HealthCheckResult{ private static readonly IReadOnlyDictionarystring, object _emptyReadOnlyDictionary new Dictionarystring, object(); public HealthCheckResult(HealthStatus status, string description null, Exception exception null, IReadOnlyDictionarystring, object data null) { Status status; Description description; Exception exception; Data data ?? _emptyReadOnlyDictionary;}public IReadOnlyDictionarystring, object Data { get; }public string Description { get; }public Exception Exception { get; }public HealthStatus Status { get; }public static HealthCheckResult Healthy(string description null, IReadOnlyDictionarystring, object data null){ return new HealthCheckResult(status: HealthStatus.Healthy, description, exception: null, data);}public static HealthCheckResult Degraded(string description null, Exception exception null, IReadOnlyDictionarystring, object data null){ return new HealthCheckResult(status: HealthStatus.Degraded, description, exception: exception, data);}public static HealthCheckResult Unhealthy(string description null, Exception exception null, IReadOnlyDictionarystring, object data null){ return new HealthCheckResult(status: HealthStatus.Unhealthy, description, exception, data);}}可以看出这个三个方法都是基于HealthStatus这个枚举而创建不同状态的HealthCheckResult实例这个枚举表达了健康检查需要关注的几种状态健康、异常以及降级。HealthStatus的源码如下public enum HealthStatus{ Unhealthy 0, Degraded 1, Healthy 2,}IHealthCheckPublisher健康检查功能本质上是一种轮询功能需要定期执行.NET Core 抽象定期执行的接口即IHealthCheckPublisher我们可以通过实现这个接口并与我们自定义的定时功能相结合。同时作为一次健康检查我们还需要关注相关的健康检查报告那么我们需要关注那些点呢额外可描述当前组件的键值对这是一个开放式的属性方面我们记录更多信息友好的描述信息不管是异常还是正常组件的当前状态异常信息当前这次检查所耗费的时间相关的标签信息HealthReportEntry表示单个健康检查报告HealthReport表示一组健康检查报告。HealthReport内部维护了一个HealthReportEntry的字典数据HealthReport源码如下所示public sealed class HealthReport{ public HealthReport(IReadOnlyDictionarystring, HealthReportEntry entries, TimeSpan totalDuration) { Entries entries; Status CalculateAggregateStatus(entries.Values); TotalDuration totalDuration; } public IReadOnlyDictionarystring, HealthReportEntry Entries { get; } public HealthStatus Status { get; } public TimeSpan TotalDuration { get; } private HealthStatus CalculateAggregateStatus(IEnumerableHealthReportEntry entries) { var currentValue HealthStatus.Healthy; foreach (var entry in entries) { if (currentValue entry.Status) { currentValue entry.Status; } if (currentValue HealthStatus.Unhealthy) { // Game over, man! Game over! // (We hit the worst possible status, so theres no need to keep iterating) return currentValue; } } return currentValue; }}总结通过以上内容我们知道了一个完整的健康检查需要关注健康检查上下文、健康状态的维护、健康检查结果、健康检查报告同时为了更好的维护健康检查我们可以将健康检查发布抽象出来并与外部的定时器相结合共同守护健康检查程序。