Compartir a través de


Conexión a una puerta de enlace administrada para Spring en Azure Container Apps (versión preliminar)

Gateway for Spring ofrece una manera eficaz y eficaz de enrutar, administrar y controlar las solicitudes de API como parte de una arquitectura de microservicios. Sirve como puerta de enlace de API que enruta las solicitudes externas a diferentes servicios, agregando varias funcionalidades, como el filtrado, el equilibrio de carga, etc. En este artículo, aprenderá a crear una puerta de enlace que dirija las solicitudes a las aplicaciones de contenedor.

En este tutorial, aprenderá a:

  • Creación de un componente Gateway for Spring Java
  • Actualización de Gateway para Spring con rutas personalizadas para redirigir las solicitudes a las aplicaciones de contenedor

Importante

En este tutorial se usan servicios que pueden afectar a la factura de Azure. Si decide seguir paso a paso, asegúrese de eliminar los recursos destacados en este artículo para evitar una facturación inesperada.

Requisitos previos

Consideraciones

Al ejecutar en Gateway for Spring en Azure Container Apps, tenga en cuenta los detalles siguientes:

Elemento Explicación
Ámbito Gateway para Spring se ejecuta en el mismo entorno que la aplicación contenedora conectada.
Recursos La asignación de recursos de contenedor para Gateway para Spring es fija, el número de núcleos de CPU es 0,5 y el tamaño de memoria es 1Gi.
Precios La facturación de Gateway para Spring se basa en un modelo de precios por consumo. Los recursos consumidos por los componentes de Java administrados se facturan a las tarifas activas o inactivas. Puede eliminar componentes que ya no estén en uso para detener la facturación.

Configuración

Antes de empezar a trabajar con Gateway para Spring, primero debe crear los recursos necesarios.

Ejecute los siguientes comandos para crear el grupo de recursos y el entorno de Container Apps.

  1. Cree variables para soportar la configuración de su aplicación. Estos valores se proporcionan para usted con fines de esta lección. En esta lección se usa el punto de conexión del actuador de administrador para la aplicación de ejemplo spring.

    export LOCATION=eastus
    export RESOURCE_GROUP=my-spring-cloud-resource-group
    export ENVIRONMENT=my-spring-cloud-environment
    export JAVA_COMPONENT_NAME=mygateway
    export APP_NAME=myapp
    export IMAGE="mcr.microsoft.com/javacomponents/samples/sample-admin-for-spring-client:latest"
    
    Variable Descripción
    LOCATION La ubicación de la región de Azure donde se crea tu aplicación de contenedor y componente de Java.
    ENVIRONMENT El nombre del entorno Azure Container Apps para la aplicación de demostración.
    RESOURCE_GROUP El nombre del grupo de recursos Azure para la aplicación de demostración.
    JAVA_COMPONENT_NAME Nombre del componente Java creado para la aplicación contenedora. En este caso, creará un componente Gateway for Spring Java.
    IMAGE Imagen de contenedor utilizada en tu aplicación de contenedor.
  2. Inicie sesión en Azure con el CLI de Azure.

    az login
    
  3. Cree un grupo de recursos.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  4. Cree el entorno de aplicaciones de contenedor.

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

    Este entorno se usa para hospedar tanto el componente Gateway para Spring como la aplicación contenedora.

Uso del componente Gateway for Spring Java

Ahora que tiene un entorno de Container Apps, puede crear la aplicación de contenedor mediante una puerta de enlace para los componentes de Spring Java para enrutar la solicitud a ellos.

  1. Cree el componente Gateway para Spring Java.

    az containerapp env java-component gateway-for-spring create \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \
    
  2. Cree la aplicación contenedora que tenga el nombre de dominio totalmente calificado (FQDN).

    az containerapp create \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT \
        --image $IMAGE \
        --ingress external \
        --target-port 8080 \
        --query properties.configuration.ingress.fqdn
    

    Este comando devuelve la dirección URL de la aplicación contenedora que consume datos de configuración. Copie la dirección URL en un editor de texto para poder usarla en el paso siguiente.

