【微服务部署】03-健康检查

news/2024/5/19 20:57:09 标签: 微服务, .netcore, 后端, c#, kubernetes

文章目录

    • 1. 探针集成实现高可用
      • 1.1 LivenessProbe
      • 1.2 ReadinessProbe
      • 1.3 StartupProbe
    • 2. 健康检查看板
      • 2.1 组件包

1. 探针集成实现高可用

  • Liveness
  • Readiness
  • Startup

1.1 LivenessProbe

  • 判断服务是否存活
  • 结束“非存活”状态服务
  • 根据重启策略决定是否重启服务

1.2 ReadinessProbe

  • 判断服务是否“就绪”
  • “就绪”状态的服务可以接收请求
  • 非“就绪”状态的服务将会被从流量负载中摘除

1.3 StartupProbe

  • 检测应用程序是否启动成功
  • 启动探针执行成功后,将不再执行,除非应用重启
  • 当启动探针检测成功后,其它探针才开始工作
  • 适合启动较慢的应用配置
  • Kuberbetes 1.16以后的支持
// startup
internal static bool Ready { get; set; } = true;
internal static bool Live { get; set; } = true;

public void ConfigureServices(IServiceCollection services)
{
	...
	// 注册健康检查
	services.AddHealthChecks()
            .AddMySql(Configuration.GetValue<string>("Mysql"), "mysql", tags: new string[] { "mysql", "live", "all" })// tags标签分组
             .AddRabbitMQ(s =>
             {
                 var connectionFactory = new RabbitMQ.Client.ConnectionFactory();
                 Configuration.GetSection("RabbitMQ").Bind(connectionFactory);
                 return connectionFactory;
             }, "rabbitmq", tags: new string[] { "rabbitmq", "live", "all" })
             .AddCheck("liveChecker", () =>
             {
                 return Live ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy();
             }, new string[] { "live", "all" })
             .AddCheck("readyChecker", () =>
             {
                 return Ready ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy();
             }, new string[] { "ready", "all" });
}

// 
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 {
 	...
 	app.UseEndpoints(endpoints =>
            {
                endpoints.MapMetrics();
                endpoints.MapHealthChecks("/live", new HealthCheckOptions { Predicate = registration => registration.Tags.Contains("live") });// 检查标记了live的检查项
                endpoints.MapHealthChecks("/ready", new HealthCheckOptions { Predicate = registration => registration.Tags.Contains("ready") });
                endpoints.MapHealthChecks("/hc", new Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions
                {
                    ResponseWriter = HealthChecks.UI.Client.UIResponseWriter.WriteHealthCheckUIResponse
                });// 没有传检查项,检查所有
                endpoints.MapControllers();
                endpoints.MapGrpcService<GeekTime.Ordering.API.Grpc.OrderServiceImpl>();
            });
 }
 
 // Controller调用
 // 设置Ready的值
 [HttpGet]
 public IActionResult SetReady([FromQuery]bool ready)
 {
     Startup.Ready = ready;
     if (!ready)
     {
         Task.Run(async () =>
         {
             await Task.Delay(60000);
             Startup.Ready = true;
         });
     }
     return Content($"{Environment.MachineName} : Ready={Startup.Ready}");
 }
 
 // 设置live
[HttpGet]
public IActionResult SetLive([FromQuery]bool live)
 {
     Startup.Live = live;
     return Content($"{Environment.MachineName} : Live={Startup.Live}");
 }

// 程序退出
[HttpGet]
public IActionResult Exit([FromServices]IHostApplicationLifetime application)
  {
      Task.Run(async () =>
      {
          await Task.Delay(3000);
          application.StopApplication();
      });
      return Content($"{Environment.MachineName} : Stopping");
  }

2. 健康检查看板

AspNetCore.Diagnostics.HealthCheck项目,开源社区项目插件

2.1 组件包

  • 探针检测端:AspNetCore.HealthChecks.UI
  • 应用端输出:AspNetCore.HealthChecks.UI.Client
  • 应用端检查项:AspNetCore.HealthChecks.Xxx
