Configuración del mecanismo de reintento de SpringCloud
En primer lugar, el reintento aquí no es un reintento después de que se informa un error, pero un reintento a otra instancia después de que el cliente de equilibrio de carga encuentra que la instancia de solicitud remota no está disponible.
@Bean@loadBalancedRestTemplate RestTeMplate () {httpComponentsClientHttpRequestFactory httprequestFactory = new httpComponentsClientHttPrequestFactory (); httprequestFactory.SetReadTimeOut (5000); httprequestFactory.setConnectTimeOut (5000); devolver nuevo RestTemplate (httprequestFactory);}FIN Mecanismo de reintento
Feign está reintando la configuración a través del readrantador empaquetado por sí mismo, y el valor predeterminado es 5 veces
paquete Feign; import static java.util.concurrent.timeunit.seconds;/*** clonado para cada invocación a {@link cliente#ejecute (request, feign.request.options)}. * Las implementaciones pueden mantener el estado para determinar si las operaciones de reintento deben continuar o no. * /Riterador de interfaz pública se extiende clonable { /*** Si se permite el reintento, return (posiblemente después de dormir). De lo contrario, propague la excepción. */ void continuoPropagate (retryableableException e); Ritrander Clone (); Public static class predeterminada implementa el readryer {private final int maxattempts; período largo privado largo; Private Final Long Maxperiod; int intento; Long SleptFormillis; Public Default () {this (100, Seconds.Tomillis (1), 5); } Previa Predeterminado (período largo, Long Maxperiod, int maxattempts) {this.period = período; this.maxperiod = maxperiod; this.maxattempts = maxattempts; this.attempt = 1; }Feign Cancel Reinty
@Beanryer FeignRetryer () {return readryer.Never_cretry;}Configuración de tiempo de espera de solicitud de solicitud
@Beanrequest.options requestOptions (configurableNenVironment env) {int ribbonreadtimeout = env.getProperty ("ribbon.readtimeout", int.class, 6000); int ribbonConnectionTimeOut = env.getProperty ("ribbon.connecttimeout", int.class, 3000); devolver nuevo request.options (RibbonConnectionTimeOut, RibbonReadtimeOut);}Vuelva a intentar cada componente en Spring Cloud
Recientemente, muchos zapatos para niños me han preguntado cómo configurar el componente Spring Cloud XXX para que vuelva a intentarlo. Este artículo lo resume.
El mecanismo de reintento en la nube de primavera es bastante caótico. Las diferentes versiones tienen ciertas diferencias y la implementación no es muy diferente. Afortunadamente, Spring Cloud Camden se ha estabilizado básicamente después, y se han realizado algunas mejoras en Dalston. Los detalles aún no se especifican.
Discutamos en detalle a continuación.
La versión que uso es Spring Cloud Dalston SR4, que también es adecuada para Edgware y más tarde. Para la versión anterior de Dalston, este artículo no lo discutirá, puede estudiarlo usted mismo.
Vuelve a intentar la cinta+RestTemplate
Para la placa de descanso que integra la cinta, por ejemplo, una RESTTemplate agrega la anotación @LoadBalanced:
@Bean@loadBalancedPublic RestTemplate RestTeMplate () {simplEclienthttpRequestFactory simplEclienthttprequestFactory = new SimpleClientHttPrequestFactory (); SimpleClientHttpRequestFactory.SetConnectTimeOut (1000); SimpleClientHttpRequestFactory.SetReadTimeOut (1000); devolver nuevo RESTTemplate (simpliClientHttpRequestFactory);}Sobre esta base, el reintento se puede lograr utilizando la siguiente configuración:
Spring: Cloud: LoadBalancer: RESint: Habilitado: Trueribbon: # Número máximo de reintentos para la misma instancia, excluyendo la primera llamada a MaxAutoretries: 1 # Número máximo de reintentos para otras instancias, excluyendo el primer servidor seleccionado maxautoretriesNextServer: 2 # si todas las operaciones son retrates OktorRetryOperations: FALSE
Feign's Reinty
Feign en sí también tiene la capacidad de volver a intentarlo. A principios de la nube de primavera, Feign usó feign.Retryer.Default#Default() , y lo probó 5 veces. Pero Feign integra la cinta, y la cinta también tiene la capacidad de volver a intentarlo, lo que puede conducir a la confusión en el comportamiento en este momento.
Spring Cloud se dio cuenta de este problema, por lo que realizó mejoras para cambiar el reintento de Feign a feign.Retryer#NEVER_RETRY . Si necesita usar el reintento de Feign, simplemente use la configuración de reintento de Ribbon. Por lo tanto, para las versiones de Camden y posteriores, el reintento de Feign se puede configurar utilizando las siguientes propiedades:
cinta: maxautoretries: 1 maxautoretriesNextServer: 2 oktoretryOnalLoperations: falso
Los problemas relacionados se pueden encontrar en: https://github.com/spring-cloud/spring-cloud-netflix/issues/467
El reintento de Zuul
Configuración:
ZUUL: # Enable en el retráfico de ZUUL RELIERABLE: Trueribbon: Maxautoretries: 1 MaxautoretriesNextServer: 2 OkToretryOnalLoperations: FALSO
Arriba usamos zuul.retryable=true para habilitar el reintento globalmente para Zuul. De hecho, también podemos habilitar/desactivar la ruta especificada:
zuul.routes. <utenename> .cretryable = true
La prioridad de configuración local es mayor.
Vuelva a intentarlo en base al código de respuesta HTTP
nombre de cliente: cinta: retryableStatuscodes: 404,502
Nota:
El tiempo de espera de Hystrix debe ser mayor que el tiempo de tiempo de espera, de lo contrario, una vez que Hystrix TimeOut, no hay forma de continuar intentando volver a intentarlo.
En términos generales, no se recomienda establecer ribbon.OkToRetryOnAllOperations A VERDADERO. Debido a que una vez que esta configuración está habilitada, se vuelve a intentar cualquier operación, incluidas las solicitudes posteriores, y dado que el cuerpo de la solicitud se almacena en caché, los recursos del servidor pueden verse afectados en este momento.
Resumir
Lo anterior es todo el contenido de este artículo. Espero que el contenido de este artículo tenga cierto valor de referencia para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.