首页 > 其他分享 >#yyds干货盘点#【愚公系列】2023年04月 .NET CORE工具案例-分布式服务的健康检查系统

#yyds干货盘点#【愚公系列】2023年04月 .NET CORE工具案例-分布式服务的健康检查系统

时间:2023-04-10 14:02:53浏览次数:61  
标签:JProperty yyds 04 Package AspNetCore Install new HealthChecks CORE

前言

1.健康检查系统来源背景

互联网产品对用户体验提出了很高的要求,但常常由于技术侧原因,发生服务响应慢或者服务不可用等一系列影响用户体验的问题,导致业务中断,影响收入。影响服务不可用和响应慢的因素很多,可能是服务硬件损坏、光纤被挖断,可能是请求量过大导致数据库CPU负载、磁盘IO过高等等。

2.健康检查系统的作用

要保证系统高可用,主要就是消除单节点故障,消除单节点故障是系统高可用的常用手段。消除单节点有一个很重要的前提是发现问题节点,把问题节点踢除或者把流量切换到其他正常节点。

如何“发现问题节点”,就是系统健康检查需要做的事情。

3.如何涉及健康检查系统

谈论如何做健康检查前,首先要弄明白的是要检查的对象究竟是谁。对象可以网络连接,可以是一个小小的功能组件,可以是一个进程,可以是服务集群,也可以是机房单元。在开发AspNet Core应用的时候,我们经常会为该应用公布一个特殊的检测接口出来。该接口的目的很简单,告诉外界程序当前程序现在是可以访问或者不能访问的,便于外界做出相应的操作,比如监控报警,页面通知用户稍作等待等。

一、分布式服务的健康检查系统

1.官方包的使用

1、添加健康检查类和响应输出方法

/// <summary>
/// mysql健康检查
/// </summary>
public class MySQLHealthCheck : IHealthCheck
{
    public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        try
        {
            return await Task.FromResult(HealthCheckResult.Healthy()).ConfigureAwait(false);
        }
        catch
        {
            return await Task.FromResult(HealthCheckResult.Unhealthy("From Sql Serve")).ConfigureAwait(false);
        }
    }
}

/// <summary>
/// redis健康检查
/// </summary>
public class RedisHealthCheck : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        return Task.FromResult(HealthCheckResult.Healthy());
    }
}
public static class Response
{
    /// <summary>
    /// 返回指定格式
    /// </summary>
    /// <param name="context"></param>
    /// <param name="result"></param>
    /// <returns></returns>
    private static Task WriteResponse(HttpContext context, HealthReport result)
    {
        context.Response.ContentType = "application/json";

        var json = new JObject(
            new JProperty("status", result.Status.ToString()),
            new JProperty("results", new JObject(result.Entries.Select(pair => new JProperty(pair.Key,
                new JObject(new JProperty("status", pair.Value.Status.ToString()),
                    new JProperty("description", pair.Value.Description),
                    new JProperty("data", new JObject(pair.Value.Data.Select(
                        p => new JProperty(p.Key, p.Value))))))))));

        return context.Response.WriteAsync(json.ToString());
    }
}

在这里插入图片描述

2、注入服务

//添加健康检查服务
builder.Services.AddHealthChecks()
    .AddCheck<MySQLHealthCheck>("mysql_check")
    .AddCheck<RedisHealthCheck>("redis_check");
//健康检查服务接口地址
app.MapHealthChecks("/mysqlhealth", new HealthCheckOptions()
{//mysql
    Predicate = s => s.Name.Equals("mysql_check"),
    ResponseWriter = (HttpContext context, HealthReport result) =>
        {
            context.Response.ContentType = "application/json";

            var json = new JObject(
                new JProperty("status", result.Status.ToString()),
                new JProperty("results", new JObject(result.Entries.Select(pair => new JProperty(pair.Key,
                    new JObject(new JProperty("status", pair.Value.Status.ToString()),
                        new JProperty("description", pair.Value.Description),
                        new JProperty("data", new JObject(pair.Value.Data.Select(
                            p => new JProperty(p.Key, p.Value))))))))));

            return context.Response.WriteAsync(json.ToString());
        }
});

app.MapHealthChecks("/redishealth", new HealthCheckOptions() //redis
{
    Predicate = s => s.Name.Equals("redis_check"),
    ResponseWriter = (HttpContext context, HealthReport result) =>
    {
        context.Response.ContentType = "application/json";

        var json = new JObject(
            new JProperty("status", result.Status.ToString()),
            new JProperty("results", new JObject(result.Entries.Select(pair => new JProperty(pair.Key,
                new JObject(new JProperty("status", pair.Value.Status.ToString()),
                    new JProperty("description", pair.Value.Description),
                    new JProperty("data", new JObject(pair.Value.Data.Select(
                        p => new JProperty(p.Key, p.Value))))))))));

        return context.Response.WriteAsync(json.ToString());
    }
});

