• 解决Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题


    现象

    在将Spring Boot应用部署到Kubernetes上时,健康检查接口/actuator/health返回的状态为{"status":"OUT_OF_SERVICE","groups":["liveness","readiness"]},而期望的是返回正常的健康状态。值得注意的是,我司统一的参照规范是将/actuator/health重定向到/healthcheck接口,并且三种探针的HTTP检查路径也都是/healthcheck

    问题原因

    从 Spring Boot 2.3 开始,LivenessStateHealthIndicator 和RereadynessStateHealthIndicator类将公开应用程序的活动性和就绪状态。当我们将应用程序部署到 Kubernetes 时,Spring Boot 将自动注册这些健康指标。而本次的问题是一次dubbo客户端升级导致的,目前不清楚是否是dubbo升级导致了其他依赖的版本更新。

    解决方法


    为了解决这个问题,我们可以采取以下步骤:

    https://springdoc.cn/spring-boot/actuator.html#actuator.endpoints.health.writing-custom-health-indicators

    该链接展示了Spring Boot Actutor在几种健康状态下返回的HTTP状态代码,如下图:

     

    1.创建一个自定义的HealthEndpoint来处理健康检查请求,并将readiness或liveness的状态映射为UP/UNKNOWN状态。

    1. import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
    2. import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
    3. import org.springframework.boot.actuate.health.Health;
    4. import org.springframework.boot.actuate.health.HealthEndpoint;
    5. import org.springframework.boot.actuate.health.Status;
    6. import org.springframework.stereotype.Component;
    7. @Component
    8. @Endpoint(id = "health")
    9. public class CustomHealthEndpoint {
    10. private final HealthEndpoint healthEndpoint;
    11. public CustomHealthEndpoint(HealthEndpoint healthEndpoint) {
    12. this.healthEndpoint = healthEndpoint;
    13. }
    14. @ReadOperation
    15. public Health health() {
    16. Health health = healthEndpoint.health();
    17. Status status = health.getStatus();
    18. // 如果状态是readiness或liveness,则设置为UNKNOWN,否则返回原始健康状态
    19. if (status.getCode().equals("readiness") || status.getCode().equals("liveness")) {
    20. return Health.unknown().withDetails(health.getDetails()).build();
    21. } else {
    22. return health;
    23. }
    24. }
    25. }

    2.将out_of_service返回的状态码映射成200。

    application.properties:

    management.endpoint.health.status.http-mapping.out-of-service=200
    

    application.yml:

    1. management:
    2. endpoint:
    3. health:
    4. status:
    5. http-mapping.out-of-service:200

    通过上述配置,当应用程序的健康状态被判断为"out-of-service"时,Actuator将使用HTTP响应码200来表示该状态。这意味着当使用Actuator的健康检查端点时,如果应用程序的健康状态为"out-of-service",将返回HTTP响应码200。

    总结


    通过自定义HealthEndpoint和配置探针的HTTP路径,我们成功解决了Spring Boot应用在Kubernetes上健康检查接口返回OUT_OF_SERVICE的问题。现在,健康检查接口返回正确的健康状态,并且探针路径也与公司的重定向配置保持一致。这样,我们可以确保应用在Kubernetes环境中的健康检查正常运行,同时满足公司的需求。

  • 相关阅读:
    详解分布式系统的幂等
    辉芒微IO单片机FT60F12F-MRB
    1 随机事件与概率
    【群晖NAS】Synology drive套件安装设置与结合内网穿透实现远程访问——“cpolar内网穿透”
    Python使用Mechanize库完成自动化爬虫程序
    【微信小程序】遍历列表数据,循环使用canva生成图片并下载
    Python爬取小说(requests和BeautifulSoup)
    代码随想录day48|转行当小偷咯|打家劫舍系列|Golang
    javaee springMVC session的使用
    部署SeaTunnel单节点Standalone 模式环境
  • 原文地址:https://blog.csdn.net/kingu_crimson/article/details/134511210