Compartir vía


Información general sobre Java en Azure Container Apps

Azure Container Apps puede ejecutar cualquier aplicación Java contenedorizada en la nube, a la vez que proporciona opciones flexibles para implementar las aplicaciones.


Al usar Container Apps para las aplicaciones Java contenedorizadas, obtendrá lo siguiente:

  • Escalado rentable: cuando usa el plan de consumo, las aplicaciones Java se pueden escalar a cero. Reducir horizontalmente cuando hay poca demanda para la aplicación reduce automáticamente los costos de los proyectos.

  • Opciones de implementación: Azure Container Apps se integra con Buildpacks, lo que permite implementar directamente desde una compilación de Maven, a través de archivos de artefactos, o con su propio Dockerfile.

    • Implementación de JAR (versión preliminar): puede implementar la aplicación de contenedor directamente desde un archivo JAR.

    • Implementación de WAR (versión preliminar): puede implementar la aplicación de contenedor directamente desde un archivo WAR.

    • Soporte técnico de IDE: puede implementar la aplicación de contenedor directamente desde IntelliJ.

  • Ajuste automático de memoria (versión preliminar): Container Apps optimiza la forma en que la Máquina virtual Java (JVM) administra la memoria, lo que hace que la mayor parte posible esté disponible para las aplicaciones Java.

  • Variables de entorno de compilación (versión preliminar): puede configurar pares clave-valor personalizados para controlar la compilación de imágenes de Java a partir del código fuente.

En este artículo se detalla la información que necesita saber a medida que compila aplicaciones Java en Azure Container Apps.

Tipos de implementación

La ejecución de aplicaciones contenedorizadas normalmente significa que necesita crear un Dockerfile para la aplicación, pero ejecutar aplicaciones Java en Container Apps ofrece algunas opciones.

Tipo Descripción Usa Buildpacks Usa un archivo Dockerfile
Compilación de código fuente Puede implementar directamente en Container Apps desde el código fuente. No
Compilación de artefactos Puede crear una compilación de Maven para implementarla en Container Apps No
Dockerfile Puede crear el Dockerfile manualmente y tomar el control total sobre la implementación. No

Nota:

Las implementaciones de Buildpacks admiten las versiones 8, 11, 17 y 21 de JDK.

Tipos de aplicación

Los distintos tipos de aplicaciones se implementan como una aplicación de contenedor individual o como un trabajo de Container Apps. Use la tabla siguiente para ayudarle a decidir qué tipo de aplicación es mejor para su escenario.

Los ejemplos enumerados en esta tabla no están diseñados para ser exhaustivos, sino para ayudarle a comprender mejor la intención de diferentes tipos de aplicación.

Tipo Ejemplos Implementar como...
Aplicaciones web y puntos de conexión de API Spring Boot, Quarkus, Apache Tomcat y Jetty Una aplicación de contenedor individual
Aplicaciones de consola, tareas programadas, ejecutores de tareas, trabajos por lotes SparkJobs, tareas ETL, trabajo de Spring Batch, trabajo de canalización de Jenkins Un trabajo de Container Apps

Depuración

A medida que depura la aplicación Java en Container Apps, asegúrese de inspeccionar el agente en proceso de Java para los mensajes de depuración de flujo de registro y consola.

Solución de problemas

Tenga en cuenta los siguientes elementos a medida que desarrolle sus aplicaciones Java:

  • Recursos predeterminados: de manera predeterminada, una aplicación tiene media CPU y 1 GB disponibles.

  • Procesos sin estado: a medida que la aplicación de contenedor se escala y se reduce horizontalmente, se crean y cierran nuevos procesos. Asegúrese de planear con antelación para escribir datos en un almacenamiento compartido, como bases de datos y recursos compartidos del sistema de archivos. No espere que los archivos escritos directamente en el sistema de archivos de contenedor estén disponibles para ningún otro contenedor.

  • El escalado a cero es el valor predeterminado: si necesita asegurarse de que una o varias instancias de la aplicación se ejecutan continuamente, asegúrese de definir una regla de escalado para satisfacer mejor sus necesidades.

  • Comportamiento inesperado: si la aplicación de contenedor no puede compilar, iniciar o ejecutar, compruebe que la ruta de acceso del artefacto está establecida correctamente en el contenedor.

  • Problemas de compatibilidad con Buildpack: si Buildpack no admite dependencias o la versión de Java que necesita, cree su propio Dockerfile para implementar la aplicación. Puede ver un Dockerfile de ejemplo como referencia.

  • Señales SIGTERM y SIGINT: de manera predeterminada, la JVM controla las señales SIGTERM y SIGINT y no las pasa a la aplicación a menos que usted intercepte estas señales y las controle en la aplicación en consecuencia. Container Apps usa SIGTERM y SIGINT para el control de procesos. Si no captura estas señales y la aplicación finaliza inesperadamente, puede perder estas señales a menos que las conserve en el almacenamiento.

  • Acceso a imágenes de contenedor: si usa la implementación de artefactos o código fuente en combinación con el registro predeterminado, no tiene acceso directo a las imágenes de contenedor.

Supervisión

Todas las herramientas de observabilidad estándar funcionan con la aplicación Java. A medida que compila las aplicaciones Java para que se ejecuten en Container Apps, tenga en cuenta los siguientes elementos:

  • Métricas: las métricas de máquina virtual Java (JVM) son fundamentales para supervisar el estado y el rendimiento de las aplicaciones Java. Los datos recopilados incluyen información sobre el uso de memoria, la recolección de elementos no utilizados y el número de subprocesos de la JVM. Puede consultar métricas para garantizar la salud y estabilidad de sus aplicaciones.

  • Registro: envíe mensajes de error y aplicación a stdout o stderror para que puedan mostrarse en el flujo de registro. Evite el registro directamente en el sistema de archivos del contenedor, como es habitual cuando se usan servicios de registro populares.

  • Configuración de supervisión del rendimiento: implemente servicios de supervisión de rendimiento como un contenedor independiente en el entorno de Container Apps para que pueda acceder directamente a la aplicación.

Diagnóstico

Azure Container Apps ofrece herramientas de diagnóstico integradas exclusivamente para desarrolladores Java. Este soporte agiliza la depuración y la resolución de problemas de las aplicaciones Java que se ejecutan en Azure Container Apps para mejorar la eficiencia y la facilidad.

  • Nivel de registro dinámico: le permite acceder y comprobar diferentes niveles de detalles de registro sin modificar el código ni obligarle a reiniciar su aplicación. Puede ver Establecer nivel de registro dinámico como referencia.

Ampliación

Si necesita asegurarse de que las solicitudes de las aplicaciones de front-end lleguen al mismo servidor, o la aplicación de front-end se divide entre varios contenedores, asegúrese de habilitar las sesiones permanentes.

Seguridad

El runtime de Container Apps finaliza TSL/SSL en su nombre dentro del entorno de Container Apps.

Administración de memoria

Para ayudar a optimizar la administración de memoria en la aplicación Java, puede asegurarse de que el ajuste de memoria JVM esté habilitado en la aplicación.

La memoria se mide en pares de núcleos de CPU y gibibytes (Gi). En la tabla siguiente se muestra el intervalo de recursos disponibles para la aplicación de contenedor.

Umbral Núcleos de CPU Memoria en Gibibytes (Gi)
Mínima 0,25 0.5
Máximo 4 8

Los núcleos están disponibles en incrementos de 0,25 núcleos, con memoria disponible en una relación de 2:1. Por ejemplo, si necesita 1,25 núcleos, tiene 2,5 Gi de memoria disponible para la aplicación de contenedor.

Nota:

En el caso de las aplicaciones que usan las versiones 9 y anteriores de JDK, asegúrese de definir la configuración de memoria personalizada de JVM para que coincida con la asignación de memoria en Azure Container Apps.

Compatibilidad con componentes de Java

Azure Container Apps ofrece compatibilidad con los siguientes componentes de Java como servicios administrados:

  • Eureka Server para Spring: el registro y la detección de servicios son requisitos clave para mantener una lista de instancias de aplicaciones activas. La aplicación usa esta lista para enrutar y equilibrar la carga de las solicitudes entrantes. La configuración manual de cada cliente lleva tiempo e introduce la posibilidad de que se produzcan errores humanos. Eureka Server simplifica la administración de la detección de servicios funcionando como un registro de servicio donde los microservicios pueden registrarse y detectar otros servicios dentro del sistema.

  • Config Server para Spring: Config Server proporciona administración de configuración externa centralizada para sistemas distribuidos. Este componente está diseñado para abordar los desafíos de la administración de las opciones de configuración en varios microservicios en un entorno nativo de la nube.

  • Gateway para Spring: Gateway para Spring ofrece una manera eficaz y eficiente 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, entre otras.

  • Administrador para Spring: el componente Administrador gestionado para Spring que proporciona una interfaz administrativa está diseñado para aplicaciones web Spring Boot que tienen puntos de conexión de actuador. Un componente gestionado proporciona integración y gestión a su aplicación de contenedor permitiéndole vincular su aplicación de contenedor al componente Administrador para Spring.

Pasos siguientes