spring-cloud网关报400 Bad Request问题排查
问题现象 api访问时,如果访问过快,第二次访问大概率报Bad Request。 我们对网关做的操作 记录请求报文,打印日志。 对请求进行验签。 验签不通过,打回。验签通过,提取真正的请求参数。 根据请求报文和数据库配置,路由到后端的微服务,并附带真正的请求参数。 问题排查 排查网关日志,未发现异常现象。网关只打印了HTTP的报文体,未打印请求头。 排查微服务日志,发现tomcat接收的请求日志,HTTP请求头丢失了一部,所以Bad Request是微服务报出来的。 由此定位到网关出问题了。查看Netty的HttpServerCodec。发现请求头是一定会写的,为什么会丢失,怀凝是ByteBuf出问题了,导致一部分内容未写进去。 检查 ByteBuf并添加日志,确认ByteBuf没有问题。 由此判定是 tomcat解析出问题了,一部分请求头未解析到。 继续查看tomcat日志,无意中发现content-length与实际内容不一致。由此猜想,可能是对网关进行转发的时候,改变了网关的请求内容,而content-length是已经解析好的。所以需要重设content-length。 String content = toData.getString("content"); byte[] content4Byte = content.getBytes(StandardCharsets