Implantar um aplicativo Spring no Serviço de Aplicativo com o MySQL

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

Este tutorial explica o processo de criação, configuração, implantação, solução de problemas e dimensionamento de aplicativos Web do Java no Serviço de Aplicativo no Linux.

Este tutorial se baseia no conhecido aplicativo de exemplo Spring PetClinic. Neste tópico, você testará uma versão HSQLDB do aplicativo localmente e a implantará 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á a acessar os logs do aplicativo e expandir aumentando o número de trabalhadores executando seu aplicativo.

Pré-requisitos

Obter o exemplo

Para começar a usar o aplicativo de exemplo, clone e prepare o repositório de origem usando os comandos a seguir.

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

Criar e executar o exemplo HSQLDB localmente

Primeiro, testaremos o exemplo localmente usando o 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 com o local da instalação do Tomcat.

export TOMCAT_HOME=<Tomcat install directory>

Em seguida, atualize o arquivo pom.xml para implantar o arquivo WAR. Adicione o XML a seguir como filho do elemento <plugins>. Caso seja necessário, altere 1.9.11 para a versão atual do Plug-in Maven Cargo 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 essa configuração em vigor, você pode implantar o aplicativo localmente no Tomcat.

mvn cargo:deploy

Em seguida, inicie o Tomcat.

${TOMCAT_HOME}/bin/catalina.sh run

Agora você pode acessar no navegador http://localhost:8080 para ver tanto o aplicativo em execução quanto o funcionamento dele. Quando terminar, selecione Ctrl+C no prompt Bash para parar o Tomcat.

Implantar no Serviço de Aplicativo do Azure

Agora que você o viu em execução localmente, implantaremos o aplicativo no Azure.

Primeiro, defina as variáveis de ambiente a seguir. Para REGION, use West US 2 ou outras regiões que 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 usará esses valores para criar os recursos do Azure com os nomes que você fornecer. Usando variáveis de ambiente, você pode manter os segredos da sua conta fora dos arquivos de projeto.

Em seguida, atualize o arquivo pom.xml para configurar o Maven para uma implantação do Azure. Adicione o XML a seguir após o elemento <plugin> que você adicionou anteriormente. Se necessário, altere 2.5.0 para a versão atual do Plug-in do Maven para o Serviço de Aplicativo do Azure.

<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, entre no Azure.

az login

Então, implante o aplicativo no Serviço de Aplicativo do Linux.

mvn azure-webapp:deploy

Agora você pode navegar até https://<app-name>.azurewebsites.net (após a substituição de <app-name>) para ver o aplicativo em execução.

Configurar o Banco de Dados do Azure para MySQL

Em seguida, mudaremos para o MySQL em vez do HSQLDB. Criaremos uma instância do servidor do MySQL no Azure e adicionaremos um banco de dados. Em seguida, atualizaremos a configuração do aplicativo com as novas informações de conexão de banco de dados.

Primeiro, defina as variáveis de ambiente a seguir para uso em etapas 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 banco de dados. Use az mysql up para a configuração inicial. Em seguida, use az mysql server configuration set para aumentar o tempo limite da conexã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 conectar-se a 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 comando a seguir para verificar seu banco de dados nomeado com o mesmo valor especificado anteriormente para a variável de ambiente MYSQL_DATABASE_NAME.

show databases;

O MySQL agora está pronto para uso.

Configurar o aplicativo para o MySQL

Em seguida, adicionaremos as informações de conexão à versão do MySQL do aplicativo e a implantaremos no Serviço de Aplicativo.

Atualize o arquivo pom.xml para tornar o MySQL a configuração ativa. Remova o elemento <activation> do perfil H2 e coloque-o no perfil MySQL, como é mostrado aqui. O restante do snippet de código mostra a configuração existente. Observe como as variáveis de ambiente definidas anteriormente são usadas pelo Maven para configurar o acesso do 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 arquivo pom.xml para configurar o Maven para uma implantação do Azure e para uso do MySQL. Adicione o XML a seguir após o elemento <plugin> que você adicionou anteriormente. Se necessário, altere 2.5.0 para a versão atual do Plug-in do Maven para o Serviço de Aplicativo do Azure.

<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, compile o aplicativo e teste-o localmente implantando e executando com o Tomcat.

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

Agora você pode ver o aplicativo localmente em http://localhost:8080. O aplicativo terá a mesma aparência e se comportará da mesma forma que antes, mas usando o Banco de Dados do Azure para MySQL em vez do HSQLDB. Quando terminar, selecione Ctrl+C no prompt Bash para parar o Tomcat.

Por fim, implante o aplicativo no Serviço de Aplicativo.

mvn azure-webapp:deploy

Agora você pode navegar até https://<app-name>.azurewebsites.net para ver o aplicativo em execução usando o Serviço de Aplicativo e o Banco de Dados do Azure para MySQL.

Acessar os logs de aplicativo

Se precisar solucionar problemas, você poderá examinar os logs de aplicativo. Para abrir o fluxo de log remoto em seu computador local, use o comando a seguir.

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 log também está disponível em https://<app-name>.scm.azurewebsites.net/api/logstream.

Escalar horizontalmente

Para oferecer suporte a um maior tráfego em seu aplicativo, você pode escalar horizontalmente para várias instâncias usando o comando a seguir.

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

Parabéns! Você criou e expandiu um aplicativo Web Java usando o Spring Framework, o JSP, o Spring Data, o Hibernate, o JDBC, o Serviço de Aplicativo do Linux e o Banco de Dados do Azure para MySQL.

Limpar os recursos

Nas seções anteriores, você criou recursos do Azure em um grupo de recursos. Se você acha que não precisará usar esses recursos no futuro, exclua o grupo de recursos executando o comando a seguir.

az group delete --name ${RESOURCEGROUP_NAME}

Próximas etapas

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