Compartir vía


Migración de aplicaciones de Spring Boot a Azure App Service

En esta guía se describe lo que debe tener en cuenta cuando quiera migrar una aplicación de Spring Boot existente a Azure App Service.

Antes de la migración

Para asegurarse de que la migración se realiza correctamente, antes de empezar, complete los pasos de evaluación e inventario descritos en las secciones siguientes.

Cambiar a una plataforma compatible

App Service ofrece versiones específicas de Java SE. Para garantizar la compatibilidad, migre la aplicación a una de las versiones compatibles de su entorno actual antes de continuar con cualquiera de los pasos restantes. Asegúrese de probar completamente la configuración resultante. Use la versión estable más reciente de la distribución de Linux en estas pruebas.

Nota:

Esta validación es especialmente importante si el servidor actual se está ejecutando en un JDK no compatible (como Oracle JDK o IBM OpenJ9).

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

java -version

En Azure App Service, los archivos binarios de Java 8 se proporcionan desde Eclipse Temurin. Para Java 11, 17 y todas las versiones futuras de LTS de Java, App Service proporciona el Microsoft Build of OpenJDK. Estos archivos binarios están disponibles de forma gratuita en los siguientes sitios:

Recursos externos de inventario

Identifique recursos externos, como orígenes de datos, agentes de mensajes JMS y direcciones URL de otros servicios. En las aplicaciones de Spring Boot, normalmente puede encontrar la configuración de estos recursos en la carpeta src/main/directory , en un archivo que normalmente se denomina application.properties o application.yml. Además, compruebe las variables de entorno de la implementación de producción para ver las opciones de configuración pertinentes.

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:

  • Repositorios JPA
  • Repositorios JDBC
  • Repositorios de Cassandra
  • Repositorios de MongoDB

Agentes de mensajes de JMS

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

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

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

Las aplicaciones de Spring Boot que usan agentes comerciales suelen contener dependencias directamente en 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")
      ...
    }

Una vez que haya identificado al corredor o los corredores en uso, busque la configuración correspondiente. En las aplicaciones de Spring Boot, normalmente puede encontrarlos 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 grado de confianza muy alto 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, Redis se usa a través de Spring Data Redis. Para obtener información de configuración, consulte la documentación de Spring Data Redis .

Determine si los datos de sesión se almacenan en caché a través de Spring Session buscando la configuración respectiva (en Java o XML).

Proveedores de identidades

Identifique los proveedores de identidades usados por la aplicación. Para obtener información sobre cómo se pueden configurar los proveedores de identidades, consulte lo siguiente:

  • Para la configuración de OAuth2, consulte la referencia de Spring Security.
  • Para obtener la configuración de Auth0 Spring Security, consulte la documentación de Auth0 Spring Security.
  • Para la configuración de PingFederate Spring Security, consulte las instrucciones de Auth0 PingFederate.

Todos los demás recursos externos

No es factible documentar todas las dependencias externas posibles en esta guía. Es responsabilidad del equipo comprobar que todas las dependencias externas de la aplicación se pueden satisfacer después de una migración de App Service.

Secretos de inventario

Contraseñas y cadenas seguras

Compruebe todas las propiedades y los archivos de configuración y todas las variables de entorno en las implementaciones de producción para ver las cadenas y contraseñas secretas. En una aplicación de Spring Boot, es probable que estas cadenas se encuentren en application.properties o application.yml.

Certificados de inventario

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

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

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

Para usar el sistema de archivos en el servidor de aplicaciones será necesario cambiar la configuración o, en raras ocasiones, la arquitectura. Puede identificar algunos o todos los escenarios siguientes.

Contenido estático de solo lectura

Si la aplicación actualmente sirve contenido estático, necesita una ubicación alternativa para ella. Debe considerar la posibilidad de mover contenido estático a Azure Blob Storage y agregar Azure Front Door para descargas rápidas globalmente. Para obtener más información, vea Hospedaje de sitios web estáticos en Azure Storage y Integrar una cuenta de Azure Storage con Azure Front Door.

Casos especiales

