Distribuera en Spring-app till App Service med MySQL

Kommentar

För Spring-program rekommenderar vi att du använder Azure Spring Apps. Du kan dock fortfarande använda Azure App Service som mål. Mer information finns i Välj rätt Azure-tjänster för dina Java-program.

Den här självstudien vägleder dig genom processen att skapa, konfigurera, distribuera, felsöka och skala Java-webbappar i Azure App Service Linux.

Den här självstudien bygger på den populära exempelappen Spring PetClinic. I det här avsnittet ska du testa en HSQLDB-version av appen lokalt och sedan distribuera den till Azure App Service. Därefter konfigurerar och distribuerar du en version som använder Azure Database for MySQL. Slutligen får du lära dig att komma åt apploggarna och skala ut genom att öka antalet arbetare som kör din app.

Förutsättningar

Hämta exemplet

Kom igång med exempelappen genom att klona och förbereda källagringsplatsen med hjälp av följande kommandon.

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

Skapa och kör HSQLDB-exemplet lokalt

Först testar vi exemplet lokalt med hjälp av HSQLDB som databas.

Skapa HSQLDB-versionen av exempelappen.

mvn package

Ange sedan miljövariabeln TOMCAT_HOME till platsen för din Tomcat-installation.

export TOMCAT_HOME=<Tomcat install directory>

Uppdatera sedan pom.xml fil för distribution av WAR-filen. Lägg till följande XML som underordnat det befintliga <plugins>-elementet. Om det behövs ändrar du 1.9.11 till den aktuella versionen av plugin-programmet 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>

Med den här konfigurationen på plats kan du distribuera appen lokalt till Tomcat.

mvn cargo:deploy

Starta sedan Tomcat.

${TOMCAT_HOME}/bin/catalina.sh run

I webbläsaren kan du nu gå till http://localhost:8080 för att se appen som körs och få en känsla för hur den fungerar. När du är klar väljer du Ctrl+C i Bash-prompten för att stoppa Tomcat.

Distribuera till Azure App Service

Nu när du har sett att den köras lokalt distribuerar vi appen till Azure.

Först anger du följande miljövariabler. För REGION, använd West US 2 eller andra regioner som du hittar här.

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

Maven kommer använda dessa värden för att skapa Azure-resurser med de namn du anger. Genom att använda miljövariabler kan du hålla dina kontohemligheter borta från dina projektfiler.

Uppdatera därefter pom.xml-filen för att konfigurera Maven för en Tomcat WAR-fildistribution. Lägg till följande XML efter det <plugin>-element som du lade till tidigare. Vid behov ändrar du 2.5.0 till den aktuella versionen av Maven-pluginet för 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>

Därefter loggar du in på Azure.

az login

Distribuera sedan appen till App Service Linux.

mvn azure-webapp:deploy

Nu kan du navigera till https://<app-name>.azurewebsites.net (när du har bytt ut <app-name>) för att se appen som körs.

Konfigurera Azure Database for MySQL

Nu ska vi växla till att använda MySQL i stället för HSQLDB. Vi skapar en MySQL-serverinstans på Azure och lägger till en databas. Därefter uppdaterar vi appkonfigurationen med den nya anslutningsinformationen för databasen.

Först anger du följande miljövariabler för användning i senare steg.

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

Därefter skapar och initierar du databasservern. Använd az mysql up för den inledande konfigurationen. Använd därefter az mysql server configuration set för att öka tidsgränsen för anslutningen och ange serverns tidszon.

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

Använd sedan MySQL CLI för att ansluta till din databas i Azure.

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

I MySQL CLI-prompten kör du följande kommando för att verifiera databasen med samma värde som du angav tidigare för MYSQL_DATABASE_NAME miljövariabeln.

show databases;

MySQL är nu redo att användas.

Konfigurera appen för MySQL

Härnäst ska vi lägga till anslutningsinformationen till MySQL-versionen av appen distribuera den till App Service.

Uppdatera pom.xml-filen för att göra MySQL till den aktiva konfigurationen. Ta bort elementet <activation> från H2-profilen och placera det i MySQL-profilen i stället, som du ser här. Resten av kodfragmentet visar den befintliga konfigurationen. Observera att de miljövariabler som du angav tidigare används av Maven för att konfigurera MySQL-åtkomst.

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

Uppdatera därefter pom.xml-filen för att konfigurera Maven för en Azure-distribution och för MySQL-användning. Lägg till följande XML efter det <plugin>-element som du lade till tidigare. Vid behov ändrar du 2.5.0 till den aktuella versionen av Maven-pluginet för 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>

Därefter skapar du appen och testar den lokalt genom att distribuera och köra den med Tomcat.

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

Nu kan du visa appen lokalt på http://localhost:8080. Appen kommer att se ut och beter sig på samma sätt som förut, men använder Azure Database for MySQL i stället för HSQLDB. När du är klar väljer du Ctrl+C i Bash-prompten för att stoppa Tomcat.

Slutligen distribuerar du appen till App Service.

mvn azure-webapp:deploy

Nu kan du gå till https://<app-name>.azurewebsites.net för att se appen som körs med App Service och Azure Database for MySQL.

Åtkomst till apploggarna

Om du behöver felsöka kan du titta på apploggarna. Använd följande kommando för att öppna fjärrloggströmmen på den lokala datorn.

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

När du är klar med att visa loggarna väljer du Ctrl+C för att stoppa strömmen.

Loggdataströmmen finns också på https://<app-name>.scm.azurewebsites.net/api/logstream.

Skala ut

För att stödja ökad trafik till din app kan du skala ut till flera instanser med hjälp av följande kommando.

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

Grattis! Du har skapat och skalat ut en Java-webbapp med Spring-ramverket, JSP, Spring Data, Hibernate, JDBC, App Service Linux och Azure Database for MySQL.

Rensa resurser

I de föregående stegen skapade du Azure-resurser i en resursgrupp. Om du inte tror att du kommer använda dessa resurser i framtiden tar du bort resursgruppen genom att köra följande kommando.

az group delete --name ${RESOURCEGROUP_NAME}

Nästa steg

Kolla sedan den andra alternativen för konfiguration och CI/CD som finns tillgängliga för Java med App Service.