在这里插入图片描述

通过访问地址:http://ip:端口/mysqlhealth 查看mysql连接状态
通过访问地址:http://ip:端口/redishealth  查看redis连接状态

在这里插入图片描述

2.第三方包的使用

2.1 第三方包

GitHub:https://github.com/xabaril/AspNetCore.Diagnostics.HealthChecks 在这里插入图片描述

支持的服务健康检查的包有

Install-Package AspNetCore.HealthChecks.ApplicationStatus
Install-Package AspNetCore.HealthChecks.ArangoDb
Install-Package AspNetCore.HealthChecks.Aws.S3
Install-Package AspNetCore.HealthChecks.Aws.SecretsManager
Install-Package AspNetCore.HealthChecks.Aws.Sns
Install-Package AspNetCore.HealthChecks.Aws.Sqs
Install-Package AspNetCore.HealthChecks.Aws.SystemsManager
Install-Package AspNetCore.HealthChecks.Azure.IoTHub
Install-Package AspNetCore.HealthChecks.AzureDigitalTwin
Install-Package AspNetCore.HealthChecks.AzureKeyVault
Install-Package AspNetCore.HealthChecks.AzureServiceBus
Install-Package AspNetCore.HealthChecks.AzureStorage
Install-Package AspNetCore.HealthChecks.Consul
Install-Package AspNetCore.HealthChecks.CosmosDb
Install-Package AspNetCore.HealthChecks.DocumentDb
Install-Package AspNetCore.HealthChecks.DynamoDB
Install-Package AspNetCore.HealthChecks.Elasticsearch
Install-Package AspNetCore.HealthChecks.EventStore
Install-Package AspNetCore.HealthChecks.EventStore.gRPC
Install-Package AspNetCore.HealthChecks.Gcp.CloudFirestore
Install-Package AspNetCore.HealthChecks.Gremlin
Install-Package AspNetCore.HealthChecks.Hangfire
Install-Package AspNetCore.HealthChecks.IbmMQ
Install-Package AspNetCore.HealthChecks.Kafka
Install-Package AspNetCore.HealthChecks.Kubernetes
Install-Package AspNetCore.HealthChecks.MongoDb
Install-Package AspNetCore.HealthChecks.MySql
Install-Package AspNetCore.HealthChecks.Nats
Install-Package AspNetCore.HealthChecks.Network
Install-Package AspNetCore.HealthChecks.Npgsql
Install-Package AspNetCore.HealthChecks.OpenIdConnectServer
Install-Package AspNetCore.HealthChecks.Oracle
Install-Package AspNetCore.HealthChecks.RabbitMQ
Install-Package AspNetCore.HealthChecks.RavenDB
Install-Package AspNetCore.HealthChecks.Redis
Install-Package AspNetCore.HealthChecks.SendGrid
Install-Package AspNetCore.HealthChecks.SignalR
Install-Package AspNetCore.HealthChecks.Solr
Install-Package AspNetCore.HealthChecks.SqLite
Install-Package AspNetCore.HealthChecks.SqlServer
Install-Package AspNetCore.HealthChecks.System
Install-Package AspNetCore.HealthChecks.Uris

2.2 安装包

AspNetCore.HealthChecks.UI
AspNetCore.HealthChecks.UI.Client
AspNetCore.HealthChecks.UI.InMemory.Storage
AspNetCore.HealthChecks.MySql
AspNetCore.HealthChecks.Redis

在这里插入图片描述

2.3 设置启动

1、自写类监控检查

//添加健康检查服务
builder.Services.AddHealthChecks()
    .AddCheck<MySqlHealthCheck>("mysql_check")
    .AddCheck<RedisHealthCheck>("redis_check");
builder.Services.AddHealthChecksUI().AddInMemoryStorage();

