Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >springcloud gateway代理get正常、post请求报错的问题

springcloud gateway代理get正常、post请求报错的问题

作者头像
天涯泪小武
发布于 2019-01-17 04:09:00
发布于 2019-01-17 04:09:00
4.6K70
代码可运行
举报
文章被收录于专栏:SpringCloud专栏SpringCloud专栏
运行总次数:0
代码可运行

在上一篇时,我们在使用gateway的反向代理功能时,发现了一个很严重的问题,那就是通过gateway去访问后端服务时,如果发起的是Get请求,就一切正常,如果是Post请求,就会报错。无论是使用什么filter。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.IllegalStateException: Only one connection receive subscriber allowed.
	at reactor.ipc.netty.channel.FluxReceive.startReceiver(FluxReceive.java:279) [reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
	at reactor.ipc.netty.channel.FluxReceive.lambda$subscribe$2(FluxReceive.java:129) [reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
	at reactor.ipc.netty.channel.FluxReceive$$Lambda$714/21949105.run(Unknown Source) [reactor-netty-0.7.10.RELEASE.jar:0.7.10.RELEASE]
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) [netty-common-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446) [netty-transport-4.1.29.Final.jar:4.1.29.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.29.Final.jar:4.1.29.Final]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_40]

如果使用的是Springboot2.0.5之前的版本,不存在该问题,之后的但凡是非Get请求,就会报该错误。

该异常意思是请求体只能被消费一次,也就是说这个请求的body已经被读取过一次了,再次封装转发时会报错。这个问题比较怪异,很早之前我们知道@RequestBody接收的参数,是不能被读取第二次的,假如被网关的日志读取消费过了,那么后续的服务就无法再接收到该参数了。要想保持参数还在,就只能自己再去构造一个同样的RequestBody,发给后端的服务。但是,这次是普通的Post的form表单,居然也报这个错,就比较奇怪了。

gateway反向代理的原理是,首先读取原请求的数据,然后构造一个新的请求,将原请求的数据封装到新的请求中,然后再转发出去。

该错误是Springboot的升级导致的,具体的详细解析在https://github.com/spring-cloud/spring-cloud-gateway/issues/541

最终作者也给了解决方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new HiddenHttpMethodFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
                return chain.filter(exchange);
            }
        };
    }

加上上面这一段就OK了。

