admin管理员组

文章数量:1441347

Spring Boot中的活动性和就绪性探测器

1. 概述

在本教程中,我们将看到Spring Boot 2.3如何与Kubernetes 探针集成,以创建更愉快的云原生体验。

首先,我们将从 Kubernetes 探针的一些背景开始。然后我们再看看Spring Boot 2.3如何支持这些探针。

2. Kubernetes 探针

当使用 Kubernetes 作为我们的编排平台时,每个节点中的kubelet负责保持该节点中的 Pod 健康。

例如,有时我们的应用程序可能需要一点时间才能接受请求。kubelet 可以确保应用程序仅在准备就绪时才收到请求。此外,如果 pod 的主进程因任何原因崩溃,kubelet 将重新启动容器。

为了履行这些职责,Kubernetes 有两个探测:活动探测和就绪探测。

kubelet 将使用就绪性探测来确定应用程序何时准备好接受请求。更具体地说,当 Pod 的所有容器都准备就绪时,它就准备好了。

同样,kubelet 可以通过活体探测器检查POD是否还活着。基本上,活体探测器可以帮助 kubelet 知道何时应该重新启动容器。

现在我们已经熟悉了这些概念,让我们看看 Spring 引导集成是如何工作的。

3. 执行器的活性和准备情况

从 Spring Boot 2.3 开始,LivenessStateHealthIndicator 和RereadynessStateHealthIndicator类将公开应用程序的活动性和就绪状态。当我们将应用程序部署到 Kubernetes 时,Spring Boot 将自动注册这些健康指标。

因此,我们可以分别使用 /actuator/health/liveness 和 /actuator/health/readiness端点作为我们的 Retention 和 READINESS 探测器。

例如,我们可以将这些添加到我们的 pod 定义中,以将活动探测配置为 HTTP GET 请求:

代码语言:javascript代码运行次数:0运行复制
livenessProbe:
  httpGet:
    path: /actuator/health/liveness
    port: 8080
    initialDelaySeconds: 3
    periodSeconds: 3

我们通常会让Spring Boot决定何时为我们架起这些探针。但是,如果我们愿意,我们可以在我们的application.properties 中手动启用它们。

如果我们使用的是 Spring Boot 2.3.0 或 2.3.1,我们可以通过配置属性启用上述探测器:

代码语言:javascript代码运行次数:0运行复制
management.health.probes.enabled=true

但是,从 Spring 引导 2.3.2 开始,由于配置混乱,此属性已被弃用。

如果我们使用 Spring Boot 2.3.2,我们可以使用新属性来启用活动性和就绪性探测:

代码语言:javascript代码运行次数:0运行复制
management.endpoint.health.probes.enabled=true
management.health.livenessState.enabled=true
management.health.readinessState.enabled=true

3.1. 就绪和活动状态转换

Spring Boot 使用两个枚举来封装不同的就绪和活动状态。对于就绪状态,有一个名为RereadynessState的枚举,具有以下值:

  • ACCEPTING_TRAFFIC状态表示应用程序已准备好接受流量
  • REFUSING_TRAFFIC状态表示应用程序还不愿意接受任何请求

同样,LivenessState枚举使用两个值表示应用的活动状态:

  • CORRECT值表示应用程序正在运行,其内部状态正确
  • 另一方面,BROKEN值表示应用程序正在运行,但出现一些致命故障

以下是 Spring 中应用程序生命周期事件方面的就绪性和活动状态的变化方式:

  1. 注册侦听器和初始值设定项
  2. 准备环境Environment
  3. 准备应用程序上下文ApplicationContext
  4. 装入 Bean 定义
  5. 将活动状态更改为“CORRECT”
  6. 调用应用程序和命令行运行程序
  7. 将就绪状态更改为ACCEPTING_TRAFFIC

一旦应用程序启动并运行,我们(和Spring本身)可以通过发布适当的AvailabilityChangeEvents来更改这些状态。

4. 管理应用程序可用性

