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

时间:2017-05-31 03:08:28

标签: java spring rest spring-boot microservices

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

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

5 个答案:

答案 0 :(得分:4)

您可以在application.properties中尝试server.connection-timeout=5000official documentation

  

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

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

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

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

答案 1 :(得分:3)

我同意以上所有选项并在我的春季启动应用程序中尝试以下选项。它现在完美无缺。下面是作为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;
    }

答案 2 :(得分:2)

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

1)将ClientHttpRequestFactoryRestTemplate一起使用:

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

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

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

答案 3 :(得分:0)

可以使用Tomcat的$.alert(divID,'Main Menu',1000,600);属性设置超时。

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

Configuring maxKeepAliveRequests in Spring Boot embedded Tomcat

答案 4 :(得分:0)

您可以使用注解 @Configuration

创建配置文件 对于使用 RestTemplate

` @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

        return new RestTemplateBuilder()
                .setConnectTimeout(Duration.ofMillis(30000))
                .setReadTimeout(Duration.ofMillis(30000))
      

      .build();
}`

对于 WebClient 超时:

 @Bean
    public WebClient webClient() {
        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(
                        HttpClient.create().responseTimeout(Duration.ofMillis(30000))
                ))
                .build();
    }

配置完成后,在控制器或任何其他要使用此RestTemplateWebClient 的文件中,只需像这样自动装配:

@Autowired
private RestTemplate restTemplate;

@Autowired
private WebClient webClient;