//健康检查服务接口地址
app.MapHealthChecks("/mysqlhealth", new HealthCheckOptions()
{
    Predicate = s => s.Name.Equals("mysql_check"),
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

app.MapHealthChecks("/redishealth", new HealthCheckOptions()
{
    Predicate = s => s.Name.Equals("redis_check"),
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

app.MapHealthChecksUI();

在这里插入图片描述 启动程序访问:/healthchecks-ui 地址 在这里插入图片描述 2、相关包监控检查

//添加健康检查服务
builder.Services.AddHealthChecks()
    .AddTypeActivatedCheck<MySqlHealthCheck>("mysql_check", args: new[] { "server=120.79.63.89;userid=root;pwd=123456;port=3308;database=DB_SY_ERP;sslmode=none" })
    .AddTypeActivatedCheck<RedisHealthCheck>("redis_check", args: new[] { "localhost:6379,defaultDatabase=1" });

builder.Services.AddHealthChecksUI(setup =>
{
    //可配置
    setup.SetEvaluationTimeInSeconds(5); // UI 配置轮询间隔(以秒为单位)
    setup.SetApiMaxActiveRequests(1); // 运行状况检查 UI 后端 API 的最大活动请求数
    setup.MaximumHistoryEntriesPerEndpoint(50);//提供的最大历史记录条目数
    //setup.AddHealthCheckEndpoint("endpoint1", "http://localhost:8001/healthz");
    //setup.AddHealthCheckEndpoint("endpoint2", "http://remoteendpoint:9000/healthz");
    //setup.AddWebhookNotification("webhook1", uri: "http://httpbin.org/status/200?code=ax3rt56s", payload: "{...}");

}).AddInMemoryStorage();

//健康检查服务接口地址
app.MapHealthChecks("/mysqlhealth", new HealthCheckOptions()
{
    Predicate = s => s.Name.Equals("mysql_check"),
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});

app.MapHealthChecks("/redishealth", new HealthCheckOptions()
{
    Predicate = s => s.Name.Equals("redis_check"),
    ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
app.MapHealthChecksUI();

在这里插入图片描述 启动程序访问:/healthchecks-ui 地址 在这里插入图片描述 启动redis看下 在这里插入图片描述

标签:JProperty,yyds,04,Package,AspNetCore,Install,new,HealthChecks,CORE
From: https://blog.51cto.com/u_15437432/6180655

相关文章

  • JavaSE04流程控制语句
    第一章流程控制语句在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。1.1流程控制语句分类​ 顺序结构​ 判断和选择结构(if,switch)​ 循环结构(f......
  • ubuntu22.04 安装中文字体
    安装中文字体sudoapt-getinstallttf-wqy-microhei#文泉驿-微米黑sudoapt-getinstallttf-wqy-zenhei#文泉驿-正黑sudoapt-getinstallxfonts-wqy#文泉驿-点阵宋体vimrc#cat/etc/vim/vimrc....setfileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936set......
  • 第5章 使用路由将URL映射到Razor Pages(ASP.NET Core in Action, 2nd Edition)
    本章包括(请点击这里阅读其他章节)将URL映射到Razor页面使用约束和默认值匹配URL从路由参数生成URL在第4章中,您了解了MVC设计模式,以及ASP.NETCore如何使用它为使用RazorPages的应用程序生成UI。RazorPages包含类似小型控制器的页面处理程序。页面处理程序......
  • 第4章 使用Razor Pages创建网站(ASP.NET Core in Action, 2nd Edition)
    本章重点(请点击这里阅读其他章节)RazorPages和模型-视图-控制器(MVC)设计模式简介在ASP.NETCore中使用RazorPages在RazorPages和MVC控制器之间进行选择使用Action结果控制应用程序流通过第3章您已经了解了中间件管道,它定义了ASP.NETCore应用程序如何响应请......
  • 第1章 开始使用ASP.NET Core(ASP.NET Core in Action, 2nd Edition)
    第1部分ASP.NETCore入门如今,从社交媒体Web应用程序、新闻网站到手机应用程序,电子商务应用程序无处不在。在幕后,几乎总是有一台服务器在运行Web应用程序或HTTPAPI。Web应用程序具有无限的可扩展性、部署到云上以及高性能。在最好的情况下,开始可能会让人不知所措,带着如此......
  • ubuntu22.04 添加开机启动脚本
    在目录/etc/init.d/目录新建脚本sudovim/etc/init.d/startup.sh#!/bin/bash#Onlyfortesttouch/root/1.txt添加执行权限sudochmod+x/etc/init.d/startup.sh添加启动脚本sudoupdate-rc.dstartup.shdefaults90查看服务列表sudoservice--status-all测试是......
  • 【2023-04-08】连岳摘抄
    23:59我们没有权利假借后天的给予对别人颐指气使,也没有理由为后天的际遇而自怨自艾。在人之上,要视别人为人;在人之下,要视自己为人。                                             ......
  • 【2023-04-09】连岳摘抄
    23:59要想了解一个人,需要逐渐地、仔细地观察他,以免造成偏见和误解,那是过后很难纠正和挽回的。                                                 ——陀思妥耶夫斯基......
  • 20230409-Python-字符串-day6
    字符串4月9字符串是python中最常见的数据类型,我们可以使用单引号''、双引号""、三引号""""""来创建字符串,只要为变量分配一个值即可#单引号var1='helloword'#双引号var2="helloPython"#三引号,可以换行,如果没有变量名,这就是一个多行注释var......
  • ubuntu20.04下VSCode无法输入中文解决方法
    解决方法:重新安装VSCode。我一开始是在ubuntu商店下载的,结果上网查了了下,商店里的VSCode是阉割版的,想要输入中文就要重新安装。安装流程:先删除再安装。1.可以在商店里已安装界面下选择移除,或者sudosnapremovecode。删除后仍会保留已打开文件的记录,所以不用担心。2.删除完......