Share via


Implementación de una aplicación Spring en App Service con MySQL

Nota:

Para las aplicaciones de Spring, se recomienda usar Azure Spring Apps. No obstante, todavía puede usar Azure App Service como destino. Para más información, consulte Elección de los servicios de Azure adecuados para las aplicaciones Java.

Este tutorial le guiará en el proceso de creación, configuración, implementación, solución de problemas y escalado de aplicaciones web Java en App Service en Linux.

Este tutorial se basa en la popular aplicación de ejemplo Spring PetClinic. En este tema, probará una versión de HSQLDB de la aplicación localmente y la implementará en App de Azure Service. Después, configurará e implementará una versión que use Azure Database for MySQL. Por último, aprenderá a acceder a los registros de la aplicación y escalar horizontalmente aumentando el número de trabajos que ejecutan la aplicación.

Requisitos previos

Obtención del ejemplo

Para empezar a trabajar con la aplicación de ejemplo, clone y prepare el repositorio de código fuente con los siguientes comandos.

git clone https://github.com/spring-petclinic/spring-framework-petclinic.git
cd spring-framework-petclinic

Compilar y ejecutar el ejemplo HSQLDB localmente

En primer lugar, probaremos el ejemplo localmente con HSQLDB como base de datos.

Compile la versión HSQLDB de la aplicación de ejemplo.

mvn package

A continuación, establezca la variable de entorno TOMCAT_HOME en la ubicación de su instalación de Tomcat.

export TOMCAT_HOME=<Tomcat install directory>

A continuación, actualice el archivo pom.xml para implementar el archivo WAR. Agregue el siguiente código XML como nodo secundario del elemento <plugins>. Si es necesario, cambie 1.9.11 a la versión actual del complemento Cargo Maven 3.

<plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven3-plugin</artifactId>
    <version>1.9.11</version>
    <configuration>
        <container>
            <containerId>tomcat9x</containerId>
            <type>installed</type>
            <home>${TOMCAT_HOME}</home>
        </container>
        <configuration>
            <type>existing</type>
            <home>${TOMCAT_HOME}</home>
        </configuration>
        <deployables>
            <deployable>
                <groupId>${project.groupId}</groupId>
                <artifactId>${project.artifactId}</artifactId>
                <type>war</type>
                <properties>
                    <context>/</context>
                </properties>
            </deployable>
        </deployables>
    </configuration>
</plugin>

Una vez establecida esta configuración, puede implementar la aplicación localmente en Tomcat.

mvn cargo:deploy

A continuación, inicie Tomcat.

${TOMCAT_HOME}/bin/catalina.sh run

Use el explorador para ir a http://localhost:8080, para ver la aplicación en ejecución y hacerse una idea de cómo funciona. Cuando haya terminado, seleccione Ctrl+C en el símbolo del sistema de Bash para detener Tomcat.

Implementación en Azure App Service

Ahora que la ha visto ejecutándose localmente, implementaremos la aplicación en Azure.

Primero, agregue estas variables de entorno: Para REGION, use West US 2 u otras regiones que puede encontrar aquí.

export RESOURCEGROUP_NAME=<resource group>
export WEBAPP_NAME=<web app>
export WEBAPP_PLAN_NAME=${WEBAPP_NAME}-appservice-plan
export REGION=<region>

Maven usará estos valores para crear los recursos de Azure con los nombres que proporcione. Los secretos de la cuenta se pueden mantener fuera de los archivos del proyecto con variables de entorno.

Después, actualice el archivo pom.xml para configurar Maven para una implementación de Azure. Agregue el siguiente código XML después del elemento <plugin> que agregó anteriormente. Si es necesario, cambie 2.5.0 a la versión actual del Complemento Maven para Azure App Service.

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

Inicie de sesión en Azure.

az login

Después, implemente la aplicación en App Service en Linux.

mvn azure-webapp:deploy

Ahora puede ir a https://<app-name>.azurewebsites.net (después de reemplazar <app-name>) para ver la aplicación en ejecución.

Configuración de Azure Database for MySQL

A continuación, vamos a usar MySQL en lugar de HSQLDB. Vamos a crear una instancia del servidor de MySQL en Azure y agregaremos una base de datos. Luego actualizaremos la configuración de la aplicación con la nueva información de conexión de base de datos.

Primero, agregue estas variables de entorno que usaremos más adelante:

export MYSQL_SERVER_NAME=<server>
export MYSQL_SERVER_FULL_NAME=${MYSQL_SERVER_NAME}.mysql.database.azure.com
export MYSQL_SERVER_ADMIN_LOGIN_NAME=<admin>
export MYSQL_SERVER_ADMIN_PASSWORD=<password>
export MYSQL_DATABASE_NAME=<database>
export DOLLAR=\$

A continuación, cree e inicialice el servidor de base de datos. Use az mysql up para la configuración inicial. Use az mysql server configuration set para aumentar el tiempo de espera de la conexión y establecer la zona horaria del servidor.

