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

文章目录

    • [1. 探针集成实现高可用](#1. 探针集成实现高可用)
      • [1.1 LivenessProbe](#1.1 LivenessProbe)
      • [1.2 ReadinessProbe](#1.2 ReadinessProbe)
      • [1.3 StartupProbe](#1.3 StartupProbe)
    • [2. 健康检查看板](#2. 健康检查看板)
      • [2.1 组件包](#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"
    }
    ],

相关推荐
原机小子43 分钟前
SpringBoot在线教育系统:从零到一的构建过程
数据库·spring boot·后端
2401_857439691 小时前
SpringBoot在线教育平台:设计与实现的深度解析
java·spring boot·后端
总是学不会.1 小时前
SpringBoot项目:前后端打包与部署(使用 Maven)
java·服务器·前端·后端·maven
yngsqq3 小时前
005集—— 用户交互之CAD窗口选择图元实体(CAD—C#二次开发入门)
windows·c#·交互
凡人的AI工具箱4 小时前
15分钟学 Python 第38天 :Python 爬虫入门(四)
开发语言·人工智能·后端·爬虫·python
丶21364 小时前
【SQL】深入理解SQL:从基础概念到常用命令
数据库·后端·sql
木子02044 小时前
Nacos的应用
后端
哎呦没4 小时前
Spring Boot框架在医院管理中的应用
java·spring boot·后端
陈序缘5 小时前
Go语言实现长连接并发框架 - 消息
linux·服务器·开发语言·后端·golang
络75 小时前
Spring14——案例:利用AOP环绕通知计算业务层接口执行效率
java·后端·spring·mybatis·aop