加了验签过滤器后下游收到的 body 是空的,Content-Length 还是原来的值,日志里另有 Exceeded limit on max bytes to buffer,请求头看着都正常,就是内容没了。日志里能对上时间点,这种反而好排。

网关的请求体是 DataBuffer 流,读一次就被消费掉了,不缓存直接转发等于发了个空体;默认缓冲上限 256KB,报文大一点还会直接抛异常,两种表现一起出现。这一点先确认清楚,后面就不用反复试。

spring.codec.max-in-memory-size=2MB
# 自定义 GlobalFilter 里先 cache 再 chain.filter
# 读取用 DataBufferUtils.join 后重新包装

这次卡住的地方就在「Gateway 请求体缓存」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。

处理上按这个顺序:用缓存请求体的过滤器包装一次,读完把流写回去;把缓冲区上限按业务最大报文调到一个够用的值;验签逻辑放到缓存之后,别在原始流上直接读取。

结果对不对很好判断,下游收到完整请求体,签名校验通过,大报文不再抛缓冲区超限。

作者 9823189