Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度揭秘!硬件负载均衡配置业务健康检测 400 状态码问题的惊险排查之旅

深度揭秘!硬件负载均衡配置业务健康检测 400 状态码问题的惊险排查之旅

作者头像
lyb-geek
发布于 2025-04-20 16:20:04
发布于 2025-04-20 16:20:04
6400
代码可运行
举报
文章被收录于专栏:Linyb极客之路Linyb极客之路
运行总次数:0
代码可运行

在如今的数字化时代,业务的稳定运行与高效迁移至关重要。最近,我们团队在将业务配置的负载均衡迁移至深信服应用交互中心 AD(类似硬件负载均衡器 F5)的过程中,遭遇了一场棘手的技术难题 —— 配置业务健康检测时,响应状态码突然出现 400,这一问题如同一颗定时炸弹,严重威胁着业务的正常运行。经过一系列惊心动魄的排查与尝试,我们终于成功解决了这一难题。今天,就带大家一同回顾这段充满挑战与突破的技术历程,希望能为各位技术同仁提供宝贵的经验与启示。

一、问题浮现:意料之外的 400 状态码

深信服应用交互中心 AD 提供了丰富多样的健康策略,足足有十几种之多。我们依据实际需求,选择了 HTTP 方式进行配置。按照官方给出的配置示例,

我们以相对路径 “/a/b” 的模式进行设置,监视地址则配置为云厂商的 ELB。然而,就在我们满心期待一切顺利通过检测时,意外却发生了。同样的健康检测配置信息,除了端口不同,springcloud gateway 能够顺利返回状态码 200,而检测 springboot 项目时,却无情地返回了 400 状态码。更为诡异的是,无论是通过浏览器、postman,还是直接进入宿主机访问 springboot 项目的健康检测地址,响应状态码均显示为 200。这一现象让整个团队陷入了深深的困惑,问题究竟出在哪里?

二、艰难排查:迷雾重重下的探索

(一)云厂商 ELB 疑云

遇到问题,我们首先想到的便是求助于云厂商。毕竟,使用云服务的一大优势就是在遇到技术难题时能够得到专业的支持。于是,我们迅速联系了云厂商的技术团队,他们迅速组织了多波相关人员展开排查工作。经过整整 3 天的不懈努力,进行了各种手段的定位检测,然而,他们传递给我们的消息却让问题变得更加扑朔迷离。虽然没有明确的结论,但他们暗示问题很可能出在我们的业务代码上。

(二)业务代码的自我审视

业务的健康检测配置使用的是 springboot 提供的 actuator/health 端点,直觉告诉我们,健康检测代码出现问题的可能性微乎其微。但云厂商的判断让我们不得不重新审视这一观点。为了深入排查问题,我们祭出了强大的工具 ——arthas。通过在 idea 中安装 arthas 插件,我们轻松地执行了跟踪命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trace -E org.springframework.boot.actuate.health.HealthIndicator health -n 5  --skipJDKMethod false '1==1'

注: 这个命令无需要自己敲,idea装下arthas idea插件,选中要进行跟踪的方法,右键选中自己想要的执行命令

这条命令的目的是对 HealthIndicator 进行深度跟踪,以便发现潜在的问题。然而,跟踪结果却让我们大失所望,始终没有进入到这个方法。这让我们再次怀疑问题出在 ELB 上,于是我们将相关证据反馈给云厂商。云厂商的技术人员依然保持着专业和耐心,与我们一同再次进行深入定位。经过一番努力,他们斩钉截铁地告诉我们,请求肯定已经到达了后端,400 状态码就是后端服务抛出的。

既然云厂商如此确定,我们只能再次将排查重点转移到业务代码上。我们利用 actuator 动态调整日志级别的功能,将日志级别调整为 DEBUG,以便获取更详细的信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -X POST "http://localhost:8550/actuator/loggers/root" -H "Content-Type: application/json" -d '{"configuredLevel": "DEBUG"}'

这一操作的前提是 loggers 端点处于激活状态,相关的动态调整日志级别代码可参考

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
org.springframework.boot.actuate.logging.LoggersEndpoint

日志级别调整后,我们终于发现了一条关键线索。

借助这条线索,我们向 AI 发起了求助。