az extension add --name db-up

az mysql up \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server-name ${MYSQL_SERVER_NAME} \
    --database-name ${MYSQL_DATABASE_NAME} \
    --admin-user ${MYSQL_SERVER_ADMIN_LOGIN_NAME} \
    --admin-password ${MYSQL_SERVER_ADMIN_PASSWORD}

az mysql server configuration set --name wait_timeout \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value 2147483

az mysql server configuration set --name time_zone \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value=-8:00

A continuación, use la CLI de MySQL para conectarse a la base de datos en Azure.

mysql -u ${MYSQL_SERVER_ADMIN_LOGIN_NAME}@${MYSQL_SERVER_NAME} \
 -h ${MYSQL_SERVER_FULL_NAME} -P 3306 -p

En el símbolo del sistema de la CLI de MySQL, ejecute el siguiente comando para verificar que la base de datos se llama con el mismo valor que especificó anteriormente en la variable de entorno MYSQL_DATABASE_NAME.

show databases;

MySQL ya está listo para su uso.

Configuración de la aplicación para MySQL

A continuación, agregaremos la información de conexión a la versión de MySQL de la aplicación y la implementaremos en App Service.

Actualice el archivo pom.xml para que MySQL sea la configuración activa. Quite el elemento <activation> del perfil de H2 y colóquelo en el perfil de MySQL, como se muestra aquí. El resto del fragmento de código muestra la configuración existente. Observe cómo Maven usa las variables de entorno establecidas anteriormente para configurar el acceso de MySQL.

<profile>
    <id>MySQL</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <db.script>mysql</db.script>
        <jpa.database>MYSQL</jpa.database>
        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
        <jdbc.url>jdbc:mysql://${DOLLAR}{MYSQL_SERVER_FULL_NAME}:3306/${DOLLAR}{MYSQL_DATABASE_NAME}?useUnicode=true</jdbc.url>
        <jdbc.username>${DOLLAR}{MYSQL_SERVER_ADMIN_LOGIN_NAME}@${DOLLAR}{MYSQL_SERVER_FULL_NAME}</jdbc.username>
        <jdbc.password>${DOLLAR}{MYSQL_SERVER_ADMIN_PASSWORD}</jdbc.password>
    </properties>
    ...
</profile>

Después, actualice el archivo pom.xml para configurar Maven para una implementación de Azure y para MySQL. Agregue el siguiente código XML después del elemento <plugin> que agregó anteriormente. Si es necesario, cambie 2.5.0 a la versión actual del Complemento Maven para Azure App Service.

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <appSettings>
      <property>
        <name>MYSQL_SERVER_FULL_NAME</name>
        <value>${MYSQL_SERVER_FULL_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_LOGIN_NAME</name>
        <value>${MYSQL_SERVER_ADMIN_LOGIN_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_PASSWORD</name>
        <value>${MYSQL_SERVER_ADMIN_PASSWORD}</value>
      </property>
      <property>
        <name>MYSQL_DATABASE_NAME</name>
        <value>${MYSQL_DATABASE_NAME}</value>
      </property>
    </appSettings>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

Después, compile la aplicación, impleméntela y ejecútela con Tomcat para probarla.

mvn package
mvn cargo:deploy
${TOMCAT_HOME}/bin/catalina.sh run

Ahora puede ver la aplicación localmente en http://localhost:8080. La aplicación tendrá el mismo aspecto que antes, pero usará Azure Database for MySQL en lugar de HSQLDB. Cuando haya terminado, seleccione Ctrl+C en el símbolo del sistema de Bash para detener Tomcat.

Por último, implemente la aplicación en App Service.

mvn azure-webapp:deploy

Vaya a https://<app-name>.azurewebsites.net para ver la aplicación en ejecución con App Service y Azure Database for MySQL.

Acceso a los registros de la aplicación

Si necesita solucionar algún problema, puede consultar los registros de la aplicación. Para abrir el flujo de registros remoto en el equipo local, use el siguiente comando.

az webapp log tail --name ${WEBAPP_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

Cuando haya terminado de ver los registros, seleccione Ctrl+C para detener la secuencia.

El flujo de registros también está disponible en https://<app-name>.scm.azurewebsites.net/api/logstream.

Escalado horizontal

Para admitir un aumento del tráfico hacia la aplicación, puede escalar horizontalmente a varias instancias mediante el siguiente comando.

az appservice plan update --number-of-workers 2 \
    --name ${WEBAPP_PLAN_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

Felicidades. Ha creado y escalado horizontalmente una aplicación web Java con Spring Framework, JSP, Spring Data, Hibernate, JDBC, App Service en Linux y Azure Database for MySQL.

Limpieza de recursos

En las secciones anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando.

az group delete --name ${RESOURCEGROUP_NAME}

Pasos siguientes

Consulte las demás opciones de configuración y de CI/CD disponibles para Java con App Service.