Algunos escenarios de producción pueden requerir cambios adicionales o imponer limitaciones adicionales. Aunque estos escenarios pueden ser poco frecuentes, es importante asegurarse de que no sean aplicables a su aplicación o que se resuelvan correctamente.

Determinar si la aplicación se basa en trabajos programados

Los trabajos programados, como las tareas del planificador Quartz o los trabajos cron, no se pueden usar con App Service. App Service no le impedirá implementar una aplicación que contenga tareas programadas internamente. Sin embargo, si la aplicación se expande, un mismo trabajo programado se podría ejecutar más de una vez durante cada período programado. Esta situación puede tener consecuencias no deseadas.

Realice un inventario de los trabajos programados, dentro o fuera del proceso de aplicación.

Determinación de si la aplicación contiene código específico del sistema operativo

Si la aplicación contiene código con dependencias en el sistema operativo del host, deberá refactorizarla para quitar esas dependencias. Por ejemplo, puede que tenga que reemplazar cualquier uso de / o \ en las rutas de acceso del sistema de archivos con File.Separator o Paths.get si la aplicación se ejecuta en Windows.

Identificar todos los procesos o servicios externos que se ejecutan en los servidores en producción

Tendrá que migrar a otra parte o eliminar los procesos que se ejecuten fuera del servidor de aplicaciones, como los demonios de supervisión.

Identificar el manejo de solicitudes no-HTTP o múltiples puertos

App Service solo admite un único punto de conexión HTTP en un único puerto. Si la aplicación escucha en varios puertos o acepta solicitudes que usan protocolos distintos de HTTP, no use Azure App Service.

Migración

Parametrizar la configuración

Asegúrese de que todas las coordenadas de recursos externos (como las cadenas de conexión de base de datos) y otras configuraciones personalizables se pueden leer desde variables de entorno. Si va a migrar una aplicación de Spring Boot, todas las opciones de configuración ya deben ser externalizables. Para obtener más información, consulte Configuración externalizada en la documentación de Spring Boot.

Este es un ejemplo que hace referencia a una variable de entorno desde un archivo application.properties :

spring.jms.servicebus.connection-string=${SERVICEBUS_CONNECTION_STRING}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=10000

Aprovisionar un plan de servicio de aplicación

En la lista de planes de servicio disponibles, seleccione el plan cuyas especificaciones cumplan o superen las del hardware de producción actual.

Nota:

Si planea ejecutar implementaciones de ensayo o controladas, o usar espacios de implementación, el plan de App Service debe incluir esa funcionalidad adicional. Se recomienda usar planes Premium o superior para aplicaciones Java.

Cree el plan de servicio de aplicaciones.

Creación e implementación de aplicaciones web

Deberá crear una aplicación web en su Plan de Servicio de Aplicaciones (eligiendo "Java SE" como pila de tiempo de ejecución) para cada archivo JAR ejecutable que quiera ejecutar.

Aplicaciones de Maven

Si la aplicación se ha creado a partir de un archivo POM de Maven, usará el complemento Webapp para Maven para crear la aplicación web e implementarla. Para obtener más información, consulte Quickstart: Creación de una aplicación de Java en Azure App Service.

Aplicaciones que no son de Maven

Si no puede usar el complemento de Maven, debe aprovisionar la aplicación web con otros mecanismos, como:

Una vez creada la aplicación web, use uno de los mecanismos de implementación disponibles para implementar la aplicación. Si es posible, la aplicación debe cargarse en /home/site/wwwroot/app.jar. Si no desea cambiar el nombre del archivo JAR a app.jar, puede cargar un script de shell con el comando para ejecutar el archivo JAR. A continuación, pegue la ruta de acceso completa a este script en el cuadro de texto Archivo de inicio de la sección Configuración del portal. El script de inicio no se ejecuta desde el directorio en el que se encuentra. Por lo tanto, use siempre rutas de acceso absolutas para hacer referencia a los archivos del script de inicio (por ejemplo: ).

Migración de las opciones de tiempo de ejecución de JVM

Si la aplicación requiere opciones específicas en tiempo de ejecución, use el mecanismo más adecuado para especificarlas.

Configuración de un dominio personalizado y SSL