应用程序组件可以通过注入应用程序可用性接口来检索当前的就绪状态和活动状态:

代码语言:javascript代码运行次数:0运行复制
@Autowired private ApplicationAvailability applicationAvailability;

然后我们可以按如下方式使用它:

代码语言:javascript代码运行次数:0运行复制
assertThat(applicationAvailability.getLivenessState())
  .isEqualTo(LivenessState.CORRECT);
assertThat(applicationAvailability.getReadinessState())
  .isEqualTo(ReadinessState.ACCEPTING_TRAFFIC);
assertThat(applicationAvailability.getState(ReadinessState.class))
  .isEqualTo(ReadinessState.ACCEPTING_TRAFFIC);

4.1. 更新可用性状态

我们还可以通过发布AvailabilityChangeEvent事件来更新应用程序状态:

代码语言:javascript代码运行次数:0运行复制
assertThat(applicationAvailability.getLivenessState())
  .isEqualTo(LivenessState.CORRECT);
mockMvc.perform(get("/actuator/health/liveness"))
  .andExpect(status().isOk())
  .andExpect(jsonPath("$.status").value("UP"));

AvailabilityChangeEvent.publish(context, LivenessState.BROKEN);

assertThat(applicationAvailability.getLivenessState())
  .isEqualTo(LivenessState.BROKEN);
mockMvc.perform(get("/actuator/health/liveness"))
  .andExpect(status().isServiceUnavailable())
  .andExpect(jsonPath("$.status").value("DOWN"));

如上所示,在发布任何事件之前,/执行器/运行状况/活动终结点返回具有以下 JSON 的 200 OK 响应:

代码语言:javascript代码运行次数:0运行复制
{
    "status": "OK"
}

然后,在中断活动状态后,同一终结点将返回具有以下 JSON 的 503 服务不可用响应:

代码语言:javascript代码运行次数:0运行复制
{
    "status": "DOWN"
}

当我们更改为就绪状态 REFUSING_TRAFFIC 时,状态值将OUT_OF_SERVICE:

代码语言:javascript代码运行次数:0运行复制
assertThat(applicationAvailability.getReadinessState())
  .isEqualTo(ReadinessState.ACCEPTING_TRAFFIC);
mockMvc.perform(get("/actuator/health/readiness"))
  .andExpect(status().isOk())
  .andExpect(jsonPath("$.status").value("UP"));

AvailabilityChangeEvent.publish(context, ReadinessState.REFUSING_TRAFFIC);

assertThat(applicationAvailability.getReadinessState())
  .isEqualTo(ReadinessState.REFUSING_TRAFFIC);
mockMvc.perform(get("/actuator/health/readiness"))
  .andExpect(status().isServiceUnavailable())
  .andExpect(jsonPath("$.status").value("OUT_OF_SERVICE"));

4.2. 倾听变化

我们可以注册事件侦听器,以便在应用程序可用性状态更改时收到通知:

代码语言:javascript代码运行次数:0运行复制
@Component
public class LivenessEventListener {
    
    @EventListener
    public void onEvent(AvailabilityChangeEvent<LivenessState> event) {
        switch (event.getState()) {
        case BROKEN:
            // notify others
            break;
        case CORRECT:
            // we're back
        }
    }
}

在这里,我们正在侦听应用程序活动状态的任何变化。

5. 自动配置

在结束之前,让我们看看 Spring Boot 如何在 Kubernetes 部署中自动配置这些探测。AvailabilityProbesAutoConfiguration类负责有条件地注册活动探测器和就绪探测器。

事实上,当满足以下条件之一时,即注册探测器

  • Kubernetes是部署环境
  • management.health.probes.enabled属性设置为true

当应用程序满足上述任一条件时,自动配置将注册LivenessStateHealthIndicatorRereadynessStateHealthIndicator

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-03-13,如有侵权请联系 cloudcommunity@tencent 删除boot配置事件javaspring

本文标签: Spring Boot中的活动性和就绪性探测器