Spring Boot 的存活和就绪探针

工程 | Brian Clozel | 2020年3月25日 | ...

更新:此博文已更新,以反映 Spring Boot 2.3.0.RC1 中发布的更改。

Spring Boot 团队正在积极为即将发布的 2.3.0 版本开发 Kubernetes 主题。在创建 Docker 镜像优雅关闭支持之后,现在该介绍存活和就绪探针支持了。

在我们的 2.2.0 版本中,Spring Boot 附带了健康组支持,允许开发者选择健康指标的子集,并将它们分组到单个相关的健康状态下。

即使有了这项新功能,我们发现我们仍然可以为 Spring 社区提供更多内容,在 Kubernetes 方面提供更多意见和指导。

Kubernetes 中的存活和就绪探针

在 Kubernetes 中,存活和就绪 Kubernetes 概念代表了应用程序状态的各个方面。

应用程序的存活状态表示其内部状态是否有效。如果存活状态中断,则表示应用程序本身处于故障状态,无法从中恢复。在这种情况下,最佳做法是重新启动应用程序实例。例如,依赖本地缓存的应用程序如果本地缓存损坏且无法修复,则应使其存活状态失败。

就绪状态表示应用程序是否已准备好接受客户端请求。如果就绪状态为未就绪,则 Kubernetes 不应将流量路由到此实例。如果应用程序过于繁忙地处理任务队列,则可以将其声明为繁忙状态,直到其负载再次可控。

将存活和就绪探针作为 Spring Boot 的核心概念

这些存活和就绪概念不仅适用于 Kubernetes,而且通常很有用,无论部署平台如何。我们正在引入LivenessStateReadinessState,它们是这些概念的不可变表示。您可以随时从ApplicationAvailability中获取它们。

// Available as a component in the application context
ApplicationAvailability availability;

LivenessState livenessState = availabilityProvider.getLivenessState();
ReadinessState readinessState = availabilityProvider.getReadinessState()

仅轮询模型,需要执行检查才能知道应用程序的状态是不完整的。只有应用程序本身知道其生命周期(启动、关闭)或可以提供有关运行时错误的上下文(在处理任务时最终处于损坏状态)。Spring Boot 应用程序上下文在应用程序的生命周期中会原生发布这些事件;您的应用程序代码也应该能够对此做出贡献。

这就是我们选择使用 Spring Application Event 模型来更改可用性状态并侦听更新的原因。

/**
 * Component that checks that the local cache is in a valid state.
 */
@Component
public class LocalCacheVerifier {

    private final ApplicationEventPublisher eventPublisher;

    public LocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void checkLocalCache() {
        try {
            //...
        }
        catch (CacheCompletelyBroken ex) {
            AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
        }
    }

}

组件还可以使用@EventListener(或通过实现ApplicationListener)侦听这些事件。查看参考文档以获取更多信息

此支持直接随spring-boot模块一起提供,并为所有 Spring Boot 应用程序激活;这使其可用于所有类型的应用程序(Web、批处理等),并允许您实现不一定要与 HTTP 绑定的探针。

使用 Spring Boot Actuator 公开 Kubernetes 探针

您可能对一个非常常见的用例感兴趣:在 Kubernetes 上部署 Web 应用程序并配置 HTTP 探针。将 Spring Boot Actuator 依赖项添加到您的应用程序是唯一的要求!Actuator 将使用健康支持来配置存活和就绪 HTTP 探针

Actuator 将从ApplicationAvailability收集“存活”和“就绪”信息,并在专用健康指标中使用这些信息:LivenessStateHealthIndicatorReadinessStateHealthIndicator。这些指标将显示在全局健康端点("/actuator/health")上。它们还将作为使用健康组的单独 HTTP 探针公开:"/actuator/health/liveness""/actuator/health/readiness"

在 Kubernetes 上运行的应用程序将显示以下健康报告

// https://127.0.0.1:8080/actuator/health
// HTTP/1.1 200 OK

{
  "status": "UP",
  "components": {
    "diskSpace": {
      "status": "UP",
      "details": { //...
      }
    },
    "livenessProbe": {
      "status": "UP"
    },
    "ping": {
      "status": "UP"
    },
    "readinessProbe": {
      "status": "UP"
    }
  },
  "groups": [
    "liveness",
    "readiness"
  ]
}

调用存活组时,Kubernetes 将获取以下内容

// https://127.0.0.1:8080/actuator/health/liveness
// HTTP/1.1 200 OK

{
  "status": "UP",
  "components": {
    "livenessstate": {
      "status": "UP"
    }
  }
}

标记为未就绪的应用程序将为就绪组报告以下内容

// https://127.0.0.1:8080/actuator/health/readiness
// HTTP/1.1 503 SERVICE UNAVAILABLE

{
  "status": "OUT_OF_SERVICE",
  "components": {
    "readinessstate": {
      "status": "OUT_OF_SERVICE"
    }
  }
}

HTTP 探针仅为在 Kubernetes 上运行的应用程序配置。您可以通过使用management.health.probes.enabled=true配置属性手动启用探针来在本地试用。由于探针是健康组,因此您将获得许多其他功能,例如配置 HTTP 状态映射器、安全性、详细信息可见性……

当然,您可以配置其他健康指标作为探针的一部分,检查外部系统(数据库、Web API、共享缓存)的状态。给定现有的CacheCheckHealthIndicator,您可以使用以下方法增强存活探针:

management.endpoint.health.group.liveness.include=livenessstate,cacheCheck

您应该仔细考虑将外部状态与存活或就绪状态关联起来,这就是 Spring Boot 默认情况下不添加任何内容的原因。每个应用程序和部署都不同,但我们致力于在社区的帮助下提供指导并调整默认值 - 查看我们参考文档中的“使用 Kubernetes 探针检查外部状态”部分

Spring Boot 2.3.0.RC1 中可用

结合优雅关闭,此功能将帮助您处理 Kubernetes 中应用程序和容器的生命周期 - 我们已经开始在参考文档中提供有关 Kubernetes 部署和配置的指导

此新功能将与我们即将推出的 2.3 里程碑版本一起提供;我们迫不及待地想听到您的反馈!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部