升级Springboot2.7.11之后内嵌tomcat启动成功, 但访问任何接口都是404

news/2025/2/7 19:18:54/

背景

最近项目在升级JDK17, 但原先低版本Springboot不能识别jdk17编译的字节码, 为了能够使用JDK17的语法, 因此对SpringBoot也做了升级, 直接升级到了SpringBoot 2.7.11版本.
对一些变更修改升级完成后, 本地启动服务运行, 一切正常!!! 于是发布到公司的容器环境运行, 发布平台却一直显示发布失败.

容器运行环境

  1. JDK 17
  2. SpringBoot 2.7.11
  3. 嵌入式Tomcat 9.0.75
  4. javaagent: opentelemetry-java-instrumentation

前期排查

  1. 查看日志文件, 查看是否有异常
    日志文件没有任何异常信息
  2. 怀疑升级Springboot之后健康检查接口变更
    访问本地健康检查接口, 能够正常访问, 健康检查接口没有变更, 其它业务接口也能正常访问
  3. 通过命名查看服务端口是否启动成功
    结果: 服务端口绑定成功
  4. 通过curl命名在容器内访问健康检查端口
    健康检查接口返回404异常, 这也是发布平台为什么认为服务没有启动成功的原因, 访问业务接口同样返回404异常
  5. 怀疑是不是哪边不小心配置了tomcat context-path根路径
    经过排查, 也并没有配置tomcat context-path根路径
  6. 怀疑是异常没有正常抛出
    于是对启动main方法内部加了try-catch, 尝试抓住异常, 但是打印"启动正常", 但因为健康检查接口返回404, 容器一会儿会kill点进程
    public static void main(String[] args) {try {SpringApplication.run(DashboardApplication.class, args);LoggerFactory.getLogger(DashboardApplication.class).info("启动正常");} catch (Exception ex) {LoggerFactory.getLogger(DashboardApplication.class).error("启动异常:", ex);}
    }
    

源码debug

对上面那么多猜测排查下来还是没有找到原因, 只能采取万能debug的方式,为了方便在容器远程debug时快速的添加有效断点,先在本地启动了服务,分析下tomcat处理请求url的源码,以及路径匹配的源码位置。
本地调试发现在org.apache.catalina.mapper.Mapper#internalMap方法中uri参数就是访问的url地址
在这里插入图片描述
于是开始在容器上远程debug, 发现这个uri参数竟然是null, 此时怀疑是不是升级了SpringBoot之后携带升级的Tomcat存在bug
在这里插入图片描述

Tomcat github官网issue

尝试从tomcat github官网搜索, 看是否存在同样的问题, 还真的搜到了相关的issue

  1. https://github.com/apache/tomcat/pull/617
  2. https://lists.apache.org/thread/vzt0jxmbfm85t2s2mfjzjl1m1sslp9vy
    在这里插入图片描述
    org.apache.tomcat.util.buf.MessageBytes#toString
    在这里插入图片描述
    io.opentelemetry.javaagent.instrumentation.tomcat.common.TomcatHttpAttributesGetter
    在这里插入图片描述
    io.opentelemetry.javaagent.instrumentation.tomcat.common.TomcatHelper
    在这里插入图片描述

为什么改变MessageBytes中的type,会导致404 ???

在这里插入图片描述
org.apache.catalina.connector.CoyoteAdapter#postParseRequest
在这里插入图片描述

解决方案

最低版本要求
https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/tag/v1.19.0


http://www.ppmy.cn/news/100381.html

相关文章

c++—函数式编程(lambda、函数对象、函数包装器、函数适配器)

1. lambda表达式 (1)本质:实际是匿名函数,能够捕获一定范围的变量,与普通函数不同,可以在函数内部定义; (2)作用:①简化程序结构,因为优化了函数命…

LBM-BGK计算泊肃叶流动

LBM在计算泊肃叶流动时,需要添加外力项,这部分网上没什么资料,仅有的资料也写的模糊不清,这里点名批评这个知乎博文。 有些地方字母都对不上。。。 本站上也有一篇博文,写的也比较一般,但是代码是多松弛MR…

大佬联合署名!反对 ACL 设置匿名期!

夕小瑶科技说 原创 作者 | 智商掉了一地、Python 近日,自然语言处理领域的多位知名学者联合发起了一项反对 ACL 设置匿名期的联合署名行动,包括著名学者 William Wang 和 Yoav Goldberg 在内,还有Christopher Potts、Hal Daume、Luke Zettl…

Springboot +spring security,认证方式---HTTP基本认证的实现

一.简介 这篇文章来学习下security的认证方式其中的HTTP基本认证。 二.Spring Security的认证方式 2.1什么是认证 认证: 就是用来判断系统中是否存在某用户,并判断该用户的身份是否合法的过程,解决的其实是用户登录的问题。认证的存在,是…

从零开始的力扣刷题记录-第三十七天

力扣每日四题 1221. 分割平衡字符串-简单832. 翻转图像-简单700. 二叉搜索树中的搜索-简单209. 长度最小的子数组-中等总结 1221. 分割平衡字符串-简单 题目描述: 平衡字符串 中,‘L’ 和 ‘R’ 字符的数量是相同的。 给你一个平衡字符串 s,…

测试C#分词工具jieba.NET(续2:其它用法)

jieba.NET除分词和关键词提取功能之外,还有一些其它用法,本文基于参考文献学习并记录。 设置停用词 提取关键词时,部分词语可能不重要或者并非所需的词语,此时可以通过设置停用词,在提取关键词时过滤掉指定的停用词。…

Hexo 个人博客主题美化

anzhiyu主题文档:https://anzhiy.cn/posts/220c.html anzhiyu主题插件地址:https://github.com/anzhiyu-c/hexo-theme-anzhiyu anzhiyu 主题安装 在博客根目录里执行命令,安装 anzhiyu 主题: git clone -b main https://github.co…

LIMA和QLoRA论文解读

《LIMA: Less Is More for Alignment》 paper: https://arxiv.org/abs/2305.11206 Meta在2023年5月发布了论文《LIMA: Less Is More for Alignment》,基于LLaMa-65B微调了大模型LIMA,号称只用了1000个精心策划的问题和答复进行微调,就达到了…