AI 给出的答案清晰明了 ——HOST头丢失了。为了进一步验证这一结论,我们再次使用 arthas 进行跟踪:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
trace -E org.apache.coyote.http11.Http11Processor|org.springframework.boot.actuate.health.HealthIndicator service|health -n 5  --skipJDKMethod false '1==1'

这次,我们成功跟踪到了相关内容,终于确定 400 状态码确实是由业务代码抛出的。深入跟踪后发现,问题出在

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
org.apache.coyote.http11.Http11Processor#prepareRequest

中的一段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Check host header
        MessageBytes hostValueMB = null;
        try {
            hostValueMB = headers.getUniqueValue("host");
        } catch (IllegalArgumentException iae) {
            // Multiple Host headers are not permitted
            badRequest("http11processor.request.multipleHosts");
        }
        if (http11 && hostValueMB == null) {
            badRequest("http11processor.request.noHostHeader");
        }

三、多管齐下:寻求最佳解决方案

01

方案一:Tomcat 的 Pipeline-Valve 补救

我们首先想到的是在 Http11Processor 进行检测前,通过 tomcat 的 pipline-valve 机制塞一个默认的 host。具体做法是将 valve 塞到 Engine 或者 Host 元素中。然而,经过深思熟虑,我们认为这个方案存在较大的风险。客户端没有传递的信息,由服务端来兜底,不仅不符合常规的设计理念,而且可能会引发一系列意想不到的问题,因此我们果断放弃了这一方案。

02

方案二:配置全路径的尝试

交互应用 AD 提供了 3 种 http uri 的配置方式,我们尝试通过配置域名全路径,如 http://healthcheck.com/actuator/health/ping,来解决问题。这一方法确实成功解决了 400 状态码的问题,但我们还有一个重要的需求 —— 当出现非 200 状态码时,能够实现故障转移。而通过配置域名方式进行检测,无法满足这一需求,因此这个方案也不得不被舍弃。

03

方案三:补充缺失的 Host

在AD.7.0.26后,他的http健康检测多了可以塞host值的文本框,如图

理论上,通过配置 host 值就可以解决我们的问题。然而,由于我们使用的版本较低,并不具备这一功能。无奈之下,我们只能另辟蹊径。在仔细研究 http 检测文档后,我们发现可以采用 connect(TCP)来配置健康检测。 配置说明如下

最初,我们的发送内容设置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /actuator/health/ping HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n

并设定接收内容必须包含 200。本以为问题就此解决,然而结果却依然不尽人意,检测仍然异常。通过 telnet 验证,我们发现出现了 505 状态码。经过一番调试,我们最终找到了正确的配置方式(如下图):

严格按照 http 请求的协议,在内容后面追加空行(即按两次 enter 键),以区分 header 和 body。通过这种方式,我们终于成功解决了 400 状态码的问题。

四、经验总结:复盘与启示

回顾整个排查过程,其实我们一开始就注意到云厂商 ELB 的日志中,抓到的请求是 “http:///actuator/health/ping”,当时我们也曾怀疑过请求头是否缺失。但由于 springcloud gateway 在同样的配置下没有出现问题,这一现象成功转移了我们的排查方向。现在看来,这是因为 springcloud gateway 底层使用的是 netty 容器,与 springboot 默认的 tomcat 容器对 host 的处理方式存在差异。在本次问题的定位过程中,AI 和 arthas 发挥了至关重要的作用,为我们提供了关键的线索和深入排查的手段。

最后,为了方便各位技术同仁查阅相关资料,特附上深信服交互应用 AD 的官方文档链接:

https://support.sangfor.com.cn/productDocument/read?product_id=31&version_id=997&category_id=273432

