记一次tomcat版本升级导致的现网问题

news2024/9/25 19:21:42

前言

最近公司项目做安全漏洞审查,把一批服务的fastjson,tomcat,log4j版本做升级,那天上线了50+个服务,所有服务上线之后,现网有客服反馈录音笔下单异常。查询了现网日志,发现适配服务有异常信息,报错信息如下

Caused by: feign.FeignException: status 400 reading TestServiceClient#calculateDuration(String); content:
<!doctype html><html lang="en"><head><title>HTTP Status 400 – Bad Request</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 400 – Bad Request</h1></body></html>
	at feign.FeignException.errorStatus(FeignException.java:62)
	at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)

熟悉Http协议的应该都知道,400响应状态是客户端请求不合法导致服务端无法解析请求。下面再看看当时的排查过程。

排查过程

上面说到适配服务的异常日志,我们知道是客户端的请求问题,由于适配服务此次上线内容不涉及具体业务需求,所以通知运维把现网的客户端适配服务做了紧急回滚,适配服务所有节点都回滚完成之后,发现老版本的适配服务还是报错。说明问题不是上层适配服务导致的,所以我们开始排查订单业务。问题是在kibana上根据traceId来进行链路排查,只能看到适配服务的报错信息,下面的订单服务的请求信息看不到。当时现网越来越多用户反馈了,没得办法,只能把订单服务也回滚了,订单服务回滚完成之后现网的报错日志没了.....

后来在集成环境部署了现网的版本,然后在本地IDEA中远程调试,在录音笔上下单,结果连音频都上传不上去,后来排查了集成环境音频上传服务的版本是第二天要上线的版本,也是做了一些漏洞修复的问题,所以把集成环境音频上传服务版本回滚到现网一致。再去复现现网的版本,在订单服务日志中,果然发现了蛛丝马迹

Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: The HTTP header line [x-device-info:{"content":""0x00.","createTime":1562298084000,"deviceId":"12132123213213","deviceType":"ashkdahdksahkd","key":"232hahkdkadhksadhkad"}] does not conform to RFC 7230. The request has been rejected.
	at org.apache.coyote.http11.Http11InputBuffer.skipLine(Http11InputBuffer.java:1074)
	at org.apache.coyote.http11.Http11InputBuffer.parseHeader(Http11InputBuffer.java:977)
	at org.apache.coyote.http11.Http11InputBuffer.parseHeaders(Http11InputBuffer.java:606)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:514)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:932)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1695)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

原来适配服务的请求,在到底订单服务的时候,被订单服务的tomcat服务reject了,所以请求根本就没有尽到订单服务里面,所以也就解释了在kibana上根据traceId查询链路日志,没有订单服务的请求信息。看到上面的异常信息,我们跟到tomcat的源码中来看看具体是啥问题,导致tomcat拒绝了这个请求。报错的位置如下

 看到这里,我们再去看看rejectThisHeader是在什么时候设置为true的

 注意看这个注释// Malformed content-length headers must always be rejected,不合法的content-length请求头会被拒绝。看到这里,准备去看看请求的content-length哪里不合法,结果神奇的发现,请求头里居然没有content-length属性。这个请求是post请求,但是没有body数据,如果没有请求体数据,则请求头中不会包含Content-Length属性。 Content-Length属性主要用于指示请求体数据的长度,如果没有请求体数据,则该属性会被省略。所以故障的最终原因算是找到了。那之前为啥没问题呢,后来看了服务的提交记录,发现同事这次漏洞修复不仅升级jackson,还升级了tomcat版本。

 总结

通过这件事,总结如下

  • 遇到现网问题不要慌,冷静思考问题本质,不要仅关注业务日志,业务日志排查没有头绪,tomcat和Nginx的access.log也是很有用的,还有网关日志,根据这些日志排查请求具体在什么位置中断了。
  • 这次上线的一批服务都是做一些安全漏洞修复,没有业务需求,所以测试在功能验证中可能有遗漏,导致了这次现网故障,所以还是得谨慎点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709929.html

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

相关文章

闲人闲谈PS之四十二——顾问的“禁忌之地”—制造能力计划

惯例闲话&#xff1a;上个月有幸成为乐老师乐谈IT系列培训课程的讲师&#xff0c;分享主题是&#xff0c;PS在装备制造和工程行业的应用。虽然培训规模不是很大&#xff0c;但是闲人很有信心&#xff0c;至少在小范围之内&#xff0c;参与培训的听友人来说&#xff0c;PS一直以…

什么条件下会出现死锁,如何避免?

文章目录 一、什么是死锁二、产生死锁的原因&#xff1a;三、如何避免死锁&#xff1a; 一、什么是死锁 死锁&#xff0c;简单来说就是两个或者两个以上的线程在执行过程中&#xff0c;去争夺同一个共享资源导致相互等待的现象。如果没有外部干预&#xff0c;线程会一直处于阻塞…

图像的算术操作

1.图像的加法 用途&#xff1a;图像的合成 Rain图片View图片 合成代码&#xff1a; import numpy as np import cv2 as cv import matplotlib.pyplot as pltrain cv.imread(rain.png) plt.imshow(rain[:, :, ::-1]) plt.show()view cv.imread(view.png) plt.imshow(view…

773. 滑动谜题

链接&#xff1a;773. 滑动谜题 题解&#xff1a;https://blog.csdn.net/INGNIGHT/article/details/131350054 滑动拼图 II class Solution { public:int slidingPuzzle(vector<vector<int>>& board) {// 异常判断if (board.size() < 0 || board[0].size…

