线上请求响应 400 ,如何快速定位?

周五晚上,有同事反馈端上请求响应 400。应用没有输出业务日志,一时不好排查。上日志平台看了下,拦截器有输出日志,但是 controller 日志没有打印,基本可以确定请求入参格式匹配不上,将 入参的 @RequestBody 注解去掉后问题解决。

结合近段时间遇到的请求 400 问题,整理下此类问题,如何快速定位处理。

400 Bad Request 

HTTP 400 状态码,表明客户端发送了一条异常请求。通常有两种类型:

1. 语义有误,当前请求无法被服务器理解。

客户端不应该在未经修改的情况下重复提交这个请求。

2. 请求参数有误。

案例分析

接下来通过几个具体案例来看下 400 的发生场景。

| 案例1:客户端 header 信息过大,导致 400

# 问题现象

客户端收到部分请求响应 400,服务端日志只收到了 options 请求,没有 post 请求。

# 问题处理

由于是少部分请求异常,且服务端没有查到业务日志,一开始处理起来比较缓慢,没有明确的思路该怎么处理。

在排除 options 请求响应异常,网关请求也正常的情况下。查询 应用服务器 nginx 日志,发现有 error 。同时,查询 tomcat 日志,发现有相应的错误输出。

结合端上近期改动,确认是某些场景下 header 信息会过大,超出 tomcat 阈值(tomcat 8 允许的http请求header的最大值是 8KB)。

问题定位后,就好处理了,端上对 header 中超长的字段信息进行优化,确保不会超出容器阈值,发布后问题解决。

|案例2:请求参数全部拼接到 url ,导致 400

# 问题现象

nginx 状态码监控发现有请求400,error 日志提示 "Connection reset by peer) while reading upstream"。

# 问题处理

一开始推测应该是请求 header 超出,但是由于是 spring boot 应用,没有独立的 tomcat 日志文件,不好判断。

实际上,spring boot 内嵌 tomcat ,容器日志会输出到应用日志中。如下:

2023-12-03 16:10:39,148 INFO [DirectJDKLog.log:182] [] -Error parsing HTTP request header  Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException:Request header is too large  at org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:714

这些问题明确了,跟调用方确认,原来是他们把所有请求参数拼接到了 url 上,导致 header 超出。由于多数情况,入参比较少,即便都拼接到url 上,也不会超出 header 大小限制。这也解释了为什么只有部分请求才会 400。

调用方调整请求方式后,问题解决。

|案例3:应用程序入参格式不匹配 ,导致 400

第三个问题就是文章开头提到的,这个应用日志都输出了,排查起来比较简单。应用拦截器有输出日志,但是 controller 日志没有打印,可以确定请求入参格式匹配不上,将 入参的 @RequestBody 注解去掉后问题随即解决。

总结

线上环境,客户端发起的 http 请求一般会流经网关、应用服务器本地代理 nginx、web 容器(如 tomcat),最后到达应用程序。如下图。

http 请求访问链路

理论上每个节点都有可能出现 400 问题。但是,在排查问题时,应当先从自身应用着手。首先看请求是否到了应用程序,再看是否到了web 容器,然后看是否到了本地 nginx 代理;如果这些节点请求都没过来,说明请求没有到达应用服务器,此时需要找网关的同学共同来排查。

  • 32
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在线查看深度网络架构的方法有很多种,以下是几种常见的方法: 1. TensorBoard:TensorBoard是TensorFlow提供的一个可视化工具,可以方便地查看深度网络的架构、损失函数、精度等信息。通过在训练代码中添加TensorBoard的代码,可以将训练过程的各种信息保存下来,然后在浏览器中打开TensorBoard即可查看相应的信息。 2. Netron:Netron是一个跨平台的开源深度学习模型可视化工具,支持常见的深度学习框架(如TensorFlow、PyTorch、Keras等),可以方便地查看模型的结构、参数和输出等信息。只需要将模型的文件(如.pb、.onnx、.pt等格式)拖入Netron界面即可。 3. Model Zoo:许多深度学习框架都提供了自己的模型库,可以从中下载已经训练好的模型,然后查看其架构。例如,TensorFlow提供了TF Hub和TF Model Garden两个模型库,PyTorch提供了torchvision模型库等。 4. 源代码:如果你能够拿到模型的源代码,那么就可以直接查看模型的结构了。不同的深度学习框架实现模型的方式不同,但通常都会有一个模型定义的文件,例如TensorFlow中的.py文件、PyTorch中的.py文件、Keras中的.py文件等,可以在文件中查看模型的结构。 ### 回答2: 要在线上查看深度网络架构,可以通过以下几种方式: 1. 官方文档:许多深度学习框架都提供了官方文档,其中包含了各种深度网络架构的详细介绍和示例代码。可以通过查阅框架的官方文档来了解特定网络架构的实现方式和详细结构。 2. 模型库:各个深度学习框架都有自己的模型库,其中包含了各种已经训练好的网络模型。可以通过查阅模型库,找到想了解的网络架构,并查看其详细结构和参数设置。 3. 编程代码:深度学习框架提供了丰富的API函数,可以通过编写代码来查看网络架构。通过调用框架提供的函数,可以打印出网络的层次结构或者可视化网络结构图。 4. 可视化工具:一些深度学习框架提供了可视化工具,可以将网络架构以图形的方式展示出来。通过使用这些可视化工具,可以直观地查看网络架构的结构和参数。 总而言之,要在线上查看深度网络架构,可以利用官方文档、模型库、编程代码和可视化工具等方式来获取所需信息。 ### 回答3: 要在线查看深度网络架构,可以通过以下几种方式: 1. 官方文档和教程:很多深度学习框架都有详细的官方文档和教程,其中包含了各种网络架构的介绍和示例代码。可以通过阅读框架的官方文档和教程来了解各种深度网络架构的原理和实现方式。 2. 开源代码库:深度学习领域有很多开源代码库,其中包含了大量的深度网络架构的实现。通过浏览这些开源代码库,我们可以查看各种深度网络架构的具体实现代码,了解网络的结构和参数配置。 3. 论文和学术资料:深度学习领域有很多优秀的研究论文和学术资料,其中详细介绍了各种深度网络架构的原理和应用。可以通过阅读这些论文和学术资料来了解各种深度网络架构的背景知识和技术细节。 4. 网络可视化工具:有些深度学习框架提供了网络可视化工具,可以帮助我们直观地查看和分析深度网络架构。这些工具通常会将网络的结构以图形化的方式呈现出来,方便我们理解和掌握网络的组成和结构。 综上所述,要在线查看深度网络架构,我们可以利用官方文档、开源代码库、论文学术资料以及网络可视化工具等多种资源来获取相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值