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

news2024/11/15 20:06:18

现象

在将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状态。

import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthEndpoint;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;

@Component
@Endpoint(id = "health")
public class CustomHealthEndpoint {

    private final HealthEndpoint healthEndpoint;

    public CustomHealthEndpoint(HealthEndpoint healthEndpoint) {
        this.healthEndpoint = healthEndpoint;
    }

    @ReadOperation
    public Health health() {
        Health health = healthEndpoint.health();
        Status status = health.getStatus();

        // 如果状态是readiness或liveness,则设置为UNKNOWN,否则返回原始健康状态
        if (status.getCode().equals("readiness") || status.getCode().equals("liveness")) {
            return Health.unknown().withDetails(health.getDetails()).build();
        } else {
            return health;
        }
    }
}

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

application.properties:

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

application.yml:

management:
    endpoint:
        health:
            status:
                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环境中的健康检查正常运行,同时满足公司的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单脉冲测角-和差比幅法-方向图传播因子-函数编写

方向图传播因子-函数编写 和差比幅法单脉冲测角原理代码仿真结果参数说明 和差比幅法单脉冲测角原理 有关单脉冲测角和差比幅法的原理已经在博文单脉冲测角-和差比幅法中详细介绍了,我们在实际仿真的时候,往往需要在给定来波方向下方向图转化因子&#…

关于代码混淆,看这篇就够了

​ 代码混淆一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢?混淆(obfuscate)技术。注意:用obfuscate防盗版是根本不可能&#xff0c…

java 实现发送邮箱,复制即用,包含邮箱设置第三方登录授权码获取方法

application.yml spring:profiles:active: dev # active: test#邮件附件上传文件大小限制servlet:multipart:max-file-size: 50MB #单个文件大小限制max-request-size: 100MB #总文件大小限制(允许存储文件的文件夹大小)mail:default-encoding: UTF…

[uni-app] uni.showToast 一闪而过问题/设定时间无效/1秒即逝

toast一闪就消失 1.猜测频繁点击导致 – 排除 2.猜测再定时器内导致-- 排除 3.和封装的接口调用一起导致 - 是改原因 深挖发现: axios封装中, 对loading/hindloading进行了配置, 看来是 showToast 与 loading等冲突导致的 wx.hideLoading(Object object) 解决办法 再封装的…

数据结构与算法之美学习笔记:23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?

目录 前言树(Tree)二叉树(Binary Tree)二叉树的遍历解答开篇 & 内容小结 前言 本节课程思维导图: 前面我们讲的都是线性表结构,栈、队列、链表等等。今天我们讲一种非线性表结构,树。问题&…

开源免费的流程设计器如何选型

大家在开发OA办公自动化、ERP、CRM、BPM、低代码平台等项目的时候,经常用到流程引擎,目前主流的开源流程引擎有activiti、flowable、camunda。这几个开源的流程引擎均基于BPMN2.0国际规范标准,其功能均比较强大,接口也很丰富。但涉…

远程数据采集继电器RTU如何应用在智能电动汽车充电桩

远程数据采集继电器(Remote Terminal Unit,RTU)在智能电动汽车充电桩中的应用,可以为充电桩系统提供更高效、安全和可靠的远程监控与控制功能。下面将详细说明RTU在智能电动汽车充电桩中的应用。 远程监控功能: RTU可以…

找不到msvcp110.dll怎么办,msvcp110.dll丢失的修复方法

您可能已经碰见过这样的情况,当您试图打开某个软件时,屏幕上突然跳出一个提示窗口,告诉您 “找不到msvcp110.dll”,“msvcp110.dll丢失”。遇到这种情况是不是让人很焦头烂额呀?别担心,接下来我就为您提供几…

NX二次开发UF_CAM_ask_clear_plane_tag 函数介绍

文章作者:里海 来源网站:里海NX二次开发3000例专栏 UF_CAM_ask_clear_plane_tag Defined in: uf_cam_planes.h int UF_CAM_ask_clear_plane_tag(tag_t object_tag, tag_t * target_tag ) overview 概述 Query the tag of a clearance plane 查询清洁…

使用低代码可视化开发平台快速搭建应用

目录 一、JNPF可视化平台介绍 二、搭建JNPF可视化平台 【表单设计】 【报表设计】 【流程设计】 【代码生成器】 三、使用JNPF可视化平台 1.前后端分离: 2.多数据源: 3.预置功能: 4.私有化部署: 四、总结 可视化低代码…

Spring:IoC,AOP,SpringEL表达式

IoC容器 IoC ,Spring全家桶各个功能模块的基础,是创建对象的容器。 IoC概念 控制反转,将对象的创建进行反转,常规情况下对象由开发者手动创建,而使用IoC不再需要创建对象,由IoC容器根据需求自动创建项目…

ESP32C3小飞控调试

ESP32C3小飞控调试 - 1 ESP32C3小飞控板赶在国庆节前发出打样,假期后上班就收到了样板,但是迟迟没有动手调试,这两天终于抽出时间调试了,调试过程还算顺利,基本没有遇到什么大问题,下面记录一下调试过程。…

NLP | SimKGC论文详解及项目实现

本文主要讲解了论文SimKGC:基于预训练语言模型的简单对比KGC的论文总结以及项目实现。 论文题目:2022_SimKGC: Simple Contrastive Knowledge Graph Completion with Pre-trained Language Models 论文地址:2022.acl-long.295.pdf (aclanthol…

Java的IO流-转换流

乱码问题 package com.itheima.d2;import java.io.*; import java.nio.charset.StandardCharsets;public class Test4 {public static void main(String[] args) {try (//1、创建一个文件字符输入流与源文件接通//Reader fr new FileReader("IO\\src\\itheima04.txt"…

学会这套HttpRunner(17):实现参数化传递,测试开发都直呼内行

参数化实现及重复执行 参数化测试:在接口测试中,为了实现不同组数据对同一个功能模块进行测试,需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化: 1、在YAML/JSON 中直接指定参数列表 2、…

创建自定义日志筛选器

Windows的事件查看器中的日志包含了很多信息,但是系统自带的筛选器只能筛选固定的字段和内容。有时候想根据某个事件中的用户名或者IP筛选的时候就没办法了。此时需要创建自定义筛选器来实现。 首先找到希望筛选的日志,调整成详细的XML视图。 这里面就有…

海外代理IP如何找到靠谱的?

现在市面上有很多代理服务商,大家可以根据自己的需求选择一个适合自己业务的的IP代理服务商,现在也有一些免费的,但如果力求稳定安全,还是选择付费的。 这里提醒一句,在买代理IP时最好找这种可以免费试用的&#xff0…

城市生命线丨桥梁健康监测系统应用详情

现代城市当中,桥梁的重要性以及危险性是最高的,因此,对于桥梁的安全健康监测就会变得更加的重要,在科技发展的今天,新型基础设施已经能够准确、实时的监测桥梁的安全和健康。 WITBEE万宾助力建设更健康,智慧…

transformer学习资料

一、NLP 自然语言处理 NLP 是机器学习在语言学领域的研究,专注于理解与人类语言相关的一切。NLP 的目标不仅是要理解每个单独的单词含义,而且也要理解这些单词与之相关联的上下文之间的意思。 常见的NLP 任务列表: 对整句的分类&#xff1…

大数据时代,怎样通过日志分析保护我们的数据!

在今天的大数据时代,大量的数据被生成和存储。对于IT行业来说,日志文件是宝贵的信息财富。 通过合理的日志分析和解读,可以帮助企业提高运维效率、加强安全防护、改进产品质量和优化用户体验,本文将深入探讨日志分析在IT中的重要性…