Tutorial: Compilar um aplicativo Web do Spring Boot Java com o Serviço de Aplicativo do Azure no Linux e o Azure Cosmos DB

Observação

Para aplicativos Spring, é recomendável usar o Aplicativos Spring do Azure. No entanto, você ainda pode usar o Serviço de Aplicativo do Azure como um destino. Consulte Diretrizes de Destino da Carga de Trabalho Java para obter orientação.

Este tutorial orienta você pelo processo de criar, configurar, implantar e dimensionar aplicativos Web Java no Azure. Quando tiver terminado, você terá um aplicativo Spring Boot armazenando dados no Azure Cosmos DB em execução em Serviço de Aplicativo do Azure no Linux.

Aplicativo Spring Boot armazenando dados no Azure Cosmos DB

Neste tutorial, você aprenderá como:

  • Crie um banco de dados do Azure Cosmos DB.
  • Conectar um aplicativo de exemplo ao banco de dados e testá-lo localmente
  • Implantar o aplicativo de exemplo no Azure
  • Logs de diagnóstico do fluxo do Serviço de Aplicativo
  • Adicionar instâncias extras para escalar horizontalmente o aplicativo de exemplo

Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

Clonar o aplicativo TODO de exemplo e preparar o repositório

Este tutorial usa um aplicativo de listas TODO de exemplo com uma interface do usuário Web que chama uma API REST do Spring apoiada pelo Spring Data para Azure Cosmos DB. O código para o aplicativo está disponível no GitHub. Para saber mais sobre como escrever aplicativos Java usando o Spring e o Azure Cosmos DB, confira Iniciador do Spring Boot com o tutorial do Azure Cosmos DB for NoSQL e o Início rápido do Azure Cosmos DB do Spring Data.

Execute os seguintes comandos no seu terminal para clonar o repositório de exemplo e configurar o ambiente de aplicativo de exemplo.

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/* .

Criar um Azure Cosmos DB

Siga estas etapas para criar um banco de dados do Azure Cosmos DB em sua assinatura. O aplicativo de lista TODO vai se conectar a esse banco de dados e armazenar seus dados durante a execução, mantendo o estado do aplicativo, não importa em que local você executa o aplicativo.

  1. Faça logon da sua CLI do Azure e, opcionalmente, configure sua assinatura se tiver mais de um usuário conectado às suas credenciais de logon.

    az login
    az account set -s <your-subscription-id>
    
  2. Crie um Grupo de Recursos do Azure observando o nome do grupo de recursos.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Criar Azure Cosmos DB com o tipo GlobalDocumentDB. O nome da instância do Azure Cosmos DB deve usar apenas letras minúsculas. Anote o campo documentEndpoint na resposta do comando.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Obtenha sua chave do Azure Cosmos DB para se conectar ao aplicativo. Mantenha o primaryMasterKey e o documentEndpoint próximos, pois você precisará deles na próxima etapa.

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

Configurar as propriedades do aplicativo TODO

Abra um terminal no seu computador. Copie o arquivo de script de exemplo no repositório clonado para que você possa personalizá-lo para o banco de dados do Azure Cosmos DB criado recentemente.

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

Edite .scripts/set-env-variables.sh em seu editor favorito e forneça informações de conexão do Azure Cosmos DB. Para a configuração do Serviço de Aplicativo do Linux, use a mesma região de antes (your-resource-group-region) e o grupo de recursos (your-azure-group-name) usado ao criar o banco de dados do Azure Cosmos DB. Escolha um WEBAPP_NAME exclusivo, pois ele não pode duplicar nenhum nome do aplicativo Web em nenhuma implantação do 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>

Em seguida, execute o script:

source .scripts/set-env-variables.sh

Essas variáveis de ambiente são usadas em application.properties no aplicativo de lista TODO. Os campos no arquivo de propriedades definem uma configuração de repositório padrão para o 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> {
}

Em seguida, o aplicativo de exemplo usa a anotação @Document importada de com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document para configurar um tipo de entidade a ser armazenado e gerenciado pelo Azure Cosmos DB:

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

Executar o aplicativo de exemplo

Use o Maven para executar o exemplo.

mvn package spring-boot:run

A saída deve parecer com o seguinte.

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)

Você pode acessar o Aplicativo Spring TODO localmente depois que o aplicativo for iniciado usando este link: http://localhost:8080/.

Acessar o aplicativo Spring TODO localmente

Se você vir exceções em vez da mensagem "TodoApplication iniciado", verifique se o script bash na etapa anterior exportou as variáveis de ambiente corretamente e se os valores estão corretos para o banco de dados do Azure Cosmos DB que você criou.

Configurar a implantação do Azure

Abra o arquivo pom.xml no diretório initial/spring-boot-todo e adicione a configuração a seguir do Plug-in do Aplicativo Web do Azure para Maven.

<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>

Implantar no Serviço de Aplicativo no Linux

Use a meta mvn azure-webapp:deploy do Maven para implantar o aplicativo TODO no Serviço de Aplicativo do Azure no 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] ------------------------------------------------------------------------

A saída contém a URL para seu aplicativo implantado (neste exemplo, https://spring-todo-app.azurewebsites.net). Você pode copiar essa URL no navegador da Web ou executar o seguinte comando na janela do Terminal para carregar seu aplicativo.

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

Você deve ver o aplicativo em execução com a URL remota na barra de endereços:

Aplicativo Spring Boot em execução com uma URL remota

Logs de diagnóstico de fluxo

Para acessar os logs de console gerados dentro do código do aplicativo no Serviço de Aplicativo, ative o log de diagnóstico executando o seguinte comando no Cloud Shell:

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

Os valores possíveis para --level são Error, Warning, Info e Verbose. Cada nível seguinte inclui o anterior. Por exemplo: Error inclui apenas mensagens de erro e Verbose inclui todas as mensagens.

Depois que o log de diagnósticos estiver ativado, execute o seguinte comando para ver o fluxo de logs:

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

Se você não vir os logs do console imediatamente, verifique novamente após 30 segundos.

Observação

Você também pode inspecionar os arquivos de log do navegador em https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Para interromper o streaming de log a qualquer momento, digite Ctrl+C.

Escalar horizontalmente o aplicativo TODO

Expanda o aplicativo adicionando outro trabalho:

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

Limpar os recursos

Se não precisar desses recursos para outro tutorial (consulte Próximas etapas), você poderá excluí-los executando o seguinte comando no Cloud Shell:

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

Próximas etapas

Azure para Desenvolvedores JavaSpring Boot, Spring Data para Azure Cosmos DB, Azure Cosmos DB e Serviço de Aplicativo no Linux.

Saiba mais sobre como executar aplicativos Java no Serviço de Aplicativo no Linux no guia do desenvolvedor.

Saiba como proteger seu aplicativo com um domínio e um certificado personalizados.