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
- Una cuenta de Azure con una suscripción activa. Si aún no tiene ninguno, puede crear uno gratis.
- Azure CLI.
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.
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. Inicie sesión en Azure con la CLI de Azure.
az login
Cree un grupo de recursos.
az group create --name $RESOURCE_GROUP --location $LOCATION
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.
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 \
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
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}"
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 deactuator/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 mediantelogging.file
.