【微服务部署】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"
    }
    ],

相关推荐
亚历克斯神13 分钟前
Java 职业发展:2026 指南
java·spring·微服务
刘~浪地球19 分钟前
云原生与容器--Kubernetes 生产环境部署实战
云原生·容器·kubernetes
西门吹-禅26 分钟前
java 微服务学习笔记
java·学习·微服务
weixin_397578021 小时前
飞书与外部系统集成:开发视角全指南
微服务
AI茶水间管理员1 小时前
如何让LLM稳定输出 JSON 格式结果?
前端·人工智能·后端
其实是白羊1 小时前
我用 Vibe Coding 搓了一个 IDEA 插件,复制URI 再也不用手动拼了
后端·intellij idea
用户8356290780511 小时前
Python 操作 Word 文档节与页面设置
后端·python
酒後少女的夢2 小时前
设计模式教程
后端·架构
凌览2 小时前
别再手搓 Skill 了,用这个工具 5 分钟搞定
前端·后端
游乐码2 小时前
c#lambad表达式
开发语言·c#