Spring Boot Application-什么是任何其他API端点的默认超时时间或用于控制所有端点超时的简单配置

Gun*_*mar 6 java rest spring spring-boot microservices

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

我发现了几种替代方法(这里是其中一种),但是使用可调用的方法实际上会添加额外的非业务逻辑代码,其中在xml bean中设置某些内容在最新的Spring Boot应用程序中已经过时了。

try*_*arn 7

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

1)ClientHttpRequestFactory与以下一起使用RestTemplate

public RestTemplate restTemplate() {
    return new RestTemplate(clientHttpRequestFactory());
}

private ClientHttpRequestFactory clientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
    factory.setReadTimeout(timeinMillis);
    factory.setConnectTimeout(timeinMillis);
    return factory;
}
Run Code Online (Sandbox Code Playgroud)

2)第二种方法是使用可调用的,但我想您已经探索过该解决方案。


Dan*_*sky 7

您可以尝试server.connection-timeout=5000使用application.properties。根据官方文档

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

更新:刚注意到您使用微服务体系结构,因此,如果在微服务之间进行通信时需要处理超时,我建议在客户端而不是服务器端进行处理。如果您尝试调用的微服务超载,并且其性能下降到严重影响用户体验的程度,那么有时返回一些后备数据比丢弃请求更好。

想象一下,我们有一个具有微服务架构的电子商务网站,而向用户提供建议的微服务之一变得非常慢。在这种情况下,首选解决方案是返回一些后备数据,这些数据可能是本月最受欢迎的10种产品,而不是向客户显示5xx错误页面。此外,如果后续请求因超时而失败,我们可以做出决定,避免将请求发送到“推荐服务”并立即返回后备数据。一段时间后,我们可以尝试再次向“推荐服务”发送请求,如果请求正常,则可以使用它代替后备数据。

这称为断路器模式,并且已经在称为Hystrix的框架中实现了该模式。这是一篇很好的文章,对其进行了深入的解释:http : //www.baeldung.com/spring-cloud-netflix-hystrix。Spring Cloud Feign + Spring Cloud Hystrix看起来非常不错,特别是考虑到它们与现成的发现服务(例如Spring Cloud Eureka)一起使用。

  • server.connection-timeout的默认值是什么? (4认同)

Gun*_*mar 6

我同意上述所有选项,并在我的 Spring Boot 应用程序中尝试了以下选项。它现在工作得很好。下面是作为 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;
    }
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是抄袭。您复制了我之前发布的答案并将其分享为您自己的答案。:) 没关系,我不会举报,但不鼓励这样做。 (4认同)