怎么管理好一个团队?

一个成功的企业需要一个高效、有能力、积极的团队来支持其业务运营。管理一个团队需要领导者具备一定的技能和知识&#xff0c;怎么管理好一个团队对于许多企业领导者而言也是一项不小的挑战。对此&#xff0c;我想首先推荐一本非常优秀的团队书籍——《经理人参阅&#xff1a;…

js vuejs dagre-d3绘制流程图实用指南 有向图可视化

写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图,今天在这里给安排上,与大家分享。 明确一点,只要你的数据计算能力足够强,使用原生D3绘制流程图绝对可以的,但是,为了让大家更容易上手,避免重复造轮子,给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。 首…

idea tomcat js 汉字乱码

Run/Debug Configuiations->VM options:-Dfile.encodingUTF-8

服务 第七章

目录 1.tomcat 核心组件 2.处理请求&#xff0c;内部数据流向 3.请求处理过程 4.主要目录说明 5.tomcat 优化 6.总结 1.tomcat 核心组件 2.处理请求&#xff0c;内部数据流向 3.请求处理过程 4.主要目录说明 5.tomcat 优化 6.总结 tomcat 属于轻量级应用服务器&#xf…

基于Tars高并发IM系统的设计与实现-基础篇1

基于Tars高并发IM系统的设计与实现–基础篇1 作者简介 兰怀玉 毕业于中央民族大学计算机专业 先后供职国内外多家公司软件研发设计岗位&#xff0c;有丰富的软件研发经验。 从事IM领域设计研发十余年&#xff0c;先后领衔多个IM通讯系统设计与研发发&#xff0c;拥有丰富的IM…

裂墙推荐!阿里大牛新产Java面试速成指南,主打就是躺着拿Ofeer

很多粉丝后台留言&#xff0c;Java程序员面临的竞争太激烈了…… 我自己也有实感&#xff0c;多年身处一线互联网公司&#xff0c;虽没有直面过求职跳槽的残酷&#xff0c;但经常担任技术面试考官&#xff0c;对程序员招聘市场的现状很清楚。导致现在激烈竞争的原因不外乎三方面…

移动端数据可视化设计

在做APP设计的时候&#xff0c;难免会遇到一些需要展示数据的场景。使用传统的表格和文档展示数据不仅难看&#xff0c;也影响用户理解数据的含义。而数据可视化设计能将数据以更加直观的方式展现出来&#xff0c;使数据更加客观、更有说服力。 在移动应用中&#xff0c;数据可…

uview-plus上传图片,upload组件带参数上传

一、引入uview-plus 请自行在项目中引入uview-plus组件库&#xff0c;此处不多赘述 二、使用 html 部分&#xff0c;上传组件的样式自己去定义&#xff0c;不多赘述 <u-upload:fileList"fileList" // 文列列表afterRead"afterRead" // 读取后的…

03双向链表

双向链表 单向链表的缺点 单向链表&#xff0c;只能是一个方向来查找&#xff0c;而双向链表可以向前或者向后查找。单向链表不能自我删除&#xff0c;需要靠辅助结点。而双向链表可以自我删除。所以我们单链表删除结点的时候&#xff0c;总要找到temp&#xff08;待删除结点…

python+requests库使用时报错:ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1131)

本人测试小白~第一次用pythonunittestrequest做接口测试的学习时&#xff0c;一直报这个ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1131) 反复检查代码也没有发现什么问题&#xff0c;然后在网上找了很多方法&#xff0c;最终解决这个问题的方法…

BUUCTF 世上无难事 1

题目描述&#xff1a; 以下是某国现任总统外发的一段指令&#xff0c;经过一种奇异的加密方式&#xff0c;毫无规律&#xff0c;看来只能分析了。请将这段语句还原成通顺语句&#xff0c;并从中找到key作为答案提交&#xff0c;答案是32位&#xff0c;包含小写字母。 注意&…

三层交换机实现不同VLAN的数据转发

实验环境&#xff1a; 思科模拟器&#xff0c;Cisco Packet Tracer 实验拓扑&#xff1a; 实验配置&#xff1a; &#xff08;1&#xff09;PC配置 IP子网掩码网关PC1192.168.10.1255.255.255.0192.168.10.254PC2192.168.10.2255.255.255.0192.168.10.254PC3192.168.20.325…

Mybatis - 统计SQL执行时间

由于系统数据量较大&#xff0c;SQL执行十分低效&#xff0c;我们在做数据库优化时&#xff0c;想在日志中看到每个SQL执行的时间&#xff0c;以方便针对性的优化 一、切面编程Aspect 此方案主要是通过环绕切面的方式将mapper包下的接口方法&#xff0c;然后前后计算时间差即…

C语言初阶之结构体

结构体 1. 结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化 2. 结构体成员的访问3. 结构体传参 1. 结构体的声明 1.1 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。…

小波变换笔记

突然变化的图像或信号 小波变换 高带宽&#xff1f; 放缩和时延 放缩因子和频率成正比 小波在频域中具有带通特性 Cf 中心频率 s 小波刻度 \delta t 采样间隔 时延 我们需要移动小波&#xff0c;以便使其和信号中寻找的特征对齐 时频分析时域频率成分滤波 连续小波变换 C…

【手撕算法|动态规划系列No.3】leetcode746. 使用最小花费爬楼梯

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…