Nacos 2.5.5(2026-10-29)收紧了内置 HTTP 主动健康检查:path 必须是相对 URI,自定义头也不能再塞 Content-Length / Transfer-Encoding。
Upgrade Notes 写得很直:不合规的历史检查会被跳过,不发请求、也不改实例健康状态;新写入则在更新集群元数据时直接拒。下面用官方镜像 v2.5.4 对照 v2.5.5,再用 Spring Boot 4.1.2 的 RestClient 打同一条 PUT /nacos/v1/ns/cluster。
2.5.4:绝对 URL 和 Content-Length 都能写进去
standalone 起两套镜像。服务建好后,把 healthChecker 分别设成相对路径、绝对 URL、以及带 Content-Length:5 的头。
===== curl v2.5.4 =====
V254_RELATIVE_HTTP=200
V254_RELATIVE_BODY=ok
V254_ABSOLUTE_HTTP=200
V254_ABSOLUTE_BODY=ok
V254_CONTENT_LENGTH_HTTP=200
V254_CONTENT_LENGTH_BODY=ok
在 2.5.4 上,path=http://example.com/health 和 framing 头都会落成 ok。这正是 2.5.5 要堵的口子:检查目标本该钉在实例 IP/端口上,不能被 path 里的绝对地址拽走。
2.5.5:相对路径仍 ok,绝对 URL 回 400
同一组 JSON,换到 nacos/nacos-server:v2.5.5。
===== curl v2.5.5 =====
V255_RELATIVE_HTTP=200
V255_RELATIVE_BODY=ok
V255_ABSOLUTE_HTTP=400
V255_ABSOLUTE_BODY=Parameter 'healthChecker' contains an invalid HTTP request target or header
V255_CONTENT_LENGTH_HTTP=400
V255_CONTENT_LENGTH_BODY=Parameter 'healthChecker' contains an invalid HTTP request target or header
/actuator/health 加自定义头 X-Health-Mode:ready 仍然 200。写成 http://example.com/health,或头里带 Content-Length,服务端回 400,正文就是上面这句 invalid HTTP request target or header。官方说明:升到 2.5.5 后,健康检查目标要写成相对引用,例如 /health,可带 query,不要带 scheme、authority、fragment。
Boot 4.1.2 RestClient:结论一致
业务侧常见是 Spring Boot 暴露 /actuator/health,运维脚本或控制台再给集群配 HTTP 检查。演示用 Boot 4.1.2 调同一条集群更新接口,不启 Web 端口。
===== boot RestClient v2.5.5 =====
BOOT=4.1.2
SERVER=127.0.0.1:28848
CREATE_SERVICE_HTTP=200
CREATE_SERVICE_BODY=ok
RELATIVE_ACTUATOR_HTTP=200
RELATIVE_ACTUATOR_BODY=ok
ABSOLUTE_URL_HTTP=400
ABSOLUTE_URL_BODY=Parameter 'healthChecker' contains an invalid HTTP request target or header
CONTENT_LENGTH_HEADER_HTTP=400
CONTENT_LENGTH_HEADER_BODY=Parameter 'healthChecker' contains an invalid HTTP request target or header
2.5.4 上同一 JAR 三条都是 200。升完版本若自动化还在写绝对 URL,更新集群会直接失败;库里已经存着的不合规检查,按 Release Notes 会被跳过,实例健康状态也不会因为这次跳过而翻转,需要改成相对 path 后健康检查才会重新生效。
一起交流
分享你的思考,让讨论更进一步。