WebClient调用外部服务缓冲区OOM的解决方式

179 阅读1分钟

最近尝试写自己项目用到了jdk-21,然后了解到了目前较新的调用外部接口资源的方式是通过 WebClient 来简化以前 RestTemplate 比较复杂的写法

在实现过程中,因为我测试的一个接口其返回的数据很多,1m以上,webClient抛出了如下的异常:

image.png

搜索了很多解决方式,比较常见的blog都是通过修改yml的codes的配置来实现的(甚至有的还不生效),但是这种方式,即使生效也显然是这个服务全局的一个配置,而我们其他调用中,并不会使用到如此大的缓冲区,如果存在某个请求量很大的服务,可能造成oom的风险。 后面找到了一种可以在当前调用接口时配置的解决方式:

builder实例化 WebClient 的时候,加一个对codes的配置即可:

WebClient webClient = WebClient.builder().baseUrl("{your_domain}")
    .codecs(codecs -> codecs.defaultCodecs().maxInMemorySize(500 * 1024)).build();

参考文档请见这里