// startup
public void ConfigureServices(IServiceCollection services)
{
     services.AddMvc();
     services.AddHealthChecks();
     services.AddHealthChecksUI();
 }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
       if (env.IsDevelopment())
       {
           app.UseDeveloperExceptionPage();
       }

       app.UseRouting();
       app.UseEndpoints(endpoints =>
       {
           endpoints.MapHealthChecks("/live");
           endpoints.MapHealthChecks("/ready");
           endpoints.MapHealthChecks("/hc");
           endpoints.MapMetrics();
           endpoints.MapHealthChecksUI();// 使得dashboard生效
           endpoints.MapControllers();
       });
   }

// 配置文件配置需要检查的项目
"HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "geektime-ordering-api",
        "Uri": "http://geektime-ordering-api/hc"
      },
      {
        "Name": "geektime-mobile-apiaggregator",
        "Uri": "http://geektime-mobile-apiaggregator/hc"
      },
      {
        "Name": "geektime-mobile-gateway",
        "Uri": "http://geektime-mobile-gateway/hc"
      }
    ],

http://www.niftyadmin.cn/n/4982125.html

相关文章

故障演练实战

做了两年多的故障演练&#xff0c; 一直想聊聊自己对故障演练的理解&#xff0c;但是每次提起笔都不知道写一些什么。 什么是故障演练 为什么要做故障演练 在没做故障演练之前&#xff0c;我想很多人可能和我有一样的想法&#xff0c;我的系统跑了好多年&#xff0c;也没出什么…

感觉车载测试的这一波敏捷风快过去了

敏捷&#xff0c;算不得汽车行业的原生产物&#xff0c;几年前&#xff0c;耳边很少听到这个字眼&#xff0c;基本算是在近几年传统汽车行业开始衰落的大背景下&#xff0c;而后伴随着软件从互联网等行业传进来的。 这两年&#xff0c;大家开始把敏捷谈得风生水起&#xff0c;…

QOpenGLWidget绘制实时图像

initializeGL()函数&#xff1a; initializeOpenGLFunctions();//创建VBO和VAO对象&#xff0c;并赋予IDglGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);//绑定VBO和VAO对象glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);//为当前绑定到target的缓冲…

媒体服务器与视频服务器有什么区别

媒体服务器与视频服务器有什么区别 流媒体服务器用在远程教育&#xff0c;视频点播、网络电台、网络视频等方面。 直播过程中就需要使用流媒体服务器&#xff0c;一个完整的直播过程&#xff0c;包括采集、处理、编码、封包、推流、传输、转码、分发、解码、播放等过程&#xf…

一文秒懂期权真的是高风险、高收益吗?

期权是一种高风险、高收益的投资品种&#xff0c;为什么这样说&#xff1f;因为期权市场中的风险客观来说还是比较大的&#xff0c;如果投资者在入市前不做充分的了解&#xff0c;很容易就会亏损&#xff0c;下面&#xff0c;我们为大家介绍一文秒懂期权真的是高风险、高收益吗…

第一百二十九回 Visibility组件

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了ModalBarrier组件相关的内容&#xff0c;本章回中将介绍Visibility组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的Visibility组件是一种容器类组件&#xff0c;主要用来显示和…

【大数据】Flink 详解(六):源码篇 Ⅰ

Flink 详解&#xff08;六&#xff09;&#xff1a;源码篇 Ⅰ 55、Flink 作业的提交流程&#xff1f;56、Flink 作业提交分为几种方式&#xff1f;57、Flink JobGraph 是在什么时候生成的&#xff1f;58、那在 JobGraph 提交集群之前都经历哪些过程&#xff1f;59、看你提到 Pi…

漏洞挖掘-利用

一、文章简介 整合一些web漏洞&#xff0c;以及对漏洞的理解。 二、Web漏洞 1.SQL注入 &#xff08;1&#xff09;定义 开发者程序编写过程中&#xff0c;对传入用户数据过滤不严格&#xff0c;将可能存在的攻击载荷拼接到SQL查询语句当中&#xff0c;再将这些查询语句传递到…