排查SpringCloudGateway的readAddress(..) failed: Connection reset by peer问题(利用arthas)

阅读: 评论:0

排查SpringCloudGateway的readAddress(..) failed: Connection reset by peer问题(利用arthas)

排查SpringCloudGateway的readAddress(..) failed: Connection reset by peer问题(利用arthas)

问题

[id:48b8a8f5-1, L:/网关:37187 - R:应用/应用:应用端口] The connection observed an error, the request cannot be retried as the headers/body were sent
ioty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peer
[2021-12-28T11:31:06,329] DEBUG  Stopping retries since predicate returned false, retry context: iteration=1 exception=ioty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peer backoff={0ms}
[2021-12-28T11:31:06,330] ERROR  ==>返回错误信息
ioty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peerSuppressed: publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):|_ checkpoint ⇢ org.s.reactive.CorsWebFilter [DefaultWebFilterChain]...|_ checkpoint ⇢ HTTP POST "接口" [ExceptionHandlingWebHandler]
Stack trace:

分析

大体一看,是netty报的io异常,然后被reactor-netty抛出到网关返回了。
reactor-netty是SCG的底层依赖,去

发现有同样的issue。
大体总结就是

  1. 后端应用tomcat有个keepalivetimeout,默认与connecttimeout相同,为20s。也就是说闲置20s的连接会被断开丢弃,主要跟keepalive长连接有关。
  2. SCG网关有个连接池,存放与后端应用tomcat的通道连接,默认不释放回收,取用连接方式为FIFO先入先出(取用最早建立的连接)
  3. 以上两者,其中至少一个没有配置正确,导致SCG连接池释放闲置时间大于tomcat与网关的断开时间,就会导致浏览器向网关请求,网关获取到的连接是已经断开的连接,继续向tomcat请求,tomcat发现使用的是废弃的连接则返回reset,网关抛出异常,但后续接口不受影响。
    可简单参考下图。.

解决

①配置SCG网关
spring:cloud:gateway:httpclient:response-timeout: 10spool:type: fixedmax-idle-time: 5000max-connections: 200acquire-timeout: 45000
②配置网关启动参数:reactor-netty取用连接的规则LIFO
-Dreactorty.pool.leasingStrategy=lifo
③配置tomcat的闲置断开时间
server:tomcat:connection-timeout: 10000 #根据需要
⑤配置nacos 元数据
spring: cloud:nacos:discovery:metadata:response-timeout: 10000connect-timeout: 3000
④配合nginx关于keepalive的配置
upstream gateway {
#	ip_hash;:xx weight=1;:xx weight=1;keepalive 100;keepalive_requests 30000;keepalive_timeout 300s;
}
location /xxx{
proxy_pass gateway;
proxy_http_version 1.1;
proxy_set_header Connection "";
}

用arthas测试(其他)

使用arthas
.html

curl -O .jar
java -jar arthas-boot.jar

附加到网关

 vmtool --action getInstances --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader --className  sources.PooledConnectionProvider --express 'instances[0].defaultPoolFactory.leasingStrategy'

返回

@String[lifo]

则说明修改成功


👉推荐!!!【腾讯云】爆款2核4G云服务器首年74元/年
👉推荐!!!【腾讯云】1核2G5M轻量应用服务器50元/年
【腾讯云】云数据库低至9.9/年!MySQL7.4元/月
【阿里云】ECS云服务器特惠
【阿里云】服务器首购优惠
如果文章对您有帮助,扫个红包码呗

本文发布于:2024-02-01 15:19:46,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170677198837545.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:vue el
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23