Почему использование ribbonReadTimeout не прерывает длинный запрос с Netflix Ribbon? - PullRequest
0 голосов
/ 20 ноября 2018

Мы используем 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

Единственный способ заставить это работать - это ribbon.restclient.enabled=true. Но этот клиент устарел, и я не буду его использовать.

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Мы находим это:

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, чтобы ввести фиксированную задержку сверх таймаута чтения, чтобы убедиться, что он работает нормально.

0 голосов
/ 20 ноября 2018

Я думаю, вам нужно настроить таймауты 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
0 голосов
/ 20 ноября 2018

Не все свойства ленты поддерживаются Spring-Cloud-Netflix при использовании с Spring RestTemplate.Некоторые свойства ленты работают, как описано в документах , но ReadTimeout не является одним из них.Так что это не работает, но это путем desing (согласно ответу на этот вопрос ).Однако, если вы используете Spring * RestTemplate, вы можете установить его там напрямую, например так:

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