Migración de aplicaciones de Spring Cloud a Azure Container Apps

En esta guía se describe lo que debe tener en cuenta al migrar una aplicación de Spring Cloud existente para que se ejecute en Azure Container Apps.

Antes de la migración

Para garantizar una migración correcta, complete los pasos de evaluación e inventario descritos en las secciones siguientes antes de comenzar.

Si no puede cumplir alguno de los requisitos previos a la migración, consulte las siguientes guías de migración complementarias:

  • Migración de aplicaciones JAR ejecutables a contenedores en Azure Kubernetes Service (guía planeada)
  • Migración de aplicaciones JAR ejecutables a Azure Virtual Machines (guía planeada)

Inspección de los componentes de la aplicación

Determinación de si se usa el sistema de archivos y cómo

Identifique las instancias en las que los servicios leen o escriben en el sistema de archivos local. Tenga en cuenta qué archivos son de corta duración o temporales y qué archivos son de larga duración.

Azure Container Apps ofrece varios tipos de almacenamiento. Mediante el almacenamiento efímero, puede leer y escribir datos temporales dentro de un contenedor o réplica en ejecución. Mediante Azure Files, puede proporcionar almacenamiento permanente que varios contenedores pueden compartir. Para obtener más información, consulte Cómo utilizar los montajes de almacenamiento en Azure Container Apps.

Si la aplicación proporciona contenido estático de solo lectura, considere la posibilidad de moverla a Azure Blob Storage y agregar Azure CDN para la distribución global. Para obtener más información, vea Static website hosting in Azure Storage and Quickstart: Integrate an Azure storage account with Azure CDN.

Si la aplicación controla el contenido estático publicado dinámicamente (contenido cargado o generado que no cambia después de la creación), puede integrar Azure Blob Storage y Azure CDN. También puede usar una función de Azure para administrar cargas y desencadenar actualizaciones de red CDN. Para obtener una implementación de ejemplo, consulte Carga y precarga de contenido estático de CDN con Azure Functions.

Determinación de si alguno de los servicios contiene código específico del sistema operativo

Si la aplicación contiene código con dependencias en el sistema operativo host, refactorice para quitar esas dependencias. Por ejemplo, reemplace cualquier uso de / o \ en las rutas de acceso del sistema de archivos con File.Separator o Paths.get.

Cambio a una plataforma compatible

Si crea el Dockerfile manualmente e implementa una aplicación en contenedor en Azure Container Apps, tiene control total sobre la implementación, incluidas las versiones JRE/JDK.

Para la implementación desde artefactos, Azure Container Apps ofrece versiones específicas de Java (8, 11, 17 y 21) y versiones específicas de los componentes de Spring Boot y Spring Cloud. Para garantizar la compatibilidad, migre primero la aplicación a una versión compatible de Java en su entorno actual y, a continuación, continúe con los pasos de migración restantes. Pruebe completamente la configuración resultante con la versión estable más reciente de la distribución de Linux.

Nota:

Esta validación es especialmente importante si el servidor actual se ejecuta en un JDK no compatible, como Oracle JDK o IBM OpenJ9.

Para comprobar la versión actual de Java, inicie sesión en el servidor de producción y ejecute el siguiente comando:

java -version

Para ver las versiones compatibles de Java, Spring Boot y Spring Cloud, consulte Introducción a Java en Azure Container Apps.

Identificación de las versiones de Spring Boot

Examine las dependencias de cada aplicación que va a migrar para determinar su versión de Spring Boot.

En los proyectos de Maven , busque la versión de Spring Boot en el <parent> elemento del archivo POM:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.3.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

En los proyectos de Gradle , busque la versión de Spring Boot en la plugins sección :

plugins {
  id 'org.springframework.boot' version '3.3.3'
  id 'io.spring.dependency-management' version '1.1.6'
  id 'java'
}

Para las aplicaciones que usan versiones de Spring Boot anteriores a la versión 3.x, siga la Guía de migración de Spring Boot 3.0 para actualizar a una versión compatible. Para ver las versiones compatibles, consulte Versiones de Spring Boot y Spring Cloud.

Identificación de las versiones de Spring Cloud