希望本次的技术复盘能够对大家在处理类似问题时有所帮助,让我们共同在技术的道路上不断探索前行!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linyb极客之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
​『学习笔记』在 Nginx 中实现负载均衡的健康检查
🎈今日推荐——https://cloud.tencent.com/developer/article/2473585
数字扫地僧
2024/12/04
5320
springBoot Actuator 健康监测
spring boot 微服务作为一项在云中部署应用和服务的新技术是当下比较热门话题,而微服务的特点决定了功能模块的部署是分布式的,运行在不同的机器上相互通过服务调用进行交互,业务流会经过多个微服务的处理和传递,在这种框架下,微服务的监控显得尤为重要。我们知道,spring boot 在引入
chinotan
2019/04/03
3.4K0
springBoot Actuator 健康监测
05. Springboot admin集成Actuator(一)
Spring Boot Actuator是Spring Boot提供的一个用于监控和管理应用程序的扩展模块。Actuator通过HTTP端点和JMX(Java Management Extensions)提供了一系列功能,包括查看应用程序的运行状况、度量指标、日志、追踪和应用信息。它为开发人员和运维人员提供了方便的手段来监控和管理Spring Boot应用。
有一只柴犬
2024/01/25
4870
05. Springboot admin集成Actuator(一)
SpringBoot应用监控解析:Actuator实现原理
在企业应用中除了要了解 Spring Boot 业务的单元测试、集成测试等功能使用外,在上线之后还需要对线上应用的各项指标(比如,CPU 利用率、内存利用率、数据库连接是否正常、用户请求数据等)进行监控和运维。
愿天堂没有BUG
2022/10/28
2K0
SpringBoot应用监控解析:Actuator实现原理
SpringBoot - 构建监控体系01_使用 Actuator 组件实现及扩展系统监控
系统监控是 Spring Boot 中引入的一项全新功能,它对应用程序运行状态的管理非常有效。而 Spring Boot Actuator 组件主要通过一系列 HTTP 端点提供的系统监控功能来实现系统监控。
小小工匠
2021/08/17
1.4K0
SpringBoot - 构建监控体系01_使用 Actuator 组件实现及扩展系统监控
SpringBoot监控工具之《Actuator》
有句话怎么说呢?学的越多,不知道的就越多,现在感觉学的越来越废了,不学又不行,最近一直在钻研 SpringBoot相关的内容,准备先写一些基础的案例代码,后续研究的更加透彻,写一些有内涵的刨析文章发表出来,下面开始吧!
框架师
2021/11/22
1.7K0
SpringBoot监控工具之《Actuator》
Spring Boot 应用监控:Actuator与 AdminSpring Boot 应用监控:Actuator与 Admin
在企业级应用中,对系统进行运行状态监控通常是必不可少的。Spring Boot提供了 Actuator 模块实现应用的监控与管理,对应的起步依赖是spring-boot-starter-actuator。 spring-boot-actuator模块提供了一个监控和管理生产环境的模块,可以使用http、jmx、ssh、telnet等拉管理和监控应用。它提供了应用的审计(Auditing)、健康(health)状态信息、数据采集(metrics gathering)统计等监控运维的功能。同时,我们可以扩展 Actuator 端点(Endpoint) 自定义监控指标。这些指标都是以 JSON 接口数据的方式呈现。而使用 Spring Boot Admin 可以实现这些 JSON 接口数据的界面展现。 本章介绍 Spring Boot Actuator 和使用Spring Boot Admin实现对 Spring Boot应用的监控与管理。 1.1 Actuator简介 在实际的生产系统中,我们怎样知道我们的应用运行良好呢?我们往往需要对系统实际运行的情况(例如cpu、io、disk、db、业务功能等指标)进行监控运维。这需要耗费我们不少精力来搞这些工作。 在SpringBoot中,我们完全不需要面对这样的难题。Spring Boot Actuator 提供了众多 HTTP 接口端点(Endpoint),其中包含了丰富的 Spring Boot 应用程序运行时的内部状态信息。同时,我们还可以自定义监控端点实现灵活定制。 Actuator是spring boot提供的对应用系统的自省和监控功能,Actuator对应用系统本身的自省功能,可以让我们方便快捷的实现线上运维监控的工作。这个有点DevOps的味道。通过Actuator,我们可以使用数据化的指标去度量我们的应用的运行情况。比如查看服务器的磁盘、内存、CPU 等信息,系统运行了多少线程,gc的情况,运行状态等等。
一个会写诗的程序员
2018/08/17
1.3K0
SpringCloud学习2-Springboot监控模块
学习一项新技术最大的困难是什么? 是资料。让人高兴的是找到了一本系统学习Spring Cloud的教程,《Spring Cloud微服务实战》, 接下来的学习目标将以此书顺序演进。
啦啦啦
2019/08/29
4600
SpringBoot actuator 应用监控。
今天在阅读 《SpringCloud微服务实战》一书时看到了SpringBoot actuator相关知识,并且自己也本地调试实践。觉得SpringBoot这一套监控还是挺有意思的,这里记录下学习过程。
一枝花算不算浪漫
2018/10/10
2.1K0
SpringBoot actuator 应用监控。
nginx负载均衡的健康检查
如果服务器组内有机器出现问题,nginx就不再向其转发请求了,那么nginx如何知道某台服务器是否能正常? 这就需要nginx对每台服务器进行健康检查 检查的方式有两种 (1)被动检查 向服务器转发请求失败,或者没有接收到响应,nginx就认为其不可用,会停止一段时间不再向其转发 默认规则是,如果失败了一次,就停止转发10秒钟 失败次数和停发时间是可以设定的,例如 upstream backend { server backend1.example.com;
dys
2018/04/02
1.5K0
掌握SpringBoot-2.3的容器探针:深入篇
本篇就是为了解决上述问题而作,这些问题解决后才能用好探针技术,让它在容器环境带来更大价值;
程序员欣宸
2021/04/30
6190
掌握SpringBoot-2.3的容器探针:深入篇
Spring Boot 2.X(十六):应用监控之 Spring Boot Actuator 使用及配置
Actuator 是 Spring Boot 提供的对应用系统的自省和监控功能。通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘、内存、CPU等信息,系统的线程、gc、运行状态等等。
朝雾轻寒
2019/11/14
1.9K0
Spring Boot的无缝衔接:深入解析与实践
在快速迭代的软件开发环境中,无缝衔接是提升开发效率、降低维护成本、增强系统稳定性的关键。Spring Boot通过其独特的“约定优于配置”原则和丰富的生态系统,为开发者提供了一个高效、简洁的开发平台。本文将深入解析Spring Boot无缝衔接的几大优势,并通过实际案例和深入分析,展示这些优势如何在项目中发挥作用。
破晓的历程
2024/08/20
2000
Spring Boot Actuator监控使用详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程序新视界
2019/11/20
1.9K0
springboot(十九):使用Spring Boot Actuator监控应用
微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题? 在这种框架下,微服务的监控显得尤为重要。本文主要结合Spring Boot Actuator,跟大家一起分享微服务Spring Boot Actuator的常见用法,方便我们在日常中对我们的微服务进行监控治理。 Actuator监控 Spring Boot使用“习惯优于配置的理念”,采用包扫描和自动化配置的机制
纯洁的微笑
2018/04/18
1.3K0
Nginx负载均衡中后端节点服务器健康检查的操作梳理
正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样势必造成网站访问故障。虽然nginx可以在localtion中启用proxy_next_upstream来解决返回给用户的错误页面,如下: 例如公司的网站访问的时候全部变成404页面,最后发现是后端的一台服务器不可用,直接访问那台后台的服务器的时候,返回的是404页面,因为upstream 里面设置了ip_ha
洗尽了浮华
2018/01/23
4.9K0
SpringCloud学习1-服务注册与发现(Eureka)
前言 Oracle转让Java,各种动态语言的曝光率上升,Java工程师的未来在哪里?我觉得Spring Cloud让未来有无限可能。拖了半年之久的Spring Cloud学习就从今天开始了。中文教材不多,而且大多都是简单的离散的信息,想要找到企业级的一体化解决方案很少。不过,对于入门来说,简单就够了,等到用的时候自然而然的汇总起来。 目标是把springcloud的子项目过一遍。 Component Edgware.SR2 Finchley.M7 Finchley.BUILD-SNAPSHOT
Ryan-Miao
2018/03/14
2.5K0
SpringCloud学习1-服务注册与发现(Eureka)
SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控
在生产环境中,需要实时或定期监控服务的可用性。Spring Boot的actuator(健康监控)功能提供了很多监控所需的接口,可以对应用系统进行配置查看、相关功能统计等。
知了一笑
2019/07/19
5320
Nginx负载均衡健康检测,你了解过吗?
在Nginx负载均衡中,我们很难保证说每一台应用服务器都能一直正常的运行下去。但是我们可以通过设置Nginx来检测这些应用服务器,检测这些服务器当中不能访问的。
Bug开发工程师
2019/05/16
4.5K0
Spring Boot (十九):使用 Spring Boot Actuator 监控应用
微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递,出现了异常如何快速定位是哪个环节出现了问题?
纯洁的微笑
2019/10/24
8090
推荐阅读
相关推荐
​『学习笔记』在 Nginx 中实现负载均衡的健康检查
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档