Tutorial: Compilación de una aplicación web de Java Spring Boot con Azure App Service en Linux y Azure Cosmos DB

Nota:

Para las aplicaciones de Spring, se recomienda usar Azure Spring Apps. No obstante, todavía puede usar Azure App Service como destino. Consulte guía de destino de carga de trabajo de Java para obtener consejos.

Este tutorial lo guiará en el proceso de compilación, configuración, implementación y escalado de aplicaciones web de Java en Azure. Cuando termine, tendrá una aplicación Spring Boot que almacena datos en Azure Cosmos DB y que se ejecuta en Azure App Service en Linux.

La aplicación Spring Boot almacena datos en Azure Cosmos DB

En este tutorial aprenderá a:

  • Crea una base de datos de Azure Cosmos DB.
  • Conectar una aplicación de ejemplo a la base de datos y probarla de manera local.
  • Implementar la aplicación de ejemplo en Azure.
  • Transmitir registros de diagnóstico desde App Service.
  • Agregar instancias adicionales para escalar horizontalmente la aplicación de ejemplo.

Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.

Prerrequisitos

Clonación de la aplicación de tareas pendientes de ejemplo y preparación del repositorio

En este tutorial se usa una aplicación de lista de tareas pendientes de ejemplo con una interfaz de usuario web que llama a una API REST de Spring con el respaldo de Spring Data para Azure Cosmos DB. El código de la aplicación está disponible en GitHub. Para más información sobre cómo escribir aplicaciones Java mediante Spring y Azure Cosmos DB, consulte el tutorial de Spring Boot Starter con Azure Cosmos DB for NoSQL y el inicio rápido de Spring Data para Azure Cosmos DB.

Ejecute los comandos siguientes en su terminal para clonar el repositorio de ejemplo y configurar el entorno de aplicación de ejemplo.

