RestTemplate未使用线程池问题的解决方法

一、问题描述

现场出现springboot服务卡死,无法打开页面现象。

初步分析为服务中使用RestTemplate通信框架,但未使用连接池,如果通信抛出异常(连接失败),连续运行一定时间,导致线程飙升,资源耗尽,服务程序宕机。

二、问题再现

模拟无法通信的微服务地址,修改连接2s/次,启动三个微服务demo进行通信,连续测试2小时,现象可再现:

详细如下图:

启动时线程数:

连接异常提示:

线程飙升:

大量未关闭线程:

线程dump信息:

"http-nio-8081-exec-120" #216 daemon prio=5 os_prio=0 tid=0x000000002b0f9800 nid=0x4a28 runnable [0x0000000030349000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)

at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:737)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:672)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:313)

三、问题分析:

主动健康检查时,RestTemplate默认情况下不使用连接池,每次调用都会打开一个新的本地临时端口和一个新连接,如果通信异常,会导致连接不被回收,持续通信,它会不断新建线程,并且很快突破本地可用端口限制范围,导致服务卡死。

四、解决方案:

使用RestTemplate连接池,设置ReadTimeout、ConnectTimeout超时时间,进行连接回收。

五、回归验证:

修改后,验证如下:

初始线程:

测试3小时结束时线程:

线程池线程未增加,状态交替

到此这篇关于RestTemplate未使用线程池问题的解决方法的文章就介绍到这了,更多相关RestTemplate未使用线程池内容请搜索179885.Com以前的文章或继续浏览下面的相关文章希望大家以后多多支持179885.Com!

猜你在找的RestTemplate未使用线程池问题的解决方法相关文章

本文展示通过一个案例来自己手写IOC和AOP代码,通过银行转账案例详细的代码编写和文档解释来说明IOC和AOP的思想,会分享存在的问题和解决问题的思路
不少同学开始慢慢接触多线时候,对线程之间为了保障数据安全性,一致性有所了解,本文详细解介绍java中的21种锁 ,需求的大佬可以参考下
今天给大家带来的是关于Springboot的相关知识,文章围绕着RestTemplate未使用线程池展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
了Springboot开发OAuth2认证授权与资源服务器操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Comparator比较器接口可以将自身传递给排序方法(比如Collections.sort或Arrays.sort),以便对排序顺序进行精确控制。本文讲述Spring中如何使用Comparator接口
今天给大家带来的是关于Java的相关知识,文章围绕着comparable和comparator的区别展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
本文将向您展示如何使用Spring Boot创建一个的Spring Batch的Hello World示例。对和我一样入门的有一定的帮助,感兴趣的小伙伴们可以参考一下
了springboot+springsecurity如何实现动态url细粒度权限认证的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Semaphore一般译作信号量,它也是一种线程同步工具,主要用于多个线程对共享资源进行并行操作的一种工具类。它代表了一种许可的概念,是否允许多线程对同一资源进行操
今天给大家带来的是关于Java的相关知识,文章围绕着Java常见的排序算法展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下
TCP是一种传输控制协议,是面向连接的、可靠的、基于字节流之间的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,TCP完成第四层传输层所指定的功
今天给大家带来的是关于Java的相关知识,文章围绕着Java如何实现树的同构展开,文中有非常详细的介绍及代码示例,需求的大佬可以参考下