Configuration du mécanisme de réessayer SpringCloud
Tout d'abord, la réessayer ici n'est pas une réessayer après une erreur signalée, mais une réessayer vers une autre instance après que le client d'équilibrage de charge constate que l'instance de demande distante n'est pas disponible.
@ Bean @ loadBalancedRestTemplate RestTemplate () {httpComponentSclientHttpRequestFactory httpRequestFactory = new httpComponentSclientHttPrequestFactory (); httpRequestFactory.SetReadTimeout (5000); httprequestfactory.setConnectTimeout (5000); Renvoie un nouveau Restemplate (httpRequestFactory);}feindre le mécanisme de réchauffement
feign réessaye la configuration via le rérient emballé par lui-même, et la valeur par défaut est 5 fois
package feign; import static java.util.concurrent.timeUnit.seconds; / ** * cloné pour chaque invocation à {@Link Client # Execute (request, feign.request.options)}. * Les implémentations peuvent garder l'état pour déterminer si les opérations de réessayer doivent se poursuivre ou non. * / Interface publique Reryer étend Clonable {/ ** * Si Retry est autorisé, retournez (peut-être après le sommeil). Sinon, propager l'exception. * / void continuorPropagate (RepriableException E); Retryer clone (); La classe statique publique par défaut implémente Retryer {private final int maxAtTempts; Finale privée longue période; Final privé long Maxperiod; int tentative; Sleptformmillis long; public default () {this (100, seconde.tomiillis (1), 5); } Public Default (longue période, long maxperiod, int maxAtTempts) {this.period = period; this.maxperiod = maxperiod; this.maxattempts = maxattempts; this.atempt = 1; }feindre annuler la réessayer
@Beanretryer feignRetryer () {return reryer.never_retry;}Figer le paramètre de délai d'expiration de la demande
@ BeanRequest.options requestOptions (configurableenvironment Env) {int rubBonReadTimeout = env.getProperty ("rubbon.readtimeout", int.class, 6000); int rubbonConnectionTimeout = env.getProperty ("rubbon.connectTimeout", int.class, 3000); Renvoie une nouvelle demande.options (rubbonConnectionTimeout, rubBbonRtimeout);}Réessayez de chaque composant de Spring Cloud
Récemment, de nombreuses chaussures pour enfants m'ont demandé comment configurer le composant Spring Cloud XXX pour réessayer. Cet article le résume.
Le mécanisme de réessayer dans Spring Cloud est assez chaotique. Différentes versions ont certaines différences et l'implémentation n'est pas très différente. Heureusement, Spring Cloud Camden s'est essentiellement stabilisé après, et certaines améliorations ont été apportées à Dalston. Les détails ne sont pas encore spécifiés.
En discutons en détail ci-dessous.
La version que j'utilise est Spring Cloud Dalston SR4, qui convient également à Edgware et plus tard. Pour la version précédente de Dalston, cet article n'en discutera pas, vous pouvez l'étudier vous-même.
Réessier du ruban + repos complice
Pour le repos, qui intègre le ruban, par exemple, un repos complate ajoute l'annotation @loadBalanced:
@ Bean @ loadBalancedPublic RestTemplate RestTemplate () {SimpleClientHttpRequestFactory SimpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory (); SimpleClientHttpRequestFactory.SetConnectTimeout (1000); SimpleClientHttpRequestFactory.SetReadTimeout (1000); Renvoie un nouveau RestTemplate (SimpleClientHttpRequestFactory);}Sur cette base, la réessayer peut être réalisée en utilisant la configuration suivante:
Spring: Cloud: LoadBalancer: Retry: Activé: TrueBbon: # Nombre maximum de tentatives pour la même instance, à l'exclusion du premier appel à maxautoretries: 1 # Nombre maximum de tentatives pour d'autres instances, excluant le premier serveur sélectionné MaxAutoretrieSextServer: 2 # Si toutes les opérations sont des récupérations OktoretryOnperations: FAUX
Feign's Repry
Feign lui-même a également la capacité de réessayer. Dans le cloud du début du printemps, Feign a utilisé feign.Retryer.Default#Default() et l'a essayé 5 fois. Mais Feign intègre le ruban et le ruban a également la capacité de réessayer, ce qui peut entraîner une confusion dans le comportement à ce moment.
Spring Cloud s'est rendu compte de ce problème, il a donc apporté des améliorations pour changer la nouvelle tentative de Feign en feign.Retryer#NEVER_RETRY . Si vous avez besoin d'utiliser RETRY'S RETRY'S, utilisez simplement la configuration de réessayer du ruban. Par conséquent, pour les versions Camden et ultérieures, la réessayer de Feign peut être configurée à l'aide des propriétés suivantes:
Ruban: MaxAutoretries: 1 MaxAutoreTrriesNextServer: 2 OktoretryOnalLoperations: False
Des problèmes connexes peuvent être trouvés sur: https://github.com/spring-cloud/spring-cloud-netflix/issues/467
Réessier de Zuul
Configuration:
Zuul: # Activer la réimpressionnable de Zuul: TrueBbon: MaxAutoretries: 1 MaxAutoretriesNextServer: 2 OktoretryOnLoLOperations: False
Ci-dessus, nous avons utilisé zuul.retryable=true pour activer la réessayer globalement pour zuul. En fait, nous pouvons également activer / désactiver l'itinéraire spécifié:
zuul.routes. <routenne> .retryable = true
La priorité de configuration locale est plus élevée.
Réessayer en fonction du code de réponse HTTP
ClientName: ruban: RetryableStAruscodes: 404 502
Note:
Le délai d'expiration de Hystrix doit être supérieur au temps de temps mort, sinon, une fois que le délai d'expiration de Hystrix, il n'y a aucun moyen de continuer à réessayer.
D'une manière générale, il n'est pas recommandé de définir ribbon.OkToRetryOnAllOperations à True. Étant donné qu'une fois cette configuration activée, toute opération est réessayée, y compris les demandes de poste, et comme le corps de la demande est mis en cache, les ressources du serveur peuvent être affectées pour le moment.
Résumer
Ce qui précède est l'intégralité du contenu de cet article. J'espère que le contenu de cet article a une certaine valeur de référence pour l'étude ou le travail de chacun. Si vous avez des questions, vous pouvez laisser un message pour communiquer. Merci pour votre soutien à wulin.com.