git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
cd e2e-java-experience-in-app-service-linux-part-2
yes | cp -rf .prep/* .

Creación de una base de datos de Azure Cosmos DB

Siga estos pasos para crear una base de datos de Azure Cosmos DB en la suscripción. La aplicación de lista de tareas pendientes se conectará a esta base de datos y almacenará sus datos al ejecutarse, conservando el estado de la aplicación independiente de dónde se ejecute la aplicación.

  1. Inicie sesión en la CLI de Azure y, de manera opcional, establezca la suscripción si tiene más de una conectada a las credenciales de inicio de sesión.

    az login
    az account set -s <your-subscription-id>
    
  2. Cree un grupo de recursos de Azure, teniendo en cuenta el nombre del grupo de recursos.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Cree la base de datos de Azure Cosmos DB con el tipo GlobalDocumentDB. Solo debe usar letras minúsculas en el nombre de la instancia de Azure Cosmos DB. Anote el campo documentEndpoint en la respuesta del comando.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Obtenga su clave de Azure Cosmos DB para conectarse a la aplicación. Tenga primaryMasterKey, documentEndpoint a mano, porque los necesitará en el próximo paso.

    az cosmosdb keys list -g <your-azure-group-name> -n <your-azure-COSMOSDB-name>
    

Configuración de las propiedades de la aplicación de tareas pendientes

Abra un terminal en el equipo. Copie el archivo de script de ejemplo en el repositorio clonado para que pueda personalizarlo para la base de datos de Azure Cosmos DB que acaba de crear.

cd initial/spring-todo-app
cp set-env-variables-template.sh .scripts/set-env-variables.sh

Edite .scripts/set-env-variables.sh en el editor que prefiera y suministre a Azure información de conexión de Azure Cosmos DB. En la configuración de App Service en Linux, use la misma región que usó antes (your-resource-group-region) y el grupo de recursos (your-azure-group-name) usado al crear la base de datos de Azure Cosmos DB. Elija un WEBAPP_NAME único, porque no se puede duplicar ningún nombre de aplicación web de ninguna implementación de Azure.

export COSMOSDB_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
export COSMOSDB_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
export COSMOSDB_DBNAME=<put-your-COSMOS-DB-name-here>

# App Service Linux Configuration
export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
export WEBAPP_NAME=<put-your-Webapp-name-here>
export REGION=<put-your-REGION-here>

Luego, ejecute el script:

source .scripts/set-env-variables.sh

Estas variables de entorno se usan en application.properties de la aplicación de lista de tareas pendientes. Los campos de los archivos de propiedades establecen una configuración de repositorio predeterminado para Spring Data:

azure.cosmosdb.uri=${COSMOSDB_URI}
azure.cosmosdb.key=${COSMOSDB_KEY}
azure.cosmosdb.database=${COSMOSDB_DBNAME}
@Repository
public interface TodoItemRepository extends DocumentDbRepository<TodoItem, String> {
}

Luego, la aplicación de ejemplo usa la anotación @Document importada desde com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document para configurar un tipo de entidad que Azure Cosmos DB almacene y administre:

@Document
public class TodoItem {
    private String id;
    private String description;
    private String owner;
    private boolean finished;

Ejecutar la aplicación de ejemplo

Use Maven para ejecutar el ejemplo.

mvn package spring-boot:run

La salida debe tener un aspecto similar al siguiente.

bash-3.2$ mvn package spring-boot:run
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 


[INFO] SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html]
2018-10-28 15:04:32.101  INFO 7673 --- [           main] c.m.azure.documentdb.DocumentClient      : Initializing DocumentClient with serviceEndpoint [https://sample-cosmos-db-westus.documents.azure.com:443/], ConnectionPolicy [ConnectionPolicy [requestTimeout=60, mediaRequestTimeout=300, connectionMode=Gateway, mediaReadMode=Buffered, maxPoolSize=800, idleConnectionTimeout=60, userAgentSuffix=;spring-data/2.0.6;098063be661ab767976bd5a2ec350e978faba99348207e8627375e8033277cb2, retryOptions=com.microsoft.azure.documentdb.RetryOptions@6b9fb84d, enableEndpointDiscovery=true, preferredLocations=null]], ConsistencyLevel [null]
[INFO] AnnotationMBeanExporter - Registering beans for JMX exposure on startup
[INFO] TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
[INFO] TodoApplication - Started TodoApplication in 45.573 seconds (JVM running for 76.534)

Puede tener acceso a la aplicación de tareas pendientes de Spring de manera local con este vínculo una vez que se inicia la aplicación: http://localhost:8080/.

Acceso local a la aplicación de tareas pendientes de Spring

Si ve excepciones en lugar del mensaje "Started TodoApplication", compruebe que el script bash del paso anterior exportó correctamente las variables de entorno y que los valores son correctos para la base de datos de Azure Cosmos DB que creó.

Configuración de la implementación de Azure

Abra el archivo pom.xml del directorio initial/spring-boot-todo y agregue la configuración del complemento de Maven para la aplicación web de Azure siguiente.

<plugins> 

    <!--*************************************************-->
    <!-- Deploy to Java SE in App Service Linux           -->
    <!--*************************************************-->
       
    <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>2.5.0</version>
        <configuration>
            <schemaVersion>v2</schemaVersion>

            <!-- Web App information -->
            <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
            <appName>${WEBAPP_NAME}</appName>
            <region>${REGION}</region>
            <pricingTier>P1v2</pricingTier>
            <!-- Java Runtime Stack for Web App on Linux-->
            <runtime>
                 <os>linux</os>
                 <javaVersion>Java 8</javaVersion>
                 <webContainer>Java SE</webContainer>
             </runtime>
             <deployment>
                 <resources>
                 <resource>
                     <directory>${project.basedir}/target</directory>
                     <includes>
                     <include>*.jar</include>
                     </includes>
                 </resource>
                 </resources>
             </deployment>

            <appSettings>
                <property>
                    <name>COSMOSDB_URI</name>
                    <value>${COSMOSDB_URI}</value>
                </property> 
                <property>
                    <name>COSMOSDB_KEY</name>
                    <value>${COSMOSDB_KEY}</value>
                </property>
                <property>
                    <name>COSMOSDB_DBNAME</name>
                    <value>${COSMOSDB_DBNAME}</value>
                </property>
                <property>
                    <name>JAVA_OPTS</name>
                    <value>-Dserver.port=80</value>
                </property>
            </appSettings>

        </configuration>
    </plugin>           
    ...
</plugins>

Implementación en App Service en Linux

Use el objetivo mvn azure-webapp:deploy de Maven para implementar la aplicación de tareas pendientes en Azure App Service en Linux.


# Deploy
bash-3.2$ mvn azure-webapp:deploy
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-webapp-maven-plugin:2.5.0:deploy (default-cli) @ spring-todo-app ---
Auth Type: AZURE_CLI
Default subscription: xxxxxxxxx
Username: xxxxxxxxx
[INFO] Subscription: xxxxxxxxx
[INFO] Creating App Service Plan 'ServicePlanb6ba8178-5bbb-49e7'...
[INFO] Successfully created App Service Plan.
[INFO] Creating web App spring-todo-app...
[INFO] Successfully created Web App spring-todo-app.
[INFO] Trying to deploy artifact to spring-todo-app...
[INFO] Successfully deployed the artifact to https://spring-todo-app.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:19 min
[INFO] Finished at: 2019-11-06T15:32:03-07:00
[INFO] Final Memory: 50M/574M
[INFO] ------------------------------------------------------------------------

La salida incluye la dirección URL de la aplicación implementada (en este ejemplo, https://spring-todo-app.azurewebsites.net). Puede copiar esta dirección URL en el explorador web o ejecutar el comando siguiente en la ventana de terminal para cargar la aplicación.

explorer https://spring-todo-app.azurewebsites.net

Debería ver que la aplicación se ejecuta con la dirección URL remota en la barra de direcciones:

La aplicación Spring Boot se ejecuta con una dirección URL remota

Transmisión de registros de diagnóstico

Para acceder a los registros de la consola generados desde el código de la aplicación en App Service, active el registro de diagnósticos, para lo que debe ejecutar el siguiente comando en Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

Los valores posibles de --level son: Error, Warning, Info y Verbose. Todos los niveles incluyen el nivel anterior. Por ejemplo: Error incluye solo los mensajes de error, mientras que Verbose incluye todos los mensajes.

Una vez que se activa el registro de contenedor, ejecute el siguiente comando para ver la transmisión del registro:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

Si no ve los registros de la consola de inmediato, vuelve a comprobarlo en 30 segundos.

Nota

También puede inspeccionar los archivos de registro desde el explorador en https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Para detener el streaming del registro en cualquier momento, escriba Ctrl+C.

Escalado horizontal de la aplicación de tareas pendientes

Para agregar otro trabajo, escale horizontalmente la aplicación:

az appservice plan update --number-of-workers 2 \
   --name ${WEBAPP_PLAN_NAME} \
   --resource-group <your-azure-group-name>

Limpieza de recursos

Si no necesita estos recursos para otro tutorial (consulte Pasos siguientes), ejecute el siguiente comando para eliminarlos en Cloud Shell:

az group delete --name <your-azure-group-name> --yes

Pasos siguientes

Azure para desarrolladores de Java, Spring Boot, Spring Data para Azure Cosmos DB, Azure Cosmos DB y App Service en Linux.

Más información acerca de la ejecución de aplicaciones de Java en App Service en Linux en la guía del desarrollador.

Obtenga información sobre cómo proteger la aplicación con un dominio personalizado y un certificado.