Examine las dependencias de cada aplicación que va a migrar para determinar la versión de los componentes de Spring Cloud que usa.

Maven

En los proyectos de Maven, establezca la versión de Spring Cloud en la spring-cloud.version propiedad :

  <properties>
    <spring-cloud.version>2023.0.2</spring-cloud.version>
  </properties>
Gradle

En los proyectos de Gradle, establezca la versión de Spring Cloud en el bloque "propiedades adicionales":

ext {
  set('springCloudVersion', "2023.0.2")
}

Tendrá que actualizar todas las aplicaciones para que usen las versiones compatibles de Spring Cloud. Para ver las versiones admitidas, consulte la documentación de Spring Cloud .

Identificación de soluciones de agregación de registros

Identifique las soluciones de agregación de registros que usan las aplicaciones que va a migrar. Debe configurar los ajustes de diagnóstico en la migración para que los eventos registrados estén disponibles para su consumo. Para obtener más información, consulte la sección Asegurar el registro de la consola y configurar las opciones de diagnóstico .

Identificación de los agentes de administración del rendimiento de la aplicación (APM)

Identifique los agentes de administración del rendimiento de las aplicaciones que usen las aplicaciones. Azure Container Apps no ofrece compatibilidad integrada con la integración de APM. Debe preparar la imagen de contenedor o integrar la herramienta de APM directamente en el código. Si quiere medir el rendimiento de la aplicación, pero aún no ha integrado ningún APM, considere la posibilidad de usar Azure Application Insights. Para obtener más información, consulte la sección Migración .

Recursos externos de inventario

Identifique los recursos externos, tales como los orígenes de datos, los agentes de mensajes JMS y las direcciones URL de otros servicios. En las aplicaciones de Spring Cloud, normalmente se encuentra la configuración de estos recursos en una de las siguientes ubicaciones:

  • En la carpeta src/main/resources , en un archivo normalmente denominado application.properties o application.yml.
  • En el repositorio de Spring Cloud Config Server que identificaste en el paso anterior.

Bases de datos

En el caso de una aplicación de Spring Boot, las cadenas de conexión suelen aparecer en archivos de configuración cuando depende de una base de datos externa. Este es un ejemplo de un archivo application.properties :

spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=dbuser
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

Este es un ejemplo de un archivo application.yaml :

spring:
  data:
    mongodb:
      uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017

Consulte la documentación de Spring Data para obtener más escenarios de configuración posibles:

Intermediarios de mensajes JMS

Identifique los brokers en uso buscando en el manifiesto de compilación (normalmente, un archivo pom.xml o build.gradle) para encontrar las dependencias pertinentes.

Por ejemplo, una aplicación de Spring Boot que usa ActiveMQ normalmente contiene esta dependencia en su archivo pom.xml :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

Las aplicaciones Spring Boot que usan agentes comerciales suelen contener dependencias directas de las bibliotecas de controladores JMS de los agentes. Este es un ejemplo de un archivo build.gradle :

    dependencies {
      ...
      compile("com.ibm.mq:com.ibm.mq.allclient:9.4.0.5")
      ...
    }

Después de identificar los agentes en uso, localice la configuración correspondiente. Normalmente, los encuentra en los archivos application.properties y application.yml en el directorio de la aplicación.

Nota:

Microsoft recomienda usar el flujo de autenticación más seguro disponible. El flujo de autenticación descrito en este procedimiento, como para bases de datos, memorias caché, mensajería o servicios de inteligencia artificial, requiere un alto grado de confianza en la aplicación y conlleva riesgos que no están presentes en otros flujos. Use este flujo solo cuando las opciones más seguras, como las identidades administradas para conexiones sin contraseña o sin claves, no sean viables. En el caso de las operaciones de máquina local, prefiera identidades de usuario para conexiones sin contraseña o sin claves.

Este es un ejemplo de ActiveMQ de un archivo application.properties :

spring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true
spring.activemq.user=admin
spring.activemq.password=<password>

Para obtener más información sobre la configuración de ActiveMQ, consulte la documentación de mensajería de Spring Boot.

