一次Tomcat返回404的分析

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
云原生网关 MSE Higress,422元/月
性能测试 PTS,5000VUM额度
简介: 一个Web应用部署在阿里云EDAS上,使用Tomcat 7.0.59.3,在测试环境遭遇所有接口返回404的问题,而生产环境正常。测试与生产环境主要差异在于Apollo配置不同。通过Arthas工具监控,确认Spring已正确加载Controller,并且请求未进入Spring或Filter处理流程。进一步分析发现,Tomcat内部处理流程中设置了404状态码,最终定位到`org.apache.coyote.http11.AbstractHttp11Processor.process`方法存在问题。通过对代码逻辑的分析,确定原因是请求URL路径不正确。修正URL路径后问题得到解决。

问题描述

项目组有个web应用,部署在阿里云EDAS上,Tomcat版本是7.0.59.3。

项目组反馈在测试环境该工程所有接口都返回404,生产环境接口都能够正常访问。

测试环境与生产环境除了apollo上的配置不一样,其他都一样。报错信息如下:

问题分析

一、Controller类是否正确

首先想到的是Controller可能写法有问题,导致Spring没有加载到。通过arthas vmtool可以验证这个问题,如图2:

vmtool --action getInstances --className org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping --express 'instances[0].mappingRegistry.urlLookup' -x 1

从图2中可以看到Spring已经正确加载了Controller类。

二、Spring处理请求流程

是否是Spring在处理请求过程中,出现了问题导致返回的404?通过arthas watch可以验证这个问题,如图3:

watch org.springframework.web.servlet.FrameworkServlet service "{params[0].request.coyoteRequest}" -x 2

从图3中可以看到请求根本没有到达Spring处理流程中。

难道是Filter处理过程中出现了问题?通过arthas watch观察相关Filter类,发现请求也没有道道Filter的处理流程中。

三、Tomcat处理流程

请求没有到达Filter,可能在Tomcat处理的过程中出现了问题。

既然Tomcat 返回的是404,那么我们可以分析一下404是在哪个类中设置的,通过分析相关代码,设置状态码的方法如下:

/** 
 * Set the response status 
 */ 
public void setStatus( int status ) {
    this.status = status;
}

接口通过arthas watch看一下我们的判断是否正确,如图4:

watch org.apache.coyote.Response setStatus "{params}" -x 2

从图4可知,状态码是通过org.apache.coyote.Response.setStatus设置的。

接着通过arthas stack看一下该方法的线程栈就可以请求整个处理流程了,如图5:

stack org.apache.coyote.Response setStatus

org.apache.coyote.http11.AbstractHttp11Processor.process

由于tomcat是alitomcat,没有源码,所以通过反编译进行分析。

org.apache.catalina.connector.CoyoteAdapter

接下来看一下postParseRequest方法相关逻辑,如下:

分析到这里,已经找到了问题的根因,所以解决办法就是把url中的路径写正确。

参考资料

为什么请求总是404?

目录
相关文章
|
5月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
95 0
|
5月前
|
存储 负载均衡 NoSQL
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
【分布式技术架构】「Tomcat技术专题」 探索Tomcat集群架构原理和开发分析指南
124 1
|
Arthas 负载均衡 网络协议
Tomcat连接之KeepAlive逻辑分析
Tomcat连接之KeepAlive逻辑分析
363 1
|
Java 应用服务中间件 容器
Tomcat原理系列之三:对请求的过程详细分析
Tomcat原理系列之三:对请求的过程详细分析
Tomcat原理系列之三:对请求的过程详细分析
|
监控 算法 Java
java tomcat服务无缘无故挂掉分析和解决方案
最近有同事反应有时候xxx系统有时候会时不时出现服务异常提示,一上机器,发现xxx服务进程不在,重启服务后又恢复了,所以这边就需要去跟进问题。
3186 0
|
网络协议 Java 应用服务中间件
tomcat 的并发能力分析
tomcat 的并发能力分析
735 0
tomcat 的并发能力分析
|
设计模式 安全 Java
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
163 0
【Tomcat技术专题】循序渐进,分析Servlet容器鼻祖的Server和Service组件原理
|
Java 应用服务中间件 Maven
springboot项目打成war包放入tomcat中运行,原理分析
1.需要将pom.xml文件的packaging设置为war。 2.改成war包之后,就可以直接使用maven的命令将项目打成一个war包了。 3.将这个war包直接放入到tomcat中运行。 4.启
316 0
|
监控 Java 应用服务中间件
【SpringBoot技术专题】「Tomcat技术专区」用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)
【SpringBoot技术专题】「Tomcat技术专区」用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)
350 0
|
前端开发 Java 应用服务中间件
Tomcat的启动流程分析
Tomcat的启动流程分析
Tomcat的启动流程分析