为什么使用RibbonReadTimeout不会中断Netflix Ribbon的长时间请求?

时间:2018-11-20 07:06:15

标签: spring-boot spring-cloud spring-cloud-netflix netflix-ribbon

我们将Spring Boot 2.0.0.RELEASE与spring-cloud-starter-netflix-ribbon一起用于我们的微服务。我将ribbon.readTimeout=1000设置为慢速请求,并在@GetMapping方法中使用我们的微服务设置断点进行检查,而不发送响应。在我的测试中,我一直在等待10分钟,并且没有任何异常。似乎根本没有readTimeout。

服务配置

ribbon:
  ReadTimeout: 1000

my-service:
  ribbon:
    eureka:
      enabled: false
    listOfServers: localhost:8080
    ReadTimeout: 1000
    ConnectTimeout: 1000

a使其起作用的唯一方法是ribbon.restclient.enabled=true。但是此客户端已被弃用,我不会使用它。

3 个答案:

答案 0 :(得分:1)

在与Spring RestTemplate一起使用时,spring-cloud-netflix并不支持所有功能区属性。如docs中所述,有些功能区属性有效,但是ReadTimeout不是其中之一。因此它不起作用,而是通过设计(根据对此issue的响应)进行的。但是,如果您使用的是Spring的RestTemplate,则可以直接在此处进行设置,例如:

@LoadBalanced
@Bean
RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder
        .setReadTimeout(2000)
        .build();
}

答案 1 :(得分:0)

我们找到了:

serviceA.ribbon.ReadTimeout=8000

使用弹簧云2.1.0.RELEASE

与弹簧靴Finchley.SR2配合良好
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

但是,我们在客户端中通过伪装使用功能区:

@FeignClient(value = "serviceA")
public interface ServiceAClient {

    @GetMapping(value = "/test")
    String getTest();
}

然后,我们使用Wiremock测试在读取超时之上引入固定的延迟,以验证其是否可以正常工作。

答案 2 :(得分:0)

我认为您需要配置Hystrix超时。看一下文档的这一部分:http://cloud.spring.io/spring-cloud-static/Edgware.RELEASE/single/spring-cloud.html#_hystrix_timeouts_and_ribbon_clients 可能是这样的:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 1100
ribbon:
  ConnectTimeout: 1000
  ReadTimeout: 1000