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.

Definición del camino para cada ruta en la puerta de enlace en la nube

Me gustaría añadir una ruta a cada ruta que defino en spring.cloud.gateway.routes sin definir la ruta de contexto, server.servlet.context-path, de cada microservicio.

Por ejemplo: Mi gateway se ejecuta en el puerto 9090, y mi microservicio se ejecuta en el puerto 8071. La configuración para el microservicio en el gateway es así:


spring:
cloud:
gateway:
routes:
- id: auth
uri: 'http://localhost:8071'

Si accedo a http://localhost:9090/lorem/ipsum, puedo hacer ping al microservicio y ver la respuesta. Pero, me gustaría hacer ping al microservicio desde el gateway como http://localhost:9090/auth/lorem/ipsum.

Si defino la clave Path en predicates, hace ping a http://localhost:8071/auth/lorem/ipsum, lo cual falla porque la URL en el microservicio no es /auth/lorem/ipsum sino /lorem/ipsum.


spring:
cloud:
gateway:
routes:
- id: auth
uri: 'http://localhost:8071'
predicates:
- Path=/auth/**

¿Existe alguna forma de definir una ruta para cada microservicio o tengo que configurar server.servlet.context-path para cada microservicio para lograr lo que deseo?

Versión de Spring Boot: 2.6.1 y versión de Spring Cloud: 2021.0.0.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, puedes definir una ruta para cada microservicio sin establecer el server.servlet.context-path para cada microservicio. En la configuración spring.cloud.gateway.routes, puedes usar la clave filters para aplicar transformaciones a la solicitud entrante antes de reenviarla al microservicio. Uno de los filtros que puedes utilizar es RewritePathGatewayFilterFactory. Con este filtro, puedes reescribir la ruta de la solicitud entrante para que coincida con la ruta que el microservicio espera.

    Aquí tienes un ejemplo de configuración que reescribe la ruta de la solicitud entrante para incluir el segmento de ruta /auth antes de reenviarla al microservicio auth:

    spring:
      cloud:
        gateway:
          routes:
            - id: auth
              uri: http://localhost:8071
              filters:
                - RewritePath=/auth/(?<remaining>.*), /$\{remaining}
    

    Con esta configuración, si accedes a http://localhost:9090/auth/lorem/ipsum`, la solicitud entrante se transformará enhttp://localhost:8071/lorem/ipsum` mediante RewritePathGatewayFilterFactory antes de reenviarla al microservicio auth.

    Ten en cuenta que RewritePathGatewayFilterFactory utiliza expresiones regulares para coincidir y reescribir los segmentos de ruta. En este ejemplo, la expresión regular /(?<remaining>.*) coincide con todo lo que está después del segmento de ruta /auth y lo captura en la variable remaining. La cadena de reemplazo /$\{remaining} agrega los segmentos de ruta capturados en remaining al final de la ruta reescrita.

Comments are closed.