同时调用时为什么RestTemplate会挂起?

时间:2018-02-19 07:11:33

标签: java spring rest resttemplate

我有一个基于Spring Boot的应用程序,并使用compile 'com.android.support:appcompat-v7:26.1.0' 发送HTTP请求。应用程序发送请求的某些端点响应速度非常慢,但有些端点响应速度很快。当大约20个线程并行使用RestTemplate的服务时,RestTemplate会挂起并等待某些事情(对快速端点的某些请求执行速度比它们应该慢得多)。 当我切换到Jersey HTTP客户端时,问题就消失了,所以它本身必须是RestTemplate

我使用RestTemplate创建bean:

RestTemplateBuilder

并使用@Bean public RestTemplate restTemplate(RestTemplateBuilder builder) { return builder.build(); } 方法发送请求:

exchange

有谁知道为什么RestTemplate会以这种方式表现出来?

2 个答案:

答案 0 :(得分:1)

可能与LocalTime.MIN配置设置有关。

您可以运行 ZonedDateTime otherDate = ZonedDateTime.of(2018, 2, 20, 13, 45, 0, 0, ZoneId.of("America/Santa_Isabel")); if (date.toLocalDate().isAfter(otherDate.toLocalDate())) { // ... } (例如8800)来查找类似的内容:

RestTemplate

即使netstat -an | grep <app port>可能已为多个连接配置,... lot of: TCP 127.0.0.1:61186 127.0.0.1:8800 TIME_WAIT TCP 127.0.0.1:61190 127.0.0.1:8800 TIME_WAIT handful of: TCP 127.0.0.1:61198 127.0.0.1:8800 ESTABLISHED TCP 127.0.0.1:61204 127.0.0.1:8800 ESTABLISHED ... 的{​​{1}}也会阻止主机(响应时间较长)劫持conn池。

您可能需要多个RestTemplate实例,转RestTemplate,修复/改善相关端点的响应时间,...

前段时间我在博客上发表了这个问题:Troubleshooting Spring's RestTemplate Requests Timeout

答案 1 :(得分:0)

如果您在spring boot项目中具有执行器依赖性,则它在内部使用Micrometer来生成度量标准。

指标之一是 http.client.requests ,该记录跟踪RestTemplate处理的所有请求。在内部,千分尺创建一个ConcurrentHashMap,该跟踪将每个端点作为键进行跟踪。例如-如果您有端点,请说

/api/user/{userId}

,如果您使用不同的用户ID对其进行了100次点击,千分尺将在其映射中创建100个条目。对于较低的环境这不是问题。但是在PROD环境中可能会导致性能显着下降,在PROD环境中,成千上万的条目会堆积起来,并减慢了Major GC启动之前的响应时间。

一种解决方案是通过在application.properties中包含以下属性来关闭该指标

management.metrics.enable.http.client.requests=false