Actualización de las rutas de puerta de enlace para enrutar solicitudes

  1. Cree un archivo YAML con el siguiente contenido. Reemplaza <MYAPP_URL> por el FQDN de la aplicación de contenedor del paso anterior.

    springCloudGatewayRoutes:
    - id: "route1"
      uri: "<MYAPP_URL>"
      predicates:
        - "Path=/myapp/{path}"
      filters:
        - "SetPath=/actuator/{path}"
    
  2. Ejecute el comando siguiente para actualizar el componente Gateway para Spring con la configuración de ruta.

    az containerapp env java-component gateway-for-spring update \
        --environment $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --name $JAVA_COMPONENT_NAME \ 
        --route-yaml <PTAH_TO_ROUTE_YAML_FILE> \
        --query properties.ingress.fqdn
    

    Este comando actualiza la ruta de la puerta de enlace y devuelve la dirección URL de la puerta de enlace que consume datos de configuración.

    El comando devuelve la dirección URL de la puerta de enlace. Al visitar esta URL con la ruta /myapp/health, debe enrutar la solicitud al endpoint actuator/health de su aplicación, devolviendo {"status":"UP","groups":["liveness","readiness"]}.

Limpieza de recursos

Los recursos creados en este tutorial tienen un efecto en la factura de Azure. Si no va a usar estos servicios a largo plazo, ejecute el siguiente comando para quitar todo lo creado en este tutorial.

az group delete --resource-group $RESOURCE_GROUP

Formato de archivo de ruta

El componente Gateway para Spring admite la definición de rutas a través de propiedades con identificador, URI, predicados y filtros. Para más información, consulte la documentación de Spring Cloud Gateway. A continuación se muestra un archivo YAML de ejemplo que muestra cómo configurar estas propiedades.

  springCloudGatewayRoutes:
  - id: "route1"
    uri: "https://otherjavacomponent.myenvironment.test.net"
    predicates:
      - "Path=/v1/{path}"
      - "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
    filters:
      - "SetPath=/{path}"
  - id: "route2"
    uri: "https://otherjavacomponent.myenvironment.test.net"
    predicates:
      - "Path=/v2/{path}"
      - "After=2024-01-01T00:00:00.000-00:00[America/Denver]"
    filters:
      - "SetPath=/{path}"

