我有一个基于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会以这种方式表现出来?
答案 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