Si su aplicación va a ser visible en un dominio personalizado, deberá asociar la aplicación web a dicho dominio. Para obtener más información, consulte Tutorial: Asignación de un nombre DNS personalizado existente a Azure App Service.

A continuación, deberá enlazar el certificado SSL para ese dominio a la aplicación web de App Service. Para obtener más información, consulte Asegurar un nombre DNS personalizado con una vinculación SSL en Azure App Service.

Importación de certificados de back-end

Todos los certificados para comunicarse con sistemas back-end, como las bases de datos, deben estar disponibles para App Service. Para más información, consulte Incorporación de un certificado SSL en App Service.

Migración de coordenadas de recursos externos y otras configuraciones

Siga estos pasos para migrar cadenas de conexión y otras configuraciones.

Nota:

Para cualquier configuración de aplicación de Spring Boot parametrizada con variables en la sección Parametrización de la configuración , esas variables de entorno deben definirse en la configuración de la aplicación. La configuración de la aplicación de Spring Boot no parametrizada explícitamente con variables de entorno se pueden invalidar con la configuración de la aplicación. Por ejemplo:

spring.jms.servicebus.connection-string=${CUSTOMCONNSTR_SERVICE_BUS}
spring.jms.servicebus.topic-client-id=contoso1
spring.jms.servicebus.idle-timeout=1800000

Configuración de aplicaciones de App Service

Migración de los trabajos programados

Para ejecutar trabajos programados en Azure, considere la posibilidad de usar un desencadenador Timer para Azure Functions. No es necesario migrar el propio código de trabajo a una función. La función simplemente puede invocar una dirección URL en la aplicación para desencadenar el trabajo. Si estas ejecuciones de trabajos tienen que invocarse dinámicamente o realizar un seguimiento central, considere la posibilidad de usar Spring Batch.

Como alternativa, puede crear una aplicación lógica con un desencadenador recurrence para invocar la dirección URL sin escribir ningún código fuera de la aplicación. Para obtener más información, vea Overview: ¿Qué es Azure Logic Apps? y Crear, programar y ejecutar tareas y flujos de trabajo periódicos con el desencadenador Recurrence en Azure Logic Apps.

Nota:

Para evitar el uso malintencionado, probablemente necesitará asegurarse de que el punto de acceso para la invocación del trabajo requiera credenciales. En este caso, la función de desencadenador deberá proporcionar las credenciales.

Migración y habilitación del proveedor de identidades

Si la aplicación requiere autenticación o autorización, asegúrese de que están configuradas para acceder al proveedor de identidades mediante las instrucciones siguientes:

  • Si el proveedor de identidades es Microsoft Entra ID, no se deben realizar cambios.
  • 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 más información, 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 la posibilidad de usar Spring Security para usar el proveedor de identidades mediante OAuth2/OpenID Connect o SAML.

Reinicio y prueba de humo

Por último, tendrá que reiniciar la aplicación web para aplicar todos los cambios de la configuración. Tras completar el reinicio, compruebe que la aplicación se está ejecutando correctamente.

Después de la migración

Ahora que ha migrado la aplicación a Azure App Service debe comprobar que funciona según lo previsto. Una vez hecho esto, tenemos algunas recomendaciones para usted que pueden hacer que la aplicación sea más nativa de la nube.

Recomendaciones

  • Si optó por usar el directorio /home para el almacenamiento de archivos, considere la posibilidad de reemplazarlo con Azure Storage.

  • Si tiene la configuración en el directorio /home que contiene cadenas de conexión, claves SSL y otra información secreta, considere la posibilidad de usar Azure Key Vault o inserción de parámetros con la configuración de la aplicación siempre que sea posible.

  • Considere la posibilidad de usar ranuras de implementación para implementaciones confiables sin tiempo de inactividad.

  • Diseñe e implemente una estrategia de DevOps. Para mantener la confiabilidad al aumentar la velocidad de desarrollo, considere la posibilidad de implementaciones y pruebas automáticas con Azure Pipelines. Si usa espacios de implementación, puede automatizar la implementación en un espacio y después cambiar de espacio.

  • Diseñe e implemente una estrategia de continuidad empresarial y recuperación ante desastres. En el caso de las aplicaciones críticas, considere una arquitectura de implementación de varias regiones.