Spring Boot应用程序 – 任何其他API端点的默认超时或控制所有端点超时的简单配置

我正在使用当前的Spring启动版本(1.4.x),并想知道api调用是否有任何默认超时。 我已经通过设置断点来测试它,但它一直在等待并且没有超时。 我还试图通过使用一些注释或yml设置为我的所有spring-boot应用程序配置默认超时。

我找到了几个替代方案(其中一个在这里 ),但是使用callable实际上添加了额外的非业务逻辑代码,其中在xml bean中设置一些内容在最新的Spring启动应用程序中已经过时了。

我同意以上所有选项并在我的春季启动应用程序中尝试以下选项。 它现在完美无缺。 下面是作为bean的代码示例。 现在只需要@Autowire RestTemplate在哪里( java class )我需要它。

  @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000); ((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000); return restTemplate; } 

有几种方法可以做到这一点:

1)将ClientHttpRequestFactoryRestTemplate ClientHttpRequestFactory使用:

 public RestTemplate restTemplate() { return new RestTemplate(clientHttpRequestFactory()); } private ClientHttpRequestFactory clientHttpRequestFactory() { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setReadTimeout(timeinMillis); factory.setConnectTimeout(timeinMillis); return factory; } 

2)第二种方法是使用可调用但我猜你已经探索过这个解决方案。

您可以在application.properties中尝试server.connection-timeout=5000从官方文档 :

server.connection-timeout =#连接器在关闭连接之前等待另一个HTTP请求的时间(以毫秒为单位)。 未设置时,将使用连接器的特定于容器的默认值。 使用值-1表示没有(即无限)超时。

更新:刚刚注意到你使用微服务架构,所以如果你需要在微服务之间进行通信时处理超时,我建议在客户端而不是服务器端处理它。 如果您尝试调用的微服务过载并且其性能降低到严重影响用户体验的程度,有时最好返回一些回退数据,而不仅仅是删除请求。

想象一下,我们有一个拥有微服务架构的电子商务网站,其中一个向用户提供建议的微服务变得极其缓慢。 在这种情况下,首选的解决方案是返回一些后备数据,这些数据可能是本月十大热门产品,而不是向客户显示5xx错误页面。 此外,如果后续请求因超时而失败,我们可以决定避免向“推荐服务”发送请求并立即返回回退数据。 一段时间后,我们可以尝试再次向“推荐服务”发送请求,如果它变得健康 – 只需使用它而不是后备数据。

这称为Circuit Breaker模式,并且已经在名为Hystrix的框架中实现了它。 这是一篇很好的文章,深入解释它: http : //www.baeldung.com/spring-cloud-netflix-hystrix 。 Spring Cloud Feign + Spring Cloud Hystrix看起来非常不错,特别是考虑到他们使用开箱即用的Discovery服务(例如Spring Cloud Eureka)。

可以使用Tomcat的connectionTimeout属性设置超时。

请参考此答案如何为Tomcat设置它。

在Spring Boot嵌入式Tomcat中配置maxKeepAliveRequests