实测,确实OK。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年10月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
7 条评论
热度
最新
大佬 文章中的这段代码 需要添加到哪里呢
大佬 文章中的这段代码 需要添加到哪里呢
回复回复点赞举报
大佬 你们对 springcloud gateway + nacos 这个进行过压测吗?我最近压测了一下,如果不更改nacos自带Ribon默认规则,我发现他转发请求到真正提供服务的机器上面并不均衡呀;ribon替换成轮询策略,压测经常会把网关压垮,访问服务404,你们遇到过吗?
大佬 你们对 springcloud gateway + nacos 这个进行过压测吗?我最近压测了一下,如果不更改nacos自带Ribon默认规则,我发现他转发请求到真正提供服务的机器上面并不均衡呀;ribon替换成轮询策略,压测经常会把网关压垮,访问服务404,你们遇到过吗?
回复回复点赞举报
大佬 问个问题 使用springcloud gateway做网关 nacos做注册中心 现在通过gateway访问provider里面的post接口,能成功访问,服务方也能收到参数;但是网关会报错,“java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.core.io.buffer.PooledDataBuffer”;请问遇到过吗 方便的话 麻烦帮忙看一下 谢谢
大佬 问个问题 使用springcloud gateway做网关 nacos做注册中心 现在通过gateway访问provider里面的post接口,能成功访问,服务方也能收到参数;但是网关会报错,“java.lang.ClassCastException: java.lang.String cannot be cast to org.springframework.core.io.buffer.PooledDataBuffer”;请问遇到过吗 方便的话 麻烦帮忙看一下 谢谢
44点赞举报
没遇到过哦
没遇到过哦
回复回复点赞举报
那文章中的这段代码 需要添加到哪里呢? 我试着把他放在GlobalFilter的实现类 没什么反应呀;
那文章中的这段代码 需要添加到哪里呢? 我试着把他放在GlobalFilter的实现类 没什么反应呀;
回复回复点赞举报
查看全部4条回复
推荐阅读
编辑精选文章
换一批
Netty笔记:直接内存OOM且进程僵死问题排查
一天自己接手的一个日志透传模块出现大量直接内存OOM的异常日志告警,且不久进程出现僵死,服务不可用。关键错误日志如下:
皮皮熊
2022/04/10
6.1K0
Netty笔记:直接内存OOM且进程僵死问题排查
spring boot启动时redis报错: DENIED Redis is running in protected mode, no bind address was specified。
临时解决方法,去除redis的安全模式。 打开reids配置文件,修改安全模式为:no
leehao
2025/02/11
1460
WIN10修改Hyper-V动态端口范围
因为使用Windows 10中的WSL 2功能需要启用Hyper-V,其结果是导致了IDEA在启动的时候提示端口被占用。
用户5746037
2022/05/18
1.8K0
SpringCloud Gateway堆外内存溢出排查
生产环境网关模块偶发的 OutOfDirectMemoryError 错误排查起来困难且曲折,2021-02-05号也出现过此问题,起初以为是 JVM 堆内存过小 (当时是 2g) 导致,后调整到8g(2月5号调整)。但是经过上次调整后5月7号又出现此问题,于是猜测可能是由于网关模块存在内存泄露导致。
BUG弄潮儿
2022/04/15
2.9K0
SpringCloud Gateway堆外内存溢出排查
SpringCloud Gateway 测试问题解决
本文遇到的问题都是在测试环境真正遇到的问题,不一定试用于所有人,仅做一次记录,便于遇到同样问题的干掉这些问题。
猿天地
2019/05/07
2.6K0
SpringCloud Gateway 测试问题解决
SpringCloud-gateway全局GlobalFilter获取post的请求参数
gateway里面可以自定义普通filter,也可以创建自定义的GlobalFilter。
天涯泪小武
2019/01/17
9.1K1
io.protostuff.runtime.RuntimeUnsafeFieldFactory cannot have the same number
可以看到,在循环字段的时候,如果filed数组不为空,那么说明编号重复。 反查代码:有两个一样的编号。
MickyInvQ
2020/09/27
8720
io.protostuff.runtime.RuntimeUnsafeFieldFactory  cannot have the same number
一天入门java开源区块链-jdchain
jdchain是京东数科开源的区块链平台,目标是实现一个面向企业应用场景的通用区块链框架系统,能够作为企业级基础设施,为业务创新提供高效、灵活和安全的解决方案。之所以选择jdchain研究是因为jdchain是为数不多的底层也是采用java实现的一个区块链平台
kl博主
2023/11/18
8230
一天入门java开源区块链-jdchain
Fail to start qos server: dubbo version: current host: java.net.BindException:
报错信息如下: Address already in use at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:437) at sun.nio.ch.Net.bind(Net.java:429) at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.ja
MickyInvQ
2020/09/27
1K0
SpringCloudGateway笔记(5)-netty空指针问题
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
1.6K0
IDEA2021启动报错Your JRE: 11.0.10+9-b1341.41 amd64 (JetBrains s.r.o.)\jbr libpng warning: iCCP: cHRM
Internal error. Please refer to https://jb.gg/ide/critical-startup-errors
猫头虎
2024/04/07
1.2K0
IDEA2021启动报错Your JRE: 11.0.10+9-b1341.41 amd64 (JetBrains s.r.o.)\jbr libpng warning: iCCP: cHRM
Yarn application has already exited with state FINISHED!
如果在运行spark-sql时遇到如下这样的错误,可能是因为yarn-site.xml中的配置项yarn.nodemanager.vmem-pmem-ratio值偏小,它的默认值为2.1,可以尝试改大一点再试。
一见
2018/08/02
1.2K0
webclient的超时时间配置
SO_TIMEOUT只适用于OIO,对于NIO不适用;使用ReadTimeoutHandler 或者block(Duration)都关闭client端,非reactive的服务端无法感知Terminated,reactive的服务端可以感知到Terminated
code4it
2018/09/17
9K0
聊聊reactor extra的retry
reactor-extra-3.1.4.RELEASE-sources.jar!/reactor/retry/Retry.java
code4it
2018/09/17
1.4K0
20-Netty TCP 粘包和拆包及解决方案
假设客户端分别发送了两个数据包D1和D2给服务端, 由于服务端一次读取到字节数是不确定的,故有可能存在以下四种情况
彼岸舞
2022/02/18
7050
20-Netty TCP 粘包和拆包及解决方案
当Tomcat遇上Netty
分部给到的异常日志大概是这样(鉴于公司规定禁止截图禁止拍照禁止外传任何信息,下面是我网上找到一张类似的报错):
彤哥
2020/05/22
1.2K1
当Tomcat遇上Netty
springboot整合redis一直报远程主机强迫关闭了一个现有的连接
需要修改一下2处,好像timeout 默认就是0,tcp-keepalive默认就是300,那为什么还回报错呢?可能是启动的时候没有指定配置文件
九转成圣
2024/05/08
7390
SpringCloudGateway笔记(11)-异常拦截
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
1.1K0
BindTransportException: Failed to bind to [9300]
本质原因是elasticsearch.yml文件的参数配置不正确。由于自己检查不仔细,花了很长时间没有发现参数错误。 后来才发现是一个低级错误:3个节点的Elasticsearch集群中,elastic1节点的配置文件elasticsearch.yml的IP写错啦,IP地址本应是192.168.12.160,我写成了192.168.12.158啦。
程裕强
2019/05/27
5.7K0
聊聊WebClient的LoadBalance支持
spring-cloud-commons-2.0.0.RC1-sources.jar!/org/springframework/cloud/client/loadbalancer/reactive/LoadBalancerExchangeFilterFunction.java
code4it
2018/09/17
2.7K0
推荐阅读
相关推荐
Netty笔记:直接内存OOM且进程僵死问题排查
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档