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

news2024/12/30 3:15:50

背景

最近项目在升级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.coloradmin.cn/o/581475.html

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

相关文章

queue的常见接口说明(基于c++标准库的STL)

前言 队列是一种容器适配器,专门用于先进先出(FIFO)的操作中 ,其容器从一端插入数据,从另一端取出数据。队列作为一种容器适配器实现,容器适配器即将特定的容器封装起来,queue提供一组特定的成员…

LBM-BGK计算泊肃叶流动

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

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

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

【笔记整理】图神经网络学习

【笔记整理】图神经网络学习 文章目录 【笔记整理】图神经网络学习一、GNN简介1、图结构 & 图基础算法1)引言("非欧几何, 处理图数据的NN")2)图基本概念 & 分类("邻接矩阵, 图结构分类"&a…

搭建springboot工程_学习笔记

2.搭建springboot环境 2.1 使用maven项目 在pox.xml文件中加入parent <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version></parent>在pom…

chatgpt赋能python:Python中8%3的运算:一种常见的数学问题

Python中8%3的运算&#xff1a;一种常见的数学问题 在Python中&#xff0c;8%3是一种常见的数学问题。在本文中&#xff0c;我们将介绍Python中的这种运算符以及它的用途。 什么是8%3&#xff1f; 百度百科给出的解释是&#xff1a; 求余运算符&#xff08;%&#xff09;用来…

为什么要“内卷”创始人?如何内卷?

受疫情影响&#xff0c;近几年各个行业都受到很大的冲击&#xff0c;同时有许多知识创业者反而逆势增长&#xff0c;这是为什么呢&#xff1f;因为有一个好的领导者&#xff01;一家企业的发展&#xff0c;和创始人的心力和决心紧密联系着&#xff0c;只有好的将军才能带领出好…

【社群运营】关于社群运营的一些学习和思考

社群运营 运营流程&#xff08;自己&#xff09;背景流程过去经验1.你觉得社群最重要的价值是什么&#xff1f;对个人对DW 2.学习社群组织好哪些环节你觉得非常重要&#xff1f;3.这些环节有没有比较好的运营经验/方法&#xff1f;价值共鸣情感共鸣精神共鸣 社群总结 运营流程&…

《数据库应用系统实践》------ 超市管理系统

系列文章 《数据库应用系统实践》------ 超市管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&#xff…

剑指 Offer 11. 旋转数组的最小数字解题思路

文章目录 题目解题思路优化 题目 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers &#xff0c;它原来是一个升序排列的数组&#xff0c;并按上述情形进行了一次旋转。请返回旋转数组的最小元素。…

直流电机 PID 开发指南学习笔记

直流电机 PID 开发指南 &#xff08;基于【平衡小车之家】直流电机 PID 学习套件 1.0&#xff09; 目录 1.位置闭环控制 1.1 理论分析 1.2 控制原理图 1.3 C 语言实现 1.4 参数整定 2.速度闭环控制 2.1 理论分析 2.2 控制原理图 2.3 C 语言实现 PID 调节器出现于上世…

keepalived脑裂后,近20min不能访问虚拟IP事故分析

问题现象和说明 真实的场景比较复杂&#xff0c;抽象起来可以用下面的图表示&#xff0c; #mermaid-svg-q8mZrLctqAENT1r0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-q8mZrLctqAENT1r0 .error-icon{fill:#5522…

【经验总结】浮点数double/float精度误差问题总结

现象 最近做的项目中经常会在C环境下和高精度的double浮点类型数据打交道 这些double类型数据精度级别可能到 pico级别(10^-12) 甚至 femto级别(10^-15),用来表示集成电路的一些微观属性 但是非常诡异的是&#xff0c;不知道为什么在对这些高精度的浮点数进行运算时&#xff…

RK3588平台开发系列讲解(工具篇)ADB的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、连接设备1.1、USB 的方式1.2、网络的方式二、常用命令沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍ADB的使用。 一、连接设备 1.1、USB 的方式 主机通过 USB 连接设备,具体如何连接。 US…

chatgpt赋能python:Python中5%-3的用法介绍

Python中5%-3的用法介绍 在Python编程中&#xff0c;5%-3是一个常用的运算符&#xff0c;其作用是对5除以3取余数。在本文中&#xff0c;我将介绍5%-3的用法以及如何在Python编程中使用该运算符。 什么是5%-3运算符 5%-3运算符表示对5除以3取余数&#xff0c;余数为2。 5%-…

chatgpt赋能python:Python中9/2的结果为4.5——一篇关于Python运算符的SEO文章

Python中9/2的结果为4.5——一篇关于Python运算符的SEO文章 如果你是一名Python开发工程师&#xff0c;那么你肯定熟悉运算符这个概念。作为一门计算机语言&#xff0c;Python中有各种各样的运算符&#xff0c;包括算术运算符、赋值运算符、比较运算符等等。今天&#xff0c;我…

WiFi 6 vs WiFi 5

在现代无线通信领域&#xff0c;WiFi已经成为人们日常生活中不可或缺的一部分。随着技术的不断发展&#xff0c;WiFi标准也在不断更新和演进。WiFi 6&#xff08;802.11ax&#xff09;和WiFi 5&#xff08;802.11ac&#xff09;是当前两个主要的WiFi标准。 本文将详细介绍WiFi …

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

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

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

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

2023年系统分析师案例及论文(回忆版)

2023年5月27日&#xff0c;全国计算机等级上半年考试如期举行&#xff0c;北京市软件分析师考试地点在北京市对外贸易学校&#xff0c;早上外面下起雨 看考场分布图&#xff0c;44个考场&#xff0c;推测有44*301320名考生&#xff0c;本人所在的考场&#xff0c;实际到场17人…