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

Nota

Para aplicativos Spring, recomendamos o uso do Azure Spring Apps. No entanto, você ainda pode usar o Serviço de Aplicativo do Azure como destino. Consulte Java Workload Destination Guidance para obter conselhos.

Este tutorial orienta você pelo processo de criação, configuração, implantação e dimensionamento de aplicativos Web Java no Azure. Quando terminar, você terá um aplicativo Spring Boot armazenando dados no Azure Cosmos DB em execução no Serviço de Aplicativo do Azure no Linux.

Aplicativo Spring Boot armazenando dados no Azure Cosmos DB

Neste tutorial, irá aprender a:

  • Crie uma base 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
  • Transmitir logs de diagnóstico do Serviço de Aplicativo
  • Adicionar instâncias adicionais para expandir o aplicativo de exemplo

Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.

Pré-requisitos

Clone o aplicativo TODO de exemplo e prepare o repositório

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

Execute os seguintes comandos em seu terminal para clonar o repositório de exemplo e configurar o ambiente do 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 uma base de dados do Azure Cosmos DB

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

  1. Inicie sessão na sua CLI do Azure e, opcionalmente, defina a sua subscrição se tiver mais do que uma ligada às suas credenciais de início de sessão.

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

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Crie o Azure Cosmos DB com o GlobalDocumentDB tipo. O nome da instância do Azure Cosmos DB deve usar apenas letras minúsculas. Anote o documentEndpoint campo 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 , documentEndpoint por perto, primaryMasterKeypois 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 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 que você acabou de criar.

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 Azure Cosmos DB. Para a configuração Linux do Serviço de Aplicativo, use a mesma região anterior (your-resource-group-region) e o grupo de recursos (your-azure-group-name) usados ao criar o banco de dados do Azure Cosmos DB. Escolha um WEBAPP_NAME que seja exclusivo, pois ele não pode duplicar nenhum nome de 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 no application.properties aplicativo de lista TODO. Os campos no arquivo de propriedades configuram 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 @Document anotação importada para configurar um tipo de com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document 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;

Execute a aplicação de exemplo

Use o Maven para executar o exemplo.

mvn package spring-boot:run

A saída deve ser semelhante à 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 Spring TODO App localmente usando este link assim que o aplicativo for iniciado: http://localhost:8080/.

Aceda à aplicação Spring TODO localmente

Se você vir exceções em vez da mensagem "Iniciado TodoApplication", verifique se o bash script 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 implementação do Azure

Abra o pom.xmlinitial/spring-boot-todo arquivo no diretório e adicione o seguinte Plug-in do Aplicativo Web do Azure para configuração do 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 mvn azure-webapp:deploy meta 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). Pode copiar este URL para o seu browser ou executar o seguinte comando na janela do Terminal para carregar a sua aplicação.

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

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

Aplicação Spring Boot em execução com um URL remoto

Transmitir registos de diagnóstico em fluxo

Para aceder aos registos da consola gerados a partir do código da sua aplicação no Serviço de Aplicações, ative o registo de diagnósticos ao executar 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 subsequente inclui o nível anterior. Por exemplo: Error inclui apenas mensagens de erro e Verbose inclui todas as mensagens.

Depois de ativar o registo de diagnósticos, execute o seguinte comando para ver o fluxo de registos:

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

Se não vir os registos da consola imediatamente, volte a consultar dentro de 30 segundos.

Nota

Também pode inspecionar os ficheiros de registo no browser em https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Para parar a transmissão de registos em qualquer altura, escreva Ctrl+C.

Dimensionar o aplicativo TODO

Dimensione o aplicativo adicionando outro trabalhador:

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

Clean up resources (Limpar recursos)

Se não precisar destes recursos para outro tutorial (veja os Passos seguintes), pode eliminá-los ao executar o seguinte comando no Cloud Shell:

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

Próximos passos

Azure para desenvolvedoresJava Spring Boot, Spring Data para Azure Cosmos DB, Azure Cosmos DB e Serviço de Aplicativo 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.