Een Spring-app implementeren in App Service met MySQL

Notitie

Voor Spring-toepassingen wordt u aangeraden Azure Spring Apps te gebruiken. U kunt echter nog steeds Azure-app Service als bestemming gebruiken. Zie De juiste Azure-services voor uw Java-toepassingen kiezen voor meer informatie.

In deze zelfstudie worden de ontwikkeling, configuratie, implementatie, probleemoplossing en schaling van Java-web-apps in App Service Linux stapsgewijs besproken.

In deze zelfstudie wordt gebruikgemaakt van de populaire Spring PetClinic-voorbeeld-app. In dit onderwerp test u een HSQLDB-versie van de app lokaal en implementeert u deze vervolgens in Azure-app Service. Daarna configureert en implementeert u een versie die gebruikmaakt van Azure Database for MySQL. Ten slotte leert u hoe u toegang krijgt tot de app-logboeken en uitschaalt door het aantal werkrollen dat uw app uitvoert te verhogen.

Vereisten

Het voorbeeld ophalen

Om aan de slag te gaan met de voorbeeld-app moet u de bronopslagplaats klonen en voorbereiden met de volgende opdrachten.

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

Het HSQLDB-voorbeeld ontwikkelen en lokaal uitvoeren

Eerst testen we het voorbeeld lokaal met behulp van HSQLDB als de database.

Bouw de HSQLDB-versie van de voorbeeld-app.

mvn package

Stel vervolgens de TOMCAT_HOME-omgevingsvariabele in op de locatie van uw Tomcat-installatie.

export TOMCAT_HOME=<Tomcat install directory>

Werk vervolgens pom.xml bestand bij voor het implementeren van het WAR-bestand. Voeg de volgende XML toe als een onderliggend element van het bestaande element <plugins>. Wijzig indien nodig 1.9.11 de huidige versie van de Cargo Maven 3-invoegtoepassing.

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

Als deze configuratie tot stand is gebracht, kunt u de app lokaal implementeren in Tomcat.

mvn cargo:deploy

Start vervolgens Tomcat.

${TOMCAT_HOME}/bin/catalina.sh run

U kunt nu in uw browser navigeren naar http://localhost:8080 om de actieve app te bekijken en te zien hoe deze werkt. Wanneer u klaar bent, selecteert u Ctrl+C bij de Bash-prompt om Tomcat te stoppen.

Implementeren naar Azure App Service

Nu u hebt gezien hoe de app lokaal wordt uitgevoerd, implementeren we deze in Azure.

Stel eerst de volgende omgevingsvariabelen in. Voor REGION, gebruik West US 2 of andere regio's die u hier kunt vinden.

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

Maven gebruikt deze waarden om de Azure-resources te maken met de namen die u opgeeft. Met behulp van omgevingsvariabelen kunt u uw accountgeheimen uit uw projectbestanden houden.

Werk vervolgens het bestand pom.xml bij om Maven te configureren voor een Azure-implementatie. Voeg de volgende XML-code toe na het <plugin>-element dat u eerder hebt toegevoegd. Wijzig zo nodig 2.5.0 in de huidige versie van de Maven-invoegtoepassing voor 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>

Meld u daarna aan bij Azure.

az login

Implementeer vervolgens de app in App Service Linux.

mvn azure-webapp:deploy

U kunt nu naar https://<app-name>.azurewebsites.net navigeren (nadat u <app-name> hebt vervangen) om de actieve app te bekijken.

Azure Database for MySQL instellen

Vervolgens gaan we MySQL gebruiken in plaats van HSQLDB. We maken een MySQL-serverinstantie in Azure en voegen een database toe. Vervolgens werken we de app-configuratie bij met de verbindingsgegevens van de nieuwe database.

Stel eerst de volgende omgevingsvariabelen in zodat u deze in latere stappen kunt gebruiken.

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

Maak daarna de databaseserver en initialiseer deze. Gebruik az mysql up voor de eerste configuratie. Gebruik vervolgens az mysql server configuration set om de time-out voor de verbinding te verhogen en de tijdzone voor de server in te stellen.

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

Gebruik vervolgens de MySQL CLI om verbinding te maken met uw database in Azure.

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

Voer bij de MySQL CLI-prompt de volgende opdracht uit om de database te controleren met dezelfde waarde die u eerder hebt opgegeven voor de MYSQL_DATABASE_NAME omgevingsvariabele.

show databases;

MySQL is nu klaar voor gebruik.

De app voor MySQL configureren

Vervolgens voegen we de verbindingsgegevens toe aan de MySQL-versie van de app en implementeren we deze vervolgens in App Service.

Werk het pom.xml-bestand bij om MySQL de actieve configuratie te maken. Verwijder het <activation> element uit het H2-profiel en plaats het in het MySQL-profiel, zoals hier wordt weergegeven. In de rest van het fragment wordt de bestaande configuratie weergegeven. De omgevingsvariabelen die u eerder hebt ingesteld, worden door Maven gebruikt voor het configureren van uw MySQL-toegang.

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

Werk vervolgens het bestand pom.xml bij om Maven te configureren voor een Azure-implementatie en voor gebruik van MySQL. Voeg de volgende XML-code toe na het <plugin>-element dat u eerder hebt toegevoegd. Wijzig zo nodig 2.5.0 in de huidige versie van de Maven-invoegtoepassing voor 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>

Vervolgens ontwikkelt u de app en test u deze lokaal door de app met Tomcat te implementeren en uit te voeren.

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

U kunt de app nu lokaal weergeven op http://localhost:8080. De app heeft hetzelfde uiterlijk en gedrag als voorheen, maar maakt gebruik van Azure Database for MySQL in plaats van HSQLDB. Wanneer u klaar bent, selecteert u Ctrl+C bij de Bash-prompt om Tomcat te stoppen.

Implementeer ten slotte de app in App Service.

mvn azure-webapp:deploy

U kunt nu naar https://<app-name>.azurewebsites.net navigeren om de actieve app te bekijken met behulp van App Service en Azure Database for MySQL.

Toegang verkrijgen tot de app-logboeken

Als u problemen moet oplossen, kunt u de logboeken van de app bekijken. Gebruik de volgende opdracht om de externe logboekstroom op uw lokale computer te openen.

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

Wanneer u klaar bent met het weergeven van de logboeken, selecteert u Ctrl+C om de stroom te stoppen.

De logboekstroom is ook beschikbaar op https://<app-name>.scm.azurewebsites.net/api/logstream.

Uitschalen

Als u meer verkeer naar uw app mogelijk wilt maken, kunt u uitschalen naar meerdere instanties met behulp van de volgende opdracht.

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

Gefeliciteerd U hebt een Java-web-app ontwikkeld en uitgeschaald met behulp van Spring Framework, JSP, Spring Data, Hibernate, JDBC, App Service Linux en Azure Database for MySQL.

Resources opschonen

In de voorgaande secties hebt u Azure-resources in een resourcegroep gemaakt. Als u denkt dat u deze resources niet meer gaat gebruiken, verwijdert u de resourcegroep door de volgende opdracht uit te voeren.

az group delete --name ${RESOURCEGROUP_NAME}

Volgende stappen

Bekijk vervolgens de andere configuratie- en CI/CD-opties die voor Java met App Service beschikbaar zijn.