Implementar uma aplicação Spring no Serviço de Aplicações com o MySQL

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. Para obter mais informações, consulte Escolher os serviços do Azure certos para seus aplicativos Java.

Este tutorial guia-o ao longo do processo de criação, configuração, implementação, resolução de problemas e dimensionamento de aplicações Web Java no Serviço de Aplicações do Linux.

Este tutorial baseia-se no popular exemplo de aplicação Spring PetClinic. Neste tópico, você testará uma versão HSQLDB do aplicativo localmente e, em seguida, implantá-la-á no Serviço de Aplicativo do Azure. Depois disso, você configurará e implantará uma versão que usa o Banco de Dados do Azure para MySQL. Por fim, você aprenderá como acessar os logs do aplicativo e dimensioná-los aumentando o número de trabalhadores executando seu aplicativo.

Pré-requisitos

Obter o exemplo de aplicação

Para começar a utilizar o exemplo de aplicação, clone e prepare o repositório de origem com recurso aos seguintes comandos.

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

Criar e executar localmente a versão HSQLDB do exemplo de aplicação

Primeiro, testaremos o exemplo localmente usando HSQLDB como banco de dados.

Crie a versão HSQLDB do aplicativo de exemplo.

mvn package

Em seguida, defina a variável de ambiente TOMCAT_HOME como a localização da sua instalação do Tomcat.

export TOMCAT_HOME=<Tomcat install directory>

Em seguida, atualize pom.xml arquivo para implantar o arquivo WAR. Adicione o seguinte XML como elemento subordinado do elemento <plugins> já existente. Se necessário, mude 1.9.11 para a versão atual do plug-in do 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>

Com esta configuração implementada, pode implementar a aplicação localmente no Tomcat.

mvn cargo:deploy

Em seguida, inicie o Tomcat.

${TOMCAT_HOME}/bin/catalina.sh run

Agora pode navegar no seu browser para http://localhost:8080 para ver a aplicação em execução e ter uma ideia de como esta funciona. Quando terminar, selecione Ctrl+C no prompt Bash para parar o Tomcat.

Implementar no Serviço de Aplicações do Azure

Agora que viu a aplicação a funcionar localmente, vamos implementá-la no Azure.

Em primeiro lugar, defina as seguintes variáveis de ambiente. Para REGION, use West US 2 ou outras regiões você pode encontrar aqui.

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

O Maven utilizará estes valores para criar os recursos do Azure com os nomes que fornecer. Ao utilizar variáveis de ambiente, pode manter os segredos da sua conta fora dos ficheiros do seu projeto.

Em seguida, atualize o ficheiro pom.xml para configurar o Maven para uma implementação do Azure. Adicione o seguinte XML após o elemento <plugin> que adicionou anteriormente. Se for necessário, mude 2.5.0 para a versão atual do Maven Plugin for 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>

Em seguida, inicie sessão no Azure.

az login

Depois, implemente a aplicação no Serviço de Aplicações do Linux.

mvn azure-webapp:deploy

Agora pode navegar para https://<app-name>.azurewebsites.net (depois de substituir <app-name>) para ver a aplicação em execução.

Configurar a Base de Dados do Azure para MySQL

Em seguida, vamos utilizar o MySQL em vez do HSQLDB. Vamos criar uma instância de servidor do MySQL no Azure, adicionar uma base de dados e atualizar a configuração da aplicação com as novas informações de ligação de dados.

Em primeiro lugar, defina as variáveis de ambiente seguintes para as utilizar em passos posteriores.

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=\$

Em seguida, crie e inicialize o servidor de base de dados. Utilize az mysql up para a configuração inicial. Em seguida, utilize az mysql server configuration set para aumentar o tempo limite de ligação e definir o fuso horário do 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

Em seguida, use a CLI do MySQL para se conectar ao seu banco de dados no Azure.

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

No prompt da CLI do MySQL, execute o seguinte comando para verificar seu banco de dados nomeado com o mesmo valor especificado anteriormente para a variável de MYSQL_DATABASE_NAME ambiente.

show databases;

O MySQL está agora pronto a utilizar.

Configurar a aplicação para o MySQL

Em seguida, vamos adicionar as informações de ligação à versão MySQL da aplicação e implementá-la no Serviço de Aplicações.

Atualize o arquivo pom.xml para tornar o MySQL a configuração ativa. Remova o <activation> elemento do perfil H2 e coloque-o no perfil MySQL, como mostrado aqui. O resto do fragmento mostra a configuração existente. Repare na forma como as variáveis de ambiente que definiu anteriormente são utilizadas pelo Maven para configurar o seu acesso ao 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>

Em seguida, atualize o ficheiro pom.xml para configurar o Maven para uma implementação do Azure e para a utilização do MySQL. Adicione o seguinte XML após o elemento <plugin> que adicionou anteriormente. Se for necessário, mude 2.5.0 para a versão atual do Maven Plugin for 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>

Em seguida, crie a aplicação e teste-a localmente ao implementá-la e executá-la com o Tomcat.

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

Agora pode ver a aplicação localmente em http://localhost:8080. A aplicação terá um aspeto igual ao que tinha anteriormente e comportar-se-á da mesma forma, mas utilizará a Base de Dados do Azure para MySQL em vez do HSQLDB. Quando terminar, selecione Ctrl+C no prompt Bash para parar o Tomcat.

Por fim, implemente a aplicação no Serviço de Aplicações.

mvn azure-webapp:deploy

Agora pode navegar para https://<app-name>.azurewebsites.net para ver a aplicação em execução com recurso ao Serviço de Aplicações e à Base de Dados do Azure para MySQL.

Aceder aos registos da aplicação

Se precisar de resolver problemas, pode ver os registos da aplicação. Para abrir o fluxo de registos remoto no seu computador local, utilize o seguinte comando.

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

Quando terminar de visualizar os logs, selecione Ctrl+C para interromper o fluxo.

O fluxo de registos também está disponível em https://<app-name>.scm.azurewebsites.net/api/logstream.

Aumentar horizontalmente

Para suportar o aumento do tráfego para a sua aplicação, pode aumentar horizontalmente para múltiplas instâncias com recurso ao seguinte comando.

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

Parabéns! Criou e ampliou uma aplicação Web Java com recurso ao Spring Framework, ao JSP, ao Spring Data, ao Hibernate, à JDBC, ao Serviço de Aplicações do Linux e à Base de Dados do Azure para MySQL.

Clean up resources (Limpar recursos)

Nas secções anteriores, criou os recursos do Azure num grupo de recursos. Se achar que não vai utilizar estes recursos no futuro, execute o seguinte comando para eliminar o grupo de recursos.

az group delete --name ${RESOURCEGROUP_NAME}

Próximos passos

Em seguida, veja as outras opções de configuração e CI/CD disponíveis para Java com o Serviço de Aplicações.