es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Los filtros globales de Spring Cloud Gateway no se ejecutan cuando RedisRateLimiter bloquea una solicitud.

He implementado un prefiltro y un postfiltro global para registrar los eventos de solicitud. También he utilizado un filtro de RequestRateLimiterFactory con RedisRateLimiter para evitar picos de solicitudes que puedan sobrecargar el servicio.

Quiero usar mi prefiltro y postfiltro para registrar dos eventos:

  1. Se ha detectado una solicitud con apiKey X.
  2. La solicitud ha sido aceptada o rechazada por el límite de velocidad.

Cuando el límite de velocidad acepta una solicitud y la envía, no hay problema, el prefiltro y postfiltro se ejecutan y puedo registrar los datos que necesito.
El problema es que cuando el límite de velocidad bloquea una solicitud, ni el prefiltro ni el postfiltro se ejecutan, por lo que no puedo registrar ni recuperar este evento para las métricas.

Aunque Spring Cloud Gateway funciona a través de una cadena de filtros, creo que el problema descrito anteriormente puede ser causado por el método isAllowed de la clase RequestRateLimiterFactory. Este método establece como completada la solicitud cuando es rechazada en lugar de pasar el intercambio a los filtros siguientes. Pero he estado investigando y no he encontrado ninguna solución útil para resolver este problema.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnologías de la información especializado en Java, Spring, Spring-Cloud, Spring-Cloud-Gateway y control de velocidad, para registrar los dos eventos mencionados, has implementado un prefiltro global y un postfiltro global. Además, has utilizado un filtro de RequestRateLimiterFactory con RedisRateLimiter para manejar los picos de solicitudes que podrían abrumar el servicio.

    Sin embargo, cuando el limitador de velocidad bloquea una solicitud, ni el prefiltro ni el postfiltro se ejecutan, por lo que no se puede recuperar este evento para las métricas. Sospechas que el método “isAllowed” de la clase RequestRateLimiterFactory puede estar causando el problema, ya que establece la solicitud como completada cuando es rechazada en lugar de pasar el intercambio a los filtros siguientes. Sin embargo, la investigación no ha proporcionado una solución para este problema.

    El fragmento de código compartido muestra que después de verificar si se permite o no la solicitud, si no se permite, se establece el estado de respuesta y se completa el intercambio. Para habilitar el registro de eventos incluso cuando se rechaza una solicitud, es necesario modificar el código adecuadamente. Específicamente, no debes completar el intercambio cuando se rechaza la solicitud, sino pasar el intercambio al siguiente filtro con las modificaciones necesarias. De esta manera, los prefiltros y postfiltros se ejecutarán y capturarán las métricas que necesitas.

Comments are closed.