Spring Cloud Gateway 缓存区异常
目录
1、问题背景
2、分析源码过程
3、解决办法
最近在测试环境spring cloud gateway突然出现了异常,在这里记录一下,直接上干货
1、问题背景
测试环境spring cloud gateway遇到以下异常
DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144(超出了缓冲区的最大字节数限制)

乍一看,问题很简单啊,通过配置加大缓存区不就行了啊,于是就在application.yml加了以下配置
#将缓存区设置为2m
spring:codec:max-in-memory-size: 2MB
可是问题又出现了,通过调试发现配置的max-in-memory-size在程序启动初始化确实是生效的。但是有业务调用的时候,此参数的接收值为null,maxInMemorySize还是读取的默认值(256K)。
那咋整,只能从源码入手了。

2、分析源码过程
通过异常日志,可以定位到异常位置


后来发现我们自定义的拦截器获取body的信息是获取方式,代码如下

因为HandlerStrategies.withDefaults() 是每次都需要重新创建对象,并非是spring注入的对象,所以每次获取的都是默认值,导致配置不生效。
3、解决办法
在我们自定的拦截器中注入ServerCodecConfigurer类,通过该类获取配置。这样获取到的就是我们在application.yml中配置的缓存区配置的字节数限制了。
具体代码:
@Component
@Slf4j
public class RequestFilter implements GlobalFilter, Ordered {@Overridepublic int getOrder() {return OrderedConstant.HIGHEST_PRECEDENCE;}//手动注入ServerCodecConfigurer@AutowiredServerCodecConfigurer codecConfigurer;@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {StopWatch stopWatch = new StopWatch();stopWatch.start();long startTime = System.currentTimeMillis();try {final Log logDTO = new Log();ServerHttpRequest request = exchange.getRequest();// 设置X-Request-IdAtomicReference<String> requestId = new AtomicReference<>(GenerateIdUtils.requestIdWithUUID());Consumer<HttpHeaders> httpHeadersConsumer = httpHeaders -> {String headerRequestId = request.getHeaders().getFirst(HeaderConstant.REQUEST_ID);if (!Strings.isNullOrEmpty(headerRequestId)) {requestId.set(headerRequestId);}logDTO.setRequestId(requestId.get());httpHeaders.set(HeaderConstant.REQUEST_ID, requestId.get());httpHeaders.set(HeaderConstant.START_TIME_KEY, String.valueOf(startTime));};// codecConfigurer.getReaders()获取pplication.yml中配置的缓存区配置的字节数ServerRequest serverRequest = ServerRequest.create(exchange,codecConfigurer.getReaders());URI requestUri = request.getURI();String uriQuery = requestUri.getQuery();String url = requestUri.getPath() + (!Strings.isNullOrEmpty(uriQuery) ? "?" + uriQuery : "");HttpHeaders headers = request.getHeaders();MediaType mediaType = headers.getContentType();String method = request.getMethodValue().toUpperCase();// 原始请求体final AtomicReference<String> requestBody = new AtomicReference<>();final AtomicBoolean newBody = new AtomicBoolean(false);if (mediaType != null && LogHelper.isUploadFile(mediaType)) {requestBody.set("上传文件");} else {if (method.equals("GET")) {if (!Strings.isNullOrEmpty(uriQuery)) {requestBody.set(uriQuery);}} else {newBody.set(true);}}logDTO.setLevel(Log.LEVEL.INFO);logDTO.setRequestUrl(url);logDTO.setRequestBody(requestBody.get());logDTO.setRequestMethod(method);logDTO.setIp(IpUtils.getClientIp(request));ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().headers(httpHeadersConsumer).build();ServerWebExchange build = exchange.mutate().request(serverHttpRequest).build();return build.getSession().flatMap(webSession -> {logDTO.setSessionId(webSession.getId());if (newBody.get() && headers.getContentLength() > 0) {Mono<String> bodyToMono = serverRequest.bodyToMono(String.class);return bodyToMono.flatMap(reqBody -> {logDTO.setRequestBody(reqBody);// 重写原始请求ServerHttpRequestDecorator requestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {@Overridepublic Flux<DataBuffer> getBody() {NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(new UnpooledByteBufAllocator(false));DataBuffer bodyDataBuffer = nettyDataBufferFactory.wrap(reqBody.getBytes());return Flux.just(bodyDataBuffer);}};return chain.filter(exchange.mutate().request(requestDecorator).build()).then(LogHelper.doRecord(logDTO));});} else {return chain.filter(exchange).then(LogHelper.doRecord(logDTO));}});} catch (Exception e) {log.error("请求日志打印出现异常", e);return chain.filter(exchange);}}}
相关文章:
Spring Cloud Gateway 缓存区异常
目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常,在这里记录一下,直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…...
Spring Boot依赖版本声明
链接 官网 Spring Boot文档官网:https://docs.spring.io/spring-boot/docs/https://docs.spring.io/spring-boot/docs/ Spring Boot 2.0.7.RELEASE Spring Boot 2.0.7.RELEASE reference相关:https://docs.spring.io/spring-boot/docs/2.…...
Java项目:109SpringBoot超市仓管系统
博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 超市仓管系统基于SpringBootMybatis开发,系统使用shiro框架做权限安全控制,超级管理员登录系统后可根据自己的实际需求配角色&…...
【React系列】Redux(三) state如何管理
本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer: function reducer(state ini…...
3D 纹理的综合指南
在线工具推荐:3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…...
LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人
在本文中,使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序,可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-…...
VLOOKUP的使用方法
VLOOKUP是Excel中一个非常有用的函数,用于在一个表格或范围中查找某个值,并返回该值所在行或列的相应数据。 VLOOKUP函数的基本语法如下: VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])lookup_value:要查…...
数据加密、端口管控、行为审计、终端安全、整体方案解决提供商
PC端访问地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于这几个概念的解释: 数据加密:这是一种通过加密算法和密钥将明文转换为密文,以及通过解密算法和解密密钥将密文恢复为明文…...
编码器原理详解
编码器 什么是编码器 编码器可以用来将信息编码成为二进制代码,有点类似于取代号,人为的将二进制代码与对应的信息联系起来。 如下图所示: 假设有这三种情况会发生,且每次只发生一种情况 为了给这三种情况做一个区分ÿ…...
linux下docker搭建mysql8
1:环境信息 centos 7,mysql8 安装docker环境 2.创建mysql容器 2.1 拉取镜像 docker pull mysql:8.0.23 2.2 查询镜像拉取成功 docker images 2.3 创建挂载的目录文件 mkdir /usr/mysql8/conf mkdir /usr/mysql8/data ##给data文件赋予操作权限 chmod 777 /…...
书生·浦语大模型实战1
书生浦语大模型全链路开源体系 视频链接:书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型之所以能收到这么高的关注度,一个重要原因是大模型是发展通用人工智能的重要途径 深度信念网络: (1)又被称为贝叶斯网…...
前端JS加密对抗由浅入深-1
前言: 本文主要讲解,针对前端加密数据传输站点,如何进行动态调试以获取加密算法、秘钥,本次实验不涉及漏洞挖掘,仅为学习演示,环境为本地搭建环境 此次站点加密方式为AES加密方式,现如今越来越…...
八股文打卡day17——计算机网络(17)
面试题:拥塞控制是怎么实现的? 我的回答: 1.慢启动 在连接刚建立的时候,会缓慢调大滑动窗口的大小,从而加大网络传输速率,避免速率太快,造成拥塞。 2.拥塞避免 慢启动之后,会进入拥…...
Java-经典算法-logcat获取数据
1 需求 2 语法 3.1 示例:打印本次查询数据 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;/*** 功能:adb logcat -b main -s PRIVA_LOG -d*/ public class Test {public …...
APache 网页优化
技能目标: 掌握 Apache 网页压缩 掌握 Apache 网页缓存 掌握 Apache 网页防盗链 掌握 Apache 隐藏版本信息 4.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中,只有对 Apache 服务器进行适当的优化配 置&…...
C语言实现关键字匹配算法(复制即用)
文章目录 前言功能要求运行截图全部代码 前言 无套路,均已上机通过,求个关注求个赞,提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中,请统计该文件中关键字出现的频度,并按此频度对关键字进行排序。要…...
【大数据】安装 Zookeeper 单机版
安装 Zookeeper 单机版 下面安装 Zookeeper,由于它是 Apache 的一个顶级项目,所以域名是 zookeeper.apache.org,所有 Apache 的顶级项目的官网都是以项目名 .apache.org 来命名的。 点击 Download 即可下载,这里我们选择的版本是 …...
Django 快速整合 Swagger:实用步骤和最佳实践
Django ,作为 Python 编写的一个优秀的开源 Web 应用框架,特别适用于快速开发的团队。对于很多场景来说,我们需要一份 API 文档,好处实在太多了: 提高开发效率:开发者可以基于 API 文档 快速学习和尝试 AP…...
C++ cstdio
头文件 <cstdio> 是 C 中的标准输入输出库(C Standard Input and Output Library)头文件,它提供了一系列的输入输出函数。以下是其中一些主要的函数: 输入函数: scanf: 格式化输入函数,用于从标准输入…...
昇腾多卡通信教程【配置网络检测对象IP】
无法通信会出现的错误如下 一、网络健康状态报错 命令原型 hccn_tool [-i %d] -netdetect -s [address %s]命令功能 本功能支持用户执行命令获取网络健康状态(本端与所配置的检测IP之间的连通状态),用户可指定上报的状态信息名称。 状态信…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
