当前位置: 首页 > news >正文

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突然出现了异常&#xff0c;在这里记录一下&#xff0c;直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…...

Spring Boot依赖版本声明

链接 官网 Spring Boot文档官网&#xff1a;​​​​​​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相关&#xff1a;https://docs.spring.io/spring-boot/docs/2.…...

Java项目:109SpringBoot超市仓管系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 超市仓管系统基于SpringBootMybatis开发&#xff0c;系统使用shiro框架做权限安全控制&#xff0c;超级管理员登录系统后可根据自己的实际需求配角色&…...

【React系列】Redux(三) state如何管理

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. reducer拆分 1.1. reducer代码拆分 我们来看一下目前我们的reducer&#xff1a; function reducer(state ini…...

3D 纹理的综合指南

在线工具推荐&#xff1a;3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 我们经常看到超现实主义的视频游戏和动画电影角色出现在屏幕上。他们皮肤上的…...

LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人

在本文中&#xff0c;使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序&#xff0c;可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-…...

VLOOKUP的使用方法

VLOOKUP是Excel中一个非常有用的函数&#xff0c;用于在一个表格或范围中查找某个值&#xff0c;并返回该值所在行或列的相应数据。 VLOOKUP函数的基本语法如下&#xff1a; VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup])lookup_value&#xff1a;要查…...

数据加密、端口管控、行为审计、终端安全、整体方案解决提供商

PC端访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于这几个概念的解释&#xff1a; 数据加密&#xff1a;这是一种通过加密算法和密钥将明文转换为密文&#xff0c;以及通过解密算法和解密密钥将密文恢复为明文…...

编码器原理详解

编码器 什么是编码器 编码器可以用来将信息编码成为二进制代码&#xff0c;有点类似于取代号&#xff0c;人为的将二进制代码与对应的信息联系起来。 如下图所示&#xff1a; 假设有这三种情况会发生&#xff0c;且每次只发生一种情况 为了给这三种情况做一个区分&#xff…...

linux下docker搭建mysql8

1&#xff1a;环境信息 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

书生浦语大模型全链路开源体系 视频链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型之所以能收到这么高的关注度&#xff0c;一个重要原因是大模型是发展通用人工智能的重要途径 深度信念网络&#xff1a; &#xff08;1&#xff09;又被称为贝叶斯网…...

前端JS加密对抗由浅入深-1

前言&#xff1a; 本文主要讲解&#xff0c;针对前端加密数据传输站点&#xff0c;如何进行动态调试以获取加密算法、秘钥&#xff0c;本次实验不涉及漏洞挖掘&#xff0c;仅为学习演示&#xff0c;环境为本地搭建环境 此次站点加密方式为AES加密方式&#xff0c;现如今越来越…...

八股文打卡day17——计算机网络(17)

面试题&#xff1a;拥塞控制是怎么实现的&#xff1f; 我的回答&#xff1a; 1.慢启动 在连接刚建立的时候&#xff0c;会缓慢调大滑动窗口的大小&#xff0c;从而加大网络传输速率&#xff0c;避免速率太快&#xff0c;造成拥塞。 2.拥塞避免 慢启动之后&#xff0c;会进入拥…...

Java-经典算法-logcat获取数据

1 需求 2 语法 3.1 示例&#xff1a;打印本次查询数据 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader;/*** 功能&#xff1a;adb logcat -b main -s PRIVA_LOG -d*/ public class Test {public …...

APache 网页优化

技能目标&#xff1a; 掌握 Apache 网页压缩 掌握 Apache 网页缓存 掌握 Apache 网页防盗链 掌握 Apache 隐藏版本信息 4.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中&#xff0c;只有对 Apache 服务器进行适当的优化配 置&…...

C语言实现关键字匹配算法(复制即用)

文章目录 前言功能要求运行截图全部代码 前言 无套路&#xff0c;均已上机通过&#xff0c;求个关注求个赞&#xff0c;提供答疑解惑服务。 功能要求 一份C源代码存储在一个文本文件中&#xff0c;请统计该文件中关键字出现的频度&#xff0c;并按此频度对关键字进行排序。要…...

【大数据】安装 Zookeeper 单机版

安装 Zookeeper 单机版 下面安装 Zookeeper&#xff0c;由于它是 Apache 的一个顶级项目&#xff0c;所以域名是 zookeeper.apache.org&#xff0c;所有 Apache 的顶级项目的官网都是以项目名 .apache.org 来命名的。 点击 Download 即可下载&#xff0c;这里我们选择的版本是 …...

Django 快速整合 Swagger:实用步骤和最佳实践

Django &#xff0c;作为 Python 编写的一个优秀的开源 Web 应用框架&#xff0c;特别适用于快速开发的团队。对于很多场景来说&#xff0c;我们需要一份 API 文档&#xff0c;好处实在太多了&#xff1a; 提高开发效率&#xff1a;开发者可以基于 API 文档 快速学习和尝试 AP…...

C++ cstdio

头文件 <cstdio> 是 C 中的标准输入输出库&#xff08;C Standard Input and Output Library&#xff09;头文件&#xff0c;它提供了一系列的输入输出函数。以下是其中一些主要的函数&#xff1a; 输入函数&#xff1a; scanf: 格式化输入函数&#xff0c;用于从标准输入…...

昇腾多卡通信教程【配置网络检测对象IP】

无法通信会出现的错误如下 一、网络健康状态报错 命令原型 hccn_tool [-i %d] -netdetect -s [address %s]命令功能 本功能支持用户执行命令获取网络健康状态&#xff08;本端与所配置的检测IP之间的连通状态&#xff09;&#xff0c;用户可指定上报的状态信息名称。 状态信…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; 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&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 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&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...