文章目录

  • 1.介绍
  • 2.Kubernetes探针
  • 3.就绪探针和存活探针在Actuator
    • 3.1.就绪和活跃状态转换
  • 4. 管理应用程序可用性
    • 4.1. 更新可用性状态
    • 4.2.监听变化

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 Boot 集成是如何工作的。

3.就绪探针和存活探针在Actuator

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

因此,可以分别使用 /actuator/health/liveness 和 /actuator/health/readiness 端点作为liveness 和 readiness 探针。

例如,以将这些添加到 pod 定义中,以将活性探针配置为 HTTP GET 请求:

livenessProbe:httpGet:path: /actuator/health/livenessport: 8080initialDelaySeconds: 3periodSeconds: 3

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

如果使用 Spring Boot 2.3.0 或 2.3.1,可以通过配置属性启用上述探针:

management.health.probes.enabled=true

但是,从 Spring Boot 2.3.2 开始,由于配置混乱,不推荐使用此属性。

如果使用 Spring Boot 2.3.2,可以使用新属性来启用 liveness 和 readiness 探针:

management.endpoint.health.probes.enabled=true
management.health.livenessState.enabled=true
management.health.readinessState.enabled=true
management:endpoint:health:probes:enabled: truehealth:livenessstate:enabled: truereadinessstate:enabled: true

3.1.就绪和活跃状态转换

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

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

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

  • CORRECT 值表示应用程序正在运行并且其内部状态是正确的
  • 另一方面,BROKEN 值意味着应用程序运行时出现了一些致命故障

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

  • 注册监听器和初始化器
  • 准备环境
  • 准备应用程序上下文
  • 加载 bean 定义
  • 将活动状态更改为 CORRECT
  • 调用应用程序和命令行运行程序
  • 将就绪状态更改为 ACCEPTING_TRAFFIC

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

4. 管理应用程序可用性

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

@Autowired
private ApplicationAvailability applicationAvailability;

然后可以这样使用它:

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 事件来更新应用程序状态:

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"));

如上所示,在发布任何事件之前,/actuator/health/liveness 端点使用以下 JSON 返回 200 OK 响应:

{"status": "OK"
}

然后在打破活跃状态后,同一个端点返回一个 503 服务不可用响应,其中包含以下 JSON:

{"status": "DOWN"
}

当更改为 REFUSING_TRAFFIC 的就绪状态时,状态值为 OUT_OF_SERVICE

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.监听变化

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

@Component
public class LivenessEventListener {@EventListenerpublic void onEvent(AvailabilityChangeEvent<LivenessState> event) {switch (event.getState()) {case BROKEN:// notify othersbreak;case CORRECT:// we're back}}
}

SpringBoot中就绪探针和存活探针相关推荐

  1. K8s之就绪探针和存活探针

    前言:集群中自带两种探针方式,先演示下各种探针的使用方法和功能表现 就绪探针(判断是否就绪,状态栏READY) 测试pod apiVersion: v1 kind: Pod metadata:name ...

  2. Kubernetes 存活探针和就绪探针的最佳实践

    Kubernetes存活探针和就绪探针的最佳实践 [编者的话]Kubernetes提供了两种探针来检查容器的状态,Liveliness和Readiness,根据官方文档,Liveliness探针是为了 ...

  3. Kubernetes存活探针和就绪探针的最佳实践

    在Kubernetes中,Pod是Kubernetes创建及管理的最小的可部署的计算单元,一个Pod由一个或者多个容器(Docker,rocket等等)组成,这些容器共享内存,网络以及运行容器的方式. ...

  4. pod健康检查之容器的存活探针、就绪探针、启动探针

    前言 环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6 为什么需要存活探针和就绪探针 在前面我们介绍过,可以通过配置restartPo ...

  5. K8S使用就绪和存活探针配置健康检查

    本文转自:K8S使用就绪和存活探针配置健康检查 | 王柏元的博客,评论请前往原网站 一. 健康检查 健康检查(Health Check)可用于服务运行的状态监控,比如腾讯旗下的DNSPOD的D监控,要 ...

  6. k8s存活探针的简介与使用

    简介 k8s可以通过存活探针liveness probe检查容器是否还在运行.可以为pod中的容器单独指定存活探针,如果探测失败,k8s将定期执行探针并重启容器 k8s有三种探测容器的机制: HTTP ...

  7. redis基本操作和在springboot中的使用

    本文介绍redis的使用 redis启动步骤 说明 redis自增自减相关操作 redis string set操作 get操作 其他操作 redis hash set操作 get操作 其他操作 re ...

  8. 【SpringBoot】在SpringBoot中使用Ehcache

    SpringBoot提供了对缓存的支持,通过在启动类中添加@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者: ...

  9. SpringBoot中的 ApplicationEvent和Listener

    SpringBoot中除了常用的Spring框架事件,如ContextRefreshedEvent,一个SpingApplication类还能发布一些额外的事件: 注意:事实上一些事件通常在Appli ...

最新文章

  1. Oracle中对现有表增加列
  2. 服务器可视化_疫情来袭,30分钟学会用python开发部署疫情可视化网站
  3. gorm 密码字段隐藏_KeeWeb for mac(密码管理工具)
  4. mysql权限系统的工作原理_Mysql权限系统工作原理
  5. 在JSP页面中,对同名的CHECKBOX的处理
  6. Keil(MDK-ARM-STM32)介绍、下载、安装与注册
  7. oracle如何判断奇数偶数_堆垒素数论之旅(1):奇数哥德巴赫猜想
  8. matlab 判断元素索引_MATLAB通过索引访问数组元素
  9. Struts2教程3:struts.xml常用配置解析
  10. 在mysql中修改表名的sql语句
  11. 单机配置tomcat 8 集群
  12. php adodb类库下载,PHP ADODB连接、操作数据库类
  13. C#网易云音乐中需付费歌曲的下载助手。
  14. 在计算机内部.机器码的形式,在计算机内部,机器码的形式是____。
  15. 2023 年(MCM/ICM)美国大学生数学建模竞赛参赛规则及注意事项
  16. java面试换背景颜色_正在修生养息,突然收到阿里(蚂蚁)面试电话,四面阿里面经总结...
  17. php数据库内容在漂亮表格呈现
  18. 2015美国大学计算机科学专业排名,USNews2015美国大学计算机科学专业研究生排名...
  19. Linux下磁盘配额设置
  20. CAN总线协议:标准CAN和扩展CAN

热门文章

  1. np.astype uint8之后发生了什么
  2. 经典 【操作系统实验】 实验六 设备驱动程序 RH5 2.6.18 + 2.6.32 内核
  3. linux中time函数
  4. 《HTML5+CSS3+JavaScript前端开发从零开始学(视频教学版)》简介
  5. Klocwork — 符合功能安全要求的自动化静态测试工具
  6. vue路由重定向到登录页面_Vue 组件单元测试究竟测试什么?
  7. 【求解】PS安装后,存储黑屏,一直不能执行
  8. 判断IE10以下提示更换浏览器
  9. hibernate运行一段时候后出现假死现象
  10. 手把手教你用Jenkins做dotnet core自动化发布