Java Spring Boot应用程序-任何rest API端点的默认超时是多少,或者控制所有端点超时的简单配置是多少

Java Spring Boot应用程序-任何rest API端点的默认超时是多少,或者控制所有端点超时的简单配置是多少,java,spring,rest,spring-boot,microservices,Java,Spring,Rest,Spring Boot,Microservices,我正在使用当前的Spring引导版本(1.4.x),不知道它是否有api调用的默认超时。我通过设置断点对它进行了测试,但它一直在等待,没有超时。 我还试图通过使用一些注释或yml设置为我的所有spring boot应用程序配置默认超时 我找到了两个备选方案(其中一个),但使用callable实际上添加了额外的非业务逻辑代码,在最新的spring boot应用程序中,在xml bean中设置某些内容已经过时了。有两种方法可以做到这一点: 1) 将clienthtprequestfactory与re

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


我找到了两个备选方案(其中一个),但使用callable实际上添加了额外的非业务逻辑代码,在最新的spring boot应用程序中,在xml bean中设置某些内容已经过时了。

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

1) 将
clienthtprequestfactory
restemplate
一起使用:

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

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

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

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

请参考这个答案如何为Tomcat设置它


您可以在应用程序中尝试
服务器。连接超时=5000

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

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

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


这被称为断路器模式,在一个名为Hystrix的框架中已经有了它的实现。下面是一篇很好的文章,对其进行了深入的解释:。Spring Cloud Faign+Spring Cloud Hystrix看起来非常不错,特别是考虑到他们使用的是现成的发现服务(例如Spring Cloud Eureka)。

我同意以上所有选项,并在我的Spring boot应用程序中尝试了以下选项。它现在运行得很好。下面是作为bean的代码示例。现在只需要
@Autowire
restemplate
我需要它的任何地方(
java类

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

        return restTemplate;
    }

您可以使用注释
@configuration


用于使用RestTemplate

` @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {

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

      .build();
}`
对于网络客户端超时:

 @Bean
    public WebClient webClient() {
        return WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(
                        HttpClient.create().responseTimeout(Duration.ofMillis(30000))
                ))
                .build();
    }
配置完成后,在要使用此RestTemplateWebClient的控制器或任何其他文件中,只需像以下那样自动连线即可:

@Autowired
private RestTemplate restTemplate;


您使用的是Tomcat还是Undertow?使用Spring Boot default embedded Tomcat。服务器的默认值是多少。连接超时?什么是“回退数据”?例如,如果您有一家亚马逊在线商店,您希望为用户显示推荐,但推荐服务负载很重,响应速度很慢。如果出现这种情况,您可以立即返回回退数据。在这种情况下,您可以返回前100名最受欢迎的项目,而无需等待推荐服务的响应。断路器模式就是关于这个想法的。我认为答案是错误的,
服务器。连接超时基本上是空闲连接超时。工作起来很有魅力
@Autowired
private WebClient webClient;