春季启动应用程序 - 什么是任何休息 API 端点的默认超时,或者是控制所有端点超时的简单配置

2022-09-03 18:00:03

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

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


答案 1

您可以在 application.properties 中试用。从官方文档中可以看出server.connection-timeout=5000

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

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

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

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


答案 2

我同意上述所有选项,并在我的春季启动应用程序中尝试了以下选项。它现在工作得很好。下面是作为 Bean 的代码示例。现在只需要任何地方()我需要它。@AutowireRestTemplatejava class

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

        return restTemplate;
    }