Compartir a través de


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

Gateway para 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 para 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

Cuando se ejecute en Gateway para 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 encuentra en precios basados en el 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.

Configurar

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 admitir la configuración de la 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 Ubicación de la región de Azure donde se crea la aplicación de contenedor y el componente de Java.
    ENVIRONMENT El nombre del entorno de Azure Container Apps para la aplicación de demostración.
    RESOURCE_GROUP Nombre del grupo de recursos de Azure para la aplicación de demostración.
    JAVA_COMPONENT_NAME Nombre del componente de Java creado para la aplicación contenedora. En este caso, creará un componente Gateway para Spring Java.
    IMAGE Imagen de contenedor usada en la aplicación contenedora.
  2. Inicie sesión en Azure con la 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 para 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 completo (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. Reemplace <MYAPP_URL> por el FQDN de la aplicación contenedora 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. Visitar esta dirección URL con la ruta de acceso /myapp/health debe enrutar la solicitud al punto de conexión de actuator/health de la 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 la puerta de enlace para 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 Default value
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 para producir errores en los errores de definición de ruta, el valor predeterminado es true. 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 Marca que habilita la integración de 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. Útil con Eureka cuando pone automáticamente 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 del routeId, tiene como valor predeterminado 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 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 velocidad 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 Si el XForwardedHeadersFilter está habilitado. true
spring.cloud.gateway.x-forwarded.for-append Si se agrega X-Forwarded-For como una lista está habilitada. true
spring.cloud.gateway.x-forwarded.for-enabled Si X-Forwarded-For está habilitado. true
spring.cloud.gateway.x-forwarded.host-append Si se agrega X-Forwarded-Host como una lista está habilitada. true
spring.cloud.gateway.x-forwarded.host-enabled 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 se agrega X-Forwarded-Port como una lista está habilitada. true
spring.cloud.gateway.x-forwarded.port-enabled Si X-Forwarded-Port está habilitado. true
spring.cloud.gateway.x-forwarded.prefix-append Si se agrega X-Forwarded-Prefix como una lista está habilitada. true
spring.cloud.gateway.x-forwarded.prefix-enabled Si X-Forwarded-Prefix está habilitado. true
spring.cloud.gateway.x-forwarded.proto-append Si se agrega X-Forwarded-Proto como una lista está habilitada. true
spring.cloud.gateway.x-forwarded.proto-enabled 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 conectado en milis. 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 en milis para esperar a la adquisición.
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 Hora en milis después de la 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 El nombre del mapa del grupo de canales, el valor predeterminado es proxy. proxy
spring.cloud.gateway.httpclient.pool.type Tipo de grupo para usar HttpClient, el valor predeterminado es 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 vaciado de SSL close_notify. Valor predeterminado 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. Esto 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 Servidores ping proxy a servicios de bajada. 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 interceptación 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 Las etiquetas se asignan que se agregan a las métricas.
spring.cloud.gateway.observability.enabled Si se debe activar la compatibilidad con la observabilidad de micrometros. 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 en logging.* espacio de nombres. Por ejemplo, se deben prohibir la escritura de archivos de registro mediante logging.file.