加了验签过滤器后下游收到的 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 请求体缓存」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。
别只看报错的最后一行,往上看几行,真正的起因通常在上面。
处理上按这个顺序:用缓存请求体的过滤器包装一次,读完把流写回去;把缓冲区上限按业务最大报文调到一个够用的值;验签逻辑放到缓存之后,别在原始流上直接读取。
结果对不对很好判断,下游收到完整请求体,签名校验通过,大报文不再抛缓冲区超限。