Lista de configuración permitida para su Gateway en Spring (#configurable-properties)

En la tabla siguiente se describen las propiedades del componente de puerta de enlace que puede configurar para la aplicación. Para obtener más información, consulte propiedades de aplicación comunes de Spring Cloud Gateway.

Nombre de la propiedad Descripción Valor predeterminado
spring.cloud.gateway.default-filters Lista de definiciones de filtro que se aplican a cada ruta.
spring.cloud.gateway.enabled Habilita la funcionalidad de puerta de enlace. true
spring.cloud.gateway.fail-on-route-definition-error Opción de fallar en caso de errores en la definición de ruta, el valor predeterminado es verdadero. De lo contrario, se registra una advertencia. true
spring.cloud.gateway.handler-mapping.order Orden de RoutePredicateHandlerMapping. 1
spring.cloud.gateway.loadbalancer.use404 false
spring.cloud.gateway.discovery.locator.enabled Indicador que habilita la integración de la puerta de enlace DiscoveryClient. false
spring.cloud.gateway.discovery.locator.filters
spring.cloud.gateway.discovery.locator.include-expression Expresión SpEL que evalúa si se debe incluir un servicio en la integración de la puerta de enlace o no. El valor predeterminado es true. true
spring.cloud.gateway.discovery.locator.lower-case-service-id Opción para minúsculas serviceId en predicados y filtros. El valor predeterminado es false. Es útil cuando Eureka automáticamente pone en mayúsculas serviceId. Por lo tanto, MYSERVICE coincidiría con /myservice/** false
spring.cloud.gateway.discovery.locator.predicates
spring.cloud.gateway.discovery.locator.route-id-prefix El prefijo para routeId es por defecto discoveryClient.getClass().getSimpleName() + "_". El identificador de servicio se anexa para crear el routeId.
spring.cloud.gateway.discovery.locator.url-expression Expresión SpEL que crea el URI para cada ruta. El valor predeterminado es 'lb://'+serviceId. 'lb://'+serviceId
spring.cloud.gateway.filter.add-request-header.enabled Habilita el filtro add-request-header. true
spring.cloud.gateway.filter.add-request-parameter.enabled Habilita el filtro add-request-parameter. true
spring.cloud.gateway.filter.add-response-header.enabled Habilita el filtro add-response-header. true
spring.cloud.gateway.filter.circuit-breaker.enabled Habilita el filtro circuit-breaker. true
spring.cloud.gateway.filter.dedupe-response-header.enabled Habilita el filtro dedupe-response-header. true
spring.cloud.gateway.filter.fallback-headers.enabled Habilita el filtro fallback-headers. true
spring.cloud.gateway.filter.hystrix.enabled Habilita el filtro hystrix. true
spring.cloud.gateway.filter.json-to-grpc.enabled Habilita el filtro JSON para gRPC. true
spring.cloud.gateway.filter.local-response-cache.enabled Habilita el filtro local-response-cache. false
spring.cloud.gateway.filter.local-response-cache.request.no-cache-strategy
spring.cloud.gateway.filter.local-response-cache.size Tamaño máximo de la memoria caché para expulsar las entradas de esta ruta en KB, MB y GB.
spring.cloud.gateway.filter.local-response-cache.time-to-live Tiempo para expirar una entrada de caché, expresada en s durante segundos, m durante minutos y h durante horas. 5m
spring.cloud.gateway.filter.map-request-header.enabled Habilita el filtro map-request-header. true
spring.cloud.gateway.filter.modify-request-body.enabled Habilita el filtro modify-request-body. true
spring.cloud.gateway.filter.modify-response-body.enabled Habilita el filtro modify-response-body. true
spring.cloud.gateway.filter.prefix-path.enabled Habilita el filtro prefix-path. true
spring.cloud.gateway.filter.preserve-host-header.enabled Habilita el filtro preserve-host-header. true
spring.cloud.gateway.filter.redirect-to.enabled Habilita el filtro redirect-to. true
spring.cloud.gateway.filter.remove-hop-by-hop.headers
spring.cloud.gateway.filter.remove-hop-by-hop.order 0
spring.cloud.gateway.filter.remove-request-header.enabled Habilita el filtro remove-request-header. true
spring.cloud.gateway.filter.remove-request-parameter.enabled Habilita el filtro remove-request-parameter. true
spring.cloud.gateway.filter.remove-response-header.enabled Habilita el filtro remove-response-header. true
spring.cloud.gateway.filter.request-header-size.enabled Habilita el filtro request-header-size. true
spring.cloud.gateway.filter.request-header-to-request-uri.enabled Habilita el filtro request-header-to-request-uri. true
spring.cloud.gateway.filter.request-rate-limiter.default-key-resolver
spring.cloud.gateway.filter.request-rate-limiter.default-rate-limiter
spring.cloud.gateway.filter.request-rate-limiter.enabled Habilita el filtro request-rate-limiter. true
spring.cloud.gateway.filter.request-size.enabled Habilita el filtro request-size. true
spring.cloud.gateway.filter.retry.enabled Habilita el filtro retry. true
spring.cloud.gateway.filter.rewrite-location-response-header.enabled Habilita el filtro rewrite-location-response-header. true
spring.cloud.gateway.filter.rewrite-location.enabled Habilita el filtro rewrite-location. true
spring.cloud.gateway.filter.rewrite-path.enabled Habilita el filtro rewrite-path. true
spring.cloud.gateway.filter.rewrite-request-parameter.enabled Habilita el filtro rewrite-request-parameter. true
spring.cloud.gateway.filter.rewrite-response-header.enabled Habilita el filtro rewrite-response-header. true
spring.cloud.gateway.filter.save-session.enabled Habilita el filtro save-session. true
spring.cloud.gateway.filter.secure-headers.content-security-policy default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
spring.cloud.gateway.filter.secure-headers.content-type-options nosniff
spring.cloud.gateway.filter.secure-headers.disable
spring.cloud.gateway.filter.secure-headers.download-options noopen
spring.cloud.gateway.filter.secure-headers.enabled Habilita el filtro secure-headers. true
spring.cloud.gateway.filter.secure-headers.frame-options DENY
spring.cloud.gateway.filter.secure-headers.permitted-cross-domain-policies none
spring.cloud.gateway.filter.secure-headers.referrer-policy no-referrer
spring.cloud.gateway.filter.secure-headers.strict-transport-security max-age=631138519
spring.cloud.gateway.filter.secure-headers.xss-protection-header 1 ; mode=block
spring.cloud.gateway.filter.set-path.enabled Habilita el filtro set-path. true
spring.cloud.gateway.filter.set-request-header.enabled Habilita el filtro set-request-header. true
spring.cloud.gateway.filter.set-request-host-header.enabled Habilita el filtro set-request-host-header. true
spring.cloud.gateway.filter.set-response-header.enabled Habilita el filtro set-response-header. true
spring.cloud.gateway.filter.set-status.enabled Habilita el filtro set-status. true
spring.cloud.gateway.filter.strip-prefix.enabled Habilita el filtro strip-prefix. true
spring.cloud.gateway.forwarded.enabled Habilita el ForwardedHeadersFilter. true
spring.cloud.gateway.global-filter.adapt-cached-body.enabled Habilita el filtro global adapt-cached-body. true
spring.cloud.gateway.global-filter.forward-path.enabled Habilita el filtro global forward-path. true
spring.cloud.gateway.global-filter.forward-routing.enabled Habilita el filtro global forward-routing. true
spring.cloud.gateway.global-filter.load-balancer-client.enabled Habilita el filtro global load-balancer-client. true
spring.cloud.gateway.global-filter.local-response-cache.enabled Habilita el filtro local-response-cache para todas las rutas, lo que le permite agregar una configuración específica en el nivel de ruta mediante un filtro de LocalResponseCache. true
spring.cloud.gateway.global-filter.netty-routing.enabled Habilita el filtro netty-routing global. true
spring.cloud.gateway.global-filter.netty-write-response.enabled Habilita el filtro global netty-write-response. true
spring.cloud.gateway.global-filter.reactive-load-balancer-client.enabled Habilita el filtro global reactive-load-balancer-client. true
spring.cloud.gateway.global-filter.remove-cached-body.enabled Habilita el filtro global remove-cached-body. true
spring.cloud.gateway.global-filter.route-to-request-url.enabled Habilita el filtro global route-to-request-url. true
spring.cloud.gateway.global-filter.websocket-routing.enabled Habilita el filtro global websocket-routing. true
spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping Si se debe agregar la configuración global de CORS al controlador de direcciones URL. false
spring.cloud.gateway.globalcors.cors-configurations
spring.cloud.gateway.redis-rate-limiter.burst-capacity-header Nombre del encabezado que devuelve la configuración de capacidad de ráfaga. X-RateLimit-Burst-Capacity
spring.cloud.gateway.redis-rate-limiter.config
spring.cloud.gateway.redis-rate-limiter.include-headers Indica si se van a incluir encabezados que contengan información del limitador de velocidad. El valor predeterminado es true. true
spring.cloud.gateway.redis-rate-limiter.remaining-header Nombre del encabezado que devuelve el número de las solicitudes restantes durante el segundo actual. X-RateLimit-Remaining
spring.cloud.gateway.redis-rate-limiter.replenish-rate-header Nombre del encabezado que devuelve la configuración de tasa de reposición. X-RateLimit-Replenish-Rate
spring.cloud.gateway.redis-rate-limiter.requested-tokens-header Nombre del encabezado que devuelve la configuración de tokens solicitada. X-RateLimit-Requested-Tokens
spring.cloud.gateway.restrictive-property-accessor.enabled Restringe el acceso a métodos y propiedades en SpEL. true
spring.cloud.gateway.predicate.after.enabled Habilita el predicado after. true
spring.cloud.gateway.predicate.before.enabled Habilita el predicado before. true
spring.cloud.gateway.predicate.between.enabled Habilita el predicado between. true
spring.cloud.gateway.predicate.cloud-foundry-route-service.enabled Habilita el predicado cloud-foundry-route-service. true
spring.cloud.gateway.predicate.cookie.enabled Habilita el predicado cookie. true
spring.cloud.gateway.predicate.header.enabled Habilita el predicado header. true
spring.cloud.gateway.predicate.host.enabled Habilita el predicado host. true
spring.cloud.gateway.predicate.host.include-port Incluya el puerto para que coincida con el nombre de host. true
spring.cloud.gateway.predicate.method.enabled Habilita el predicado method. true
spring.cloud.gateway.predicate.path.enabled Habilita el predicado path. true
spring.cloud.gateway.predicate.query.enabled Habilita el predicado query. true
spring.cloud.gateway.predicate.read-body.enabled Habilita el predicado read-body. true
spring.cloud.gateway.predicate.remote-addr.enabled Habilita el predicado remote-addr. true
spring.cloud.gateway.predicate.weight.enabled Habilita el predicado weight. true
spring.cloud.gateway.predicate.xforwarded-remote-addr.enabled Habilita el predicado xforwarded-remote-addr. true
spring.cloud.gateway.set-status.original-status-header-name Nombre del encabezado que contiene el código HTTP de la solicitud proxy.
spring.cloud.gateway.streaming-media-types
spring.cloud.gateway.x-forwarded.enabled Indica si XForwardedHeadersFilter está habilitado. true
spring.cloud.gateway.x-forwarded.for-append Si está habilitada la opción de agregar X-Forwarded-For como una lista. true
spring.cloud.gateway.x-forwarded.for-enabled Indica si X-Forwarded-For está habilitado. true
spring.cloud.gateway.x-forwarded.host-append Si está habilitada la opción de agregar X-Forwarded-Host como una lista. true
spring.cloud.gateway.x-forwarded.host-enabled Indica si X-Forwarded-Host está habilitado. true
spring.cloud.gateway.x-forwarded.order Orden del XForwardedHeadersFilter. 0
spring.cloud.gateway.x-forwarded.port-append Si está habilitada la adición de X-Forwarded-Port como una lista. true
spring.cloud.gateway.x-forwarded.port-enabled Indica si X-Forwarded-Port está habilitado. true
spring.cloud.gateway.x-forwarded.prefix-append Si agregar X-Forwarded-Prefix como una lista está habilitado. true
spring.cloud.gateway.x-forwarded.prefix-enabled Indica si X-Forwarded-Prefix está habilitado. true
spring.cloud.gateway.x-forwarded.proto-append Si está habilitada la opción de agregar X-Forwarded-Proto como una lista. true
spring.cloud.gateway.x-forwarded.proto-enabled Indica si X-Forwarded-Proto está habilitado. true
spring.cloud.gateway.httpclient.compression Habilita la compresión para Netty HttpClient. false
spring.cloud.gateway.httpclient.connect-timeout Tiempo de espera de conexión en milisegundos. El valor predeterminado es 30s.
spring.cloud.gateway.httpclient.max-header-size Tamaño máximo del encabezado de respuesta.
spring.cloud.gateway.httpclient.max-initial-line-length Longitud máxima de línea inicial.
spring.cloud.gateway.httpclient.pool.acquire-timeout Solo para el tipo FIXED, el tiempo máximo para esperar la adquisición en milisegundos.
spring.cloud.gateway.httpclient.pool.eviction-interval Realice comprobaciones periódicas de expulsión en segundo plano en un intervalo especificado. Deshabilitado de forma predeterminada ({@link Duration#ZERO}). 0
spring.cloud.gateway.httpclient.pool.max-connections Solo para el tipo FIXED, el número máximo de conexiones antes de iniciar la adquisición pendiente en las existentes.
spring.cloud.gateway.httpclient.pool.max-idle-time Tiempo en milisegundos después del cual se cierra el canal. Si NULL, no hay ningún tiempo de inactividad máximo.
spring.cloud.gateway.httpclient.pool.max-life-time Duración después de la cual se cierra el canal. Si NULL, no hay tiempo máximo de vida.
spring.cloud.gateway.httpclient.pool.metrics Permite recopilar y registrar métricas de grupos de canales en Micrometer. Deshabilitado de forma predeterminada. false
spring.cloud.gateway.httpclient.pool.name Nombre del mapa del grupo de canales. El valor predeterminado es proxy. proxy
spring.cloud.gateway.httpclient.pool.type Tipo de grupo que HttpClient utilizará, por defecto ELASTIC.
spring.cloud.gateway.httpclient.response-timeout Tiempo de espera de respuesta.
spring.cloud.gateway.httpclient.ssl.close-notify-flush-timeout Tiempo de espera de vaciamiento de SSL close_notify. El valor predeterminado es 3000 ms. 3000ms
spring.cloud.gateway.httpclient.ssl.close-notify-read-timeout Tiempo de espera de lectura de SSL close_notify. El valor predeterminado es 0 ms. 0
spring.cloud.gateway.httpclient.ssl.handshake-timeout Tiempo de espera del protocolo de enlace SSL. El valor predeterminado es 10000 ms. 10000ms
spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager Instala el netty InsecureTrustManagerFactory. Este valor no es seguro y no es adecuado para producción. false
spring.cloud.gateway.httpclient.websocket.max-frame-payload-length Longitud máxima de carga del marco.
spring.cloud.gateway.httpclient.websocket.proxy-ping Encauzar tramas de ping a través de proxy hacia servicios posteriores. El valor predeterminado es true. true
spring.cloud.gateway.httpclient.wiretap Habilita la depuración de interceptación para Netty HttpClient. false
spring.cloud.gateway.httpserver.wiretap Habilita la depuración de escucha telefónica para Netty HttpServer. false
spring.cloud.gateway.metrics.enabled Habilita la recopilación de datos de métricas. false
spring.cloud.gateway.metrics.prefix Prefijo de todas las métricas emitidas por la puerta de enlace. spring.cloud.gateway
spring.cloud.gateway.metrics.tags Mapa de etiquetas que se añaden a las métricas.
spring.cloud.gateway.observability.enabled Indica si se debe activar el soporte para la observabilidad de Micrometer. true

Opciones de configuración comunes

En la lista siguiente se describen las configuraciones comunes:

  • Registro de configuraciones relacionadas:
    • logging.level.*
    • logging.group.*
    • Se debe prohibir cualquier otra configuración dentro del espacio de nombres logging.*. Por ejemplo, se deben prohibir la escritura de archivos de registro mediante logging.file.