现象
POST请求数据量大(Content-Length: 305000+)的时候Gateway报错, 报错栈如下:
org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:99)
尝试修改max-in-memory-size配置无效
原因
在Gateway配置文件routes节点中使用了CacheRequestBody
public class CacheRequestBodyGatewayFilterFactory
extends AbstractGatewayFilterFactory<CacheRequestBodyGatewayFilterFactory.Config> {
private final List<HttpMessageReader<?>> messageReaders;
public CacheRequestBodyGatewayFilterFactory() {
super(CacheRequestBodyGatewayFilterFactory.Config.class);
// 这块有问题
this.messageReaders = HandlerStrategies.withDefaults().messageReaders();
}
}

解决
方式一
参考: https://github.com/spring-cloud/spring-cloud-gateway/issues/1658
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.cloud.gateway.filter.factory.CacheRequestBodyGatewayFilterFactory;
import org.springframework.util.ReflectionUtils;
import java.lang.reflect.Field;
@Bean
public BeanPostProcessor cacheRequestBodyGatewayFilterFactoryBeanPostProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof CacheRequestBodyGatewayFilterFactory cacheFactoryBean) {
// use java reflection to replace messageReaders in CacheRequestBodyGatewayFilterFactory
// with message readers configured from CodecConfigurer
Field messageReadersField = ReflectionUtils.findField(CacheRequestBodyGatewayFilterFactory.class,
"messageReaders");
messageReadersField.setAccessible(true);
ReflectionUtils.setField(messageReadersField, cacheFactoryBean, codecConfigurer.getReaders());
messageReadersField.setAccessible(false);
return cacheFactoryBean;
}
return bean;
}
};
}
方式二
参考: https://blog.csdn.net/fujiakai/article/details/134972127
重写org.springframework.core.codec.AbstractDataBufferDecoder类
- 在当前项目创建相同包名和类名文件
- 调整
maxInMemorySize默认值大小即可