Este es un ejemplo de IBM MQ de un archivo application.yaml :

ibm:
  mq:
    queueManager: qm1
    channel: dev.ORDERS
    connName: localhost(14)
    user: admin
    password: <password>

Para obtener más información sobre la configuración de IBM MQ, consulte la documentación de los componentes de IBM MQ Spring.

Identificación de cachés externas

Identifique las memorias caché externas en uso. Con frecuencia, se usa Redis a través de Spring Data Redis. Para obtener información de configuración, consulte la documentación de Spring Data Redis .

Determine si almacena en caché los datos de sesión a través de Spring Session mediante la búsqueda de la configuración correspondiente (en Java o XML).

Proveedores de identidades

Identifique todos los proveedores de identidades y todas las aplicaciones de Spring Cloud que requieran autenticación y autorización. Para obtener información sobre cómo puede configurar los proveedores de identidad, consulte los siguientes recursos:

Recursos configurados mediante Tanzu Application Service de VMware (antes llamado Pivotal Cloud Foundry)

En el caso de las aplicaciones administradas con TAS, a menudo configura recursos externos, incluidos los recursos descritos anteriormente, a través de enlaces de servicio TAS. Para examinar la configuración de estos recursos, use la CLI de TAS (Cloud Foundry) para ver la VCAP_SERVICES variable de la aplicación.

# Log into TAS, if needed (enter credentials when prompted)
cf login -a <API endpoint>

# Set the organization and space containing the application, if not already selected during login.
cf target org <organization name>
cf target space <space name>

# Display variables for the application
cf env <Application Name>

Examina la variable VCAP_SERVICES para los ajustes de configuración de los servicios externos vinculados a la aplicación. Para más información, consulte la documentación de TAS (Cloud Foundry).

Todos los demás recursos externos

No es factible que esta guía documente todas las dependencias externas posibles. Después de la migración, debe comprobar que puede satisfacer todas las dependencias externas de la aplicación.

Orígenes y secretos de configuración de inventario

Contraseñas y cadenas seguras de inventario

Compruebe todas las propiedades, los archivos de configuración y las variables de entorno en las implementaciones de producción para ver las cadenas y contraseñas secretas. En una aplicación de Spring Cloud, normalmente se encuentran estas cadenas en el archivo application.properties o application.yml en servicios individuales o en el repositorio de Spring Cloud Config Server.

Certificados de inventario

Documente todos los certificados utilizados para los puntos de conexión SSL públicos o la comunicación con las bases de datos de backend y otros sistemas. Para ver todos los certificados en los servidores de producción, ejecute el comando siguiente:

keytool -list -v -keystore <path to keystore>

Determinación de si se usa Spring Cloud Vault

Si usa Spring Cloud Vault para almacenar y acceder a secretos, identifique el almacén de secretos de respaldo( por ejemplo, HashiCorp Vault o CredHub). A continuación, identifique todos los secretos que usa el código de la aplicación.

Localización del origen del servidor de configuración

Si la aplicación usa un servidor de configuración de Spring Cloud, identifique dónde se almacena la configuración. Normalmente, este valor se encuentra en el archivo bootstrap.yml o bootstrap.properties , o a veces en el archivo application.yml o application.properties . El ajuste se parece al del ejemplo siguiente:

spring.cloud.config.server.git.uri: file://${user.home}/spring-cloud-config-repo

Aunque git se usa normalmente como almacén de datos de respaldo de Spring Cloud Config Server, como se muestra anteriormente, la aplicación podría usar uno de los otros servidores back-end posibles. Consulte la documentación de Spring Cloud Config Server para obtener información sobre otros back-end, como Relational Database (JDBC),SVN y el sistema de archivos local.

Inspección de la arquitectura de implementación

Requisitos de hardware para cada servicio

Para cada uno de los servicios de Spring Cloud (sin incluir el servidor de configuración, el registro o la puerta de enlace), documente la siguiente información:

  • Número de instancias en ejecución.
  • Número de CPU asignadas a cada instancia.
  • Cantidad de RAM asignada a cada instancia.

Documentar la replicación geográfica y la distribución

Determine si las aplicaciones de Spring Cloud están siendo distribuidas actualmente entre varias regiones o centros de datos. Documente los requisitos de tiempo de actividad y el Acuerdo de Nivel de Servicio para las aplicaciones que va a migrar.

Identificación de los clientes que omiten el registro del servicio

Identifique las aplicaciones cliente que invoquen a cualquiera de los servicios que se van a migrar sin usar el registro de Spring Cloud Service. Después de la migración, estas invocaciones ya no son posibles. Actualice estos clientes para usar Spring Cloud OpenFeign antes de la migración.

Migración

Eliminar configuraciones restringidas

El entorno de Azure Container Apps ofrece el servidor Eureka administrado, Spring Cloud Config Server y el administrador. Al enlazar una aplicación al componente de Java, Azure Container Apps inserta propiedades relacionadas como variables de entorno del sistema. Según el diseño de configuración externa de Spring Boot , las variables de entorno del sistema sobrescriben las propiedades de la aplicación definidas en el código o empaquetadas en artefactos.

Si establece una de las siguientes propiedades a través de un argumento de línea de comandos, una propiedad del sistema Java o la variable de entorno del contenedor, quítelo para evitar conflictos y un comportamiento inesperado:

  • SPRING_CLOUD_CONFIG_COMPONENT_URI
  • SPRING_CLOUD_CONFIG_URI
  • SPRING_CONFIG_IMPORT
  • eureka.client.fetch-registry
  • eureka.client.service-url.defaultZone
  • eureka.instance.prefer-ip-address
  • eureka.client.register-with-eureka
  • SPRING_BOOT_ADMIN_CLIENT_INSTANCE_PREFER-IP
  • SPRING_BOOT_ADMIN_CLIENT_URL

Cree un entorno administrado de Azure Container Apps y aplicaciones

Aprovisione una aplicación Azure Container Apps en la suscripción de Azure en un entorno administrado existente o cree una nueva para cada servicio que vaya a migrar. No es necesario crear aplicaciones que se ejecuten como servidores de registro y configuración de Spring Cloud. Para obtener más información, consulte Quickstart: Implementación de la primera aplicación contenedora mediante el portal de Azure.

Preparar el servidor de configuración de Spring Cloud

Configura el servidor de configuración en tus aplicaciones de contenedor de Azure para el componente Spring. Para obtener más información, consulte Configuración de la configuración del componente Config Server for Spring en Azure Container Apps.

Nota:

Si el repositorio actual de Configuración de Spring Cloud está en el sistema de archivos local o en el entorno local, primero debe migrar o replicar los archivos de configuración en un repositorio basado en la nube, como GitHub, Azure Repos o BitBucket.

Comprobación del registro de la consola y configuración de los valores de diagnóstico

Configure el registro para asegurarse de que toda la salida va a la consola en lugar de a los archivos.

Después de implementar una aplicación en Azure Container Apps, puede configurar las opciones de registro en el entorno de Container Apps para definir uno o varios destinos para los registros. Estos destinos pueden incluir Azure Monitor Log Analytics, Azure Event Hubs o incluso otras soluciones de supervisión de terceros. También puede deshabilitar los datos de registro y ver los registros solo en tiempo de ejecución. Para obtener instrucciones de configuración detalladas, consulte Opciones de almacenamiento y supervisión de registros en Azure Container Apps.

Configuración de almacenamiento persistente

Si alguna parte de la aplicación lee o escribe en el sistema de archivos local, deberá configurar el almacenamiento persistente para reemplazar el sistema de archivos local. Puede indicar la ruta de acceso para montar en el contenedor a través de los ajustes de la aplicación y alinearla con la ruta de acceso que usa la aplicación. Para obtener más información, consulte Cómo utilizar los montajes de almacenamiento en Azure Container Apps.

Migración de secretos de Spring Cloud Vault a Azure Key Vault

Puede inyectar secretos directamente en las aplicaciones a través de Spring utilizando Azure Key Vault Spring Boot Starter. Para obtener más información, consulte How to use the Spring Boot Starter for Azure Key Vault.

Nota:

La migración puede requerir que renombres algunos datos confidenciales. Actualice el código de la aplicación como sea necesario.

Migración de todos los certificados a Key Vault

Azure Container Apps admite la comunicación segura entre aplicaciones. La aplicación no necesita administrar el proceso de establecimiento de comunicaciones seguras. Puede cargar el certificado privado en Azure Container Apps o usar un certificado administrado gratuito proporcionado por Azure Container Apps. Usar Azure Key Vault para administrar certificados es un enfoque recomendado. Para obtener más información, vea Certificates en Azure Container Apps.

Configuración de las integraciones de administración del rendimiento de la aplicación (APM)

Si ya configuró variables relacionadas con APM dentro del contenedor, asegúrese de que puede conectarse a la plataforma de APM de destino. Si la configuración de APM hace referencia a variables de entorno del contenedor, establezca las variables de entorno en tiempo de ejecución según corresponda en Azure Container Apps. Controle información confidencial, como la cadena de conexión, de forma segura. Puede especificarlo como un secreto o hacer referencia a un secreto almacenado en Azure Key Vault.

Configuración de secretos por servicio y configuraciones externalizadas

Puede insertar opciones de configuración en cada contenedor como variables de entorno. Los cambios en las variables crean una nueva revisión para la aplicación existente. Los secretos son pares clave-valor y son válidos en todas las revisiones.

Migración y habilitación del proveedor de identidades

Si alguna de las aplicaciones de Spring Cloud requiere autenticación o autorización, consulte las siguientes indicaciones para garantizar que están configuradas para acceder al proveedor de identidades:

  • Si el proveedor de identidades es Microsoft Entra ID, no realice ningún cambio.
  • Si el proveedor de identidades es un bosque de Active Directory local, considere implementar una solución de identidad híbrida con Microsoft Entra ID. Para obtener instrucciones, consulte la documentación de identidad híbrida.
  • Si el proveedor de identidades es otra solución local, como PingFederate, consulte el tema Instalación personalizada de Microsoft Entra Connect para configurar la federación con Microsoft Entra ID. Como alternativa, considere usar Spring Security para acceder a su proveedor de identidades a través de OAuth2/OpenID Connect o SAML.

Actualización de aplicaciones cliente

Actualice la configuración de todas las aplicaciones cliente para usar los puntos de conexión de Azure Container Apps publicados para las aplicaciones migradas.

Después de la migración

Después de completar la migración, compruebe que la aplicación funciona según lo previsto. En las secciones siguientes se describen las recomendaciones para hacer que la aplicación sea más nativa de la nube y sea operativamente sólida.

Optimización de patrones nativos en la nube

Las siguientes recomendaciones le ayudan a adoptar componentes de Spring Cloud y componentes de Java administrados de Azure Container Apps para que la aplicación sea más nativa de la nube.

Detección de servicios y equilibrio de carga

Permitir que la aplicación funcione con el componente Spring Cloud Registry para que otras aplicaciones y clientes de Spring implementados puedan detectarla dinámicamente. Para obtener más información, vea Configuración de la configuración del componente Eureka Server for Spring en Azure Container Apps.

A continuación, modifique los clientes de la aplicación para que usen el Load Balancer de Spring Client. Cuando se usa Spring Client Load Balancer, el cliente obtiene direcciones para todas las instancias en ejecución de la aplicación y busca una que funcione si otra se daña o no responde. Para obtener más información, consulte Spring Tips: Spring Cloud Load Balancer en el blog de Spring.

Puerta de enlace de API

Considere la posibilidad de agregar una instancia de Spring Cloud Gateway . Spring Cloud Gateway proporciona un único punto de conexión para todas las aplicaciones implementadas en el entorno de Azure Container Apps. Si ya ha implementado una puerta de enlace de Spring Cloud, asegúrese de configurar una regla de enrutamiento para enrutar el tráfico a la aplicación recién implementada.

Configuración centralizada

Tiene la opción de agregar un servidor de Spring Cloud Config Server para administrar de forma centralizada y configurar el control de versiones de todas las aplicaciones de Spring Cloud. En primer lugar, cree un repositorio de Git para hospedar la configuración y configurar la instancia de la aplicación para usarla. Para obtener más información, consulte Configuración de la configuración del componente Config Server for Spring en Azure Container Apps.

Migre la configuración mediante los pasos siguientes:

  1. Dentro del directorio src/main/resources de la aplicación, cree un archivo bootstrap.yml con el siguiente contenido:

    spring:
      application:
        name: <your-application-name>
    
  2. En el repositorio de configuración de Git, cree un archivo <your-application-name>.yml, donde your-application-name es el mismo que en el paso anterior. Mueva la configuración del archivo application.yml en src/main/resources al nuevo archivo que creó. Si la configuración se encontraba anteriormente en un archivo .properties , conviértela primero en YAML. Puede encontrar herramientas en línea o complementos de IntelliJ para realizar esta conversión.

  3. Cree un archivo application.yml en el directorio que creó. Use este archivo para definir la configuración y los recursos compartidos entre todas las aplicaciones del entorno de Azure Container Apps, como orígenes de datos, configuración de registro y configuración del accionador de Spring Boot.

  4. Confirme e inserte estos cambios en el repositorio de Git.

  5. Quite el archivo application.properties o application.yml de la aplicación.

Administration

Podría agregar el componente administrado Admin para Spring para habilitar una interfaz administrativa para las aplicaciones web de Spring Boot que expongan los puntos conexión del accionador. Para obtener más información, consulte Configurar el componente administrador de Spring Boot en Azure Container Apps.

Mejora de la preparación operativa

Las siguientes recomendaciones le ayudan a reforzar las prácticas de confiabilidad, observabilidad e implementación de la aplicación migrada.

  • Canalizaciones de CI/CD: agregue una canalización de implementación para implementaciones automáticas y coherentes. Las instrucciones están disponibles para Azure Pipelines y Acciones de GitHub.
  • Implementación azul-verde: use revisiones de aplicaciones de contenedor, etiquetas de revisión y pesos de tráfico de entrada para probar los cambios de código en producción antes de que estén disponibles para los usuarios finales. Para obtener más información, vea Despliegue Azul-Verde en Azure Container Apps.
  • Enlaces de servicio: agregue enlaces de servicio para conectar la aplicación a bases de datos de Azure admitidas. Los enlaces de servicio eliminan la necesidad de proporcionar información de conexión, incluidas las credenciales, a las aplicaciones de Spring Boot.
  • Métricas de JVM: Permite a la pila de desarrollo de Java recopilar métricas del núcleo de la JVM. Para obtener más información, consulte Java métricas para aplicaciones de Java en Azure Container Apps.
  • Alertas: agregue reglas de alertas y grupos de acciones de Azure Monitor para detectar y abordar rápidamente condiciones aberantes. Para obtener más información, consulte Configurar alertas en Azure Container Apps.
  • Redundancia de zona: replique la aplicación entre zonas de disponibilidad habilitando la redundancia de zona. La carga del tráfico se equilibra y se dirige automáticamente a las réplicas si se produce una interrupción en la zona. Para más información, consulte Confiabilidad en Azure Container Apps.
  • Firewall de aplicaciones web: proteja su aplicación de contenedor de vulnerabilidades comunes mediante el uso de Web Application Firewall en Application Gateway. Para obtener más información, consulte Proteger Aplicaciones de Contenedor de Azure con el Firewall de Aplicaciones Web en una Puerta de Enlace de Aplicación.

Reemplazar componentes heredados de Spring Cloud Netflix

Si las aplicaciones usan componentes heredados de Spring Cloud Netflix, tiene la posibilidad de reemplazarlos por alternativas actuales, tal como se indica en la siguiente tabla:

Componente heredado Alternativa actual
Spring Cloud Eureka Registro de servicios de Spring Cloud
Spring Cloud Netflix Zuul Spring Cloud Gateway
Spring Cloud Netflix Archaius Servidor de configuración de Spring Cloud
Spring Cloud Netflix Ribbon Spring Cloud Load Balancer (balanceador de carga del lado del cliente)
Spring Cloud Hystrix Spring Cloud Circuit Breaker + Resilience4J
Turbina de Netflix de Spring Cloud Micrometer + Prometheus