Nous utilisons Spring Boot 2.0.0.RELEASE avec spring-cloud-starter-netflix-ribbon pour nos micro-services. J'ai défini ribbon.readTimeout=1000 pour les requêtes lentes et je le vérifie avec notre point d'arrêt de configuration de micro service dans la méthode @GetMapping sans envoyer de réponse. Dans mon test, j'ai attendu 10 minutes et je n'ai obtenu aucune exception. Il semble qu'il n'y ait pas du tout de readTimeout.

Configuration du service

ribbon:
  ReadTimeout: 1000

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

La seule façon dont un peut le faire fonctionner est ribbon.restclient.enabled=true. Mais ce client est obsolète et je n'ai pas l'habitude de l'utiliser.

1
Alexey Saltanov 20 nov. 2018 à 10:06

3 réponses

Meilleure réponse

Toutes les propriétés du ruban ne sont pas prises en charge par spring-cloud-netflix lorsqu'elles sont utilisées avec un Spring RestTemplate. Certaines propriétés du ruban fonctionnent, comme décrit dans docs, mais ReadTimeout n'en fait pas partie. Donc ça ne marche pas, mais c'est par desing (selon la réponse à ceci numéro). Cependant, si vous utilisez le RestTemplate de Spring, vous pouvez le définir directement ici, comme ceci:

@LoadBalanced
@Bean
RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder
        .setReadTimeout(2000)
        .build();
}
3
OlgaMaciaszek 20 nov. 2018 à 17:19

Nous trouvons ceci:

serviceA.ribbon.ReadTimeout=8000

Fonctionne bien avec spring boot 2.1.0.RELEASE en utilisant spring cloud Finchley.SR2 et

<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>

Cependant, nous utilisons le ruban via feign, dans un client comme ceci:

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

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

Nous utilisons ensuite un test wiremock pour introduire un délai fixe au-dessus du délai de lecture pour vérifier qu'il fonctionne correctement.

0
David 20 nov. 2018 à 17:10

Je pense que vous devez configurer les délais d'attente Hystrix. Jetez un œil à cette partie de la documentation: http://cloud.spring.io/spring-cloud-static/Edgware.RELEASE/single/spring-cloud.html#_hystrix_timeouts_and_ribbon_clients Cela pourrait être quelque chose comme ça:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 1100
ribbon:
  ConnectTimeout: 1000
  ReadTimeout: 1000
1
veben 20 nov. 2018 à 17:10