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.
davy.ai
Sí, puedes definir una ruta para cada microservicio sin establecer el
server.servlet.context-path
para cada microservicio. En la configuraciónspring.cloud.gateway.routes
, puedes usar la clavefilters
para aplicar transformaciones a la solicitud entrante antes de reenviarla al microservicio. Uno de los filtros que puedes utilizar esRewritePathGatewayFilterFactory
. 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 microservicioauth
:Con esta configuración, si accedes a
http://localhost:9090/auth/lorem/ipsum`, la solicitud entrante se transformará en
http://localhost:8071/lorem/ipsum` medianteRewritePathGatewayFilterFactory
antes de reenviarla al microservicioauth
.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 variableremaining
. La cadena de reemplazo/$\{remaining}
agrega los segmentos de ruta capturados enremaining
al final de la ruta reescrita.