Bereitstellen einer Spring-App in App Service mit MySQL

Hinweis

Für Spring-Anwendungen empfehlen wir die Verwendung von Azure Spring Apps. Sie können jedoch weiterhin Azure-App Dienst als Ziel verwenden.

In diesem Tutorial erfahren Sie Schritt für Schritt, wie Sie Java-Web-Apps in App Service Linux erstellen, konfigurieren, bereitstellen, skalieren und Probleme behandeln.

Dieses Tutorial basiert auf der beliebten Beispiel-App „Spring PetClinic“. In diesem Thema testen Sie eine HSQLDB-Version der App lokal und stellen sie dann für Azure-App Dienst bereit. Danach konfigurieren und bereitstellen Sie eine Version, die Azure-Datenbank für MySQL verwendet. Schließlich erfahren Sie, wie Sie auf die App-Protokolle zugreifen und skalieren, indem Sie die Anzahl der Mitarbeiter erhöhen, die Ihre App ausführen.

Voraussetzungen

Abrufen des Beispiels

Für die ersten Schritte mit der Beispiel-App verwenden Sie folgenden Befehle, um das Quellrepository zu klonen und vorzubereiten.

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

Erstellen und lokales Ausführen des HSQLDB-Beispiels

Zuerst testen wir das Beispiel lokal mit HSQLDB als Datenbank.

Erstellen der HSQLDB-Version der Beispiel-App.

mvn package

Als nächstes legen Sie die Umgebungsvariable „TOMCAT_HOME“ auf den Speicherort Ihrer Tomcat-Installation fest.

export TOMCAT_HOME=<Tomcat install directory>

Aktualisieren Sie dann die Datei pom.xml für die Bereitstellung der WAR-Datei. Fügen Sie das folgende XML als untergeordnetes Element des vorhandenen <plugins>-Elements hinzu. Ändern Sie 1.9.11 ggf. in die aktuelle Version des Cargo Maven 3-Plug-Ins.

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

Mit dieser Konfiguration können Sie die App lokal in Tomcat bereitstellen.

mvn cargo:deploy

Starten Sie dann Tomcat.

${TOMCAT_HOME}/bin/catalina.sh run

Sie können nun in Ihrem Browser zu http://localhost:8080 navigieren, um die ausgeführte App in Aktion zu sehen und ein Gefühl dafür zu bekommen, wie sie funktioniert. Wenn Sie fertig sind, wählen Sie STRG+C an der Bash-Eingabeaufforderung aus, um Tomcat zu beenden.

Bereitstellen in Azure App Service

Nachdem Sie nun gesehen haben, wie sie lokal ausgeführt wird, stellen wir die App in Azure bereit.

Legen Sie zunächst die folgenden Umgebungsvariablen fest. Verwenden Sie für REGIONWest US 2 oder andere Regionen, die sie hier finden.

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

Maven verwendet diese Werte, um die Azure-Ressourcen mit den von Ihnen angegebenen Namen zu erstellen. Durch die Verwendung von Umgebungsvariablen können Sie Ihre Kontogeheimnisse aus Ihren Projektdateien heraushalten.

Aktualisieren Sie als nächstes die Datei pom.xml, um Maven für eine Azure-Bereitstellung zu konfigurieren. Fügen Sie nach dem zuvor hinzugefügten <plugin>-Element den folgenden XML-Code hinzu. Ändern Sie, falls notwendig, 2.5.0 in die aktuelle Version des Maven-Plug-Ins 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>

Als nächstes melden Sie sich bei Azure an.

az login

Stellen Sie dann die App für App Service Linux bereit.

mvn azure-webapp:deploy

Sie können jetzt zu https://<app-name>.azurewebsites.net navigieren (nachdem <app-name> ersetzt wurde), um die ausgeführte App anzuzeigen.

Einrichten von Azure Database for MySQL

Als nächstes wechseln wir zur Verwendung von MySQL anstelle von HSQLDB. Wir erstellen eine MySQL-Serverinstanz in Azure und fügen eine Datenbank hinzu. Dann aktualisieren wir die App-Konfiguration mit den neuen Datenbankverbindungsinformationen.

Legen Sie zunächst die folgenden Umgebungsvariablen zur Verwendung in späteren Schritten fest.

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

Erstellen Sie als nächstes den Datenbankserver, und initialisieren Sie ihn. Verwenden az mysql up für die Erstkonfiguration. Verwenden Sie dann az mysql server configuration set, um das Verbindungstimeout zu erhöhen und die Serverzeitzone festzulegen.

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

Verwenden Sie anschließend die MySQL-Befehlszeilenschnittstelle, um die Verbindung mit Ihrer Datenbank in Azure herzustellen.

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

Führen Sie an der MySQL-Befehlszeilenschnittstelle den folgenden Befehl aus, um zu überprüfen, ob Ihre Datenbank mit dem gleichen Wert benannt ist, den Sie zuvor für die Umgebungsvariable MYSQL_DATABASE_NAME angegeben haben.

show databases;

MySQL ist jetzt zur Verwendung bereit.

Konfigurieren der App für MySQL

Als Nächstes fügen wir die Verbindungsinformationen zur MySQL-Version der App hinzu und stellen Sie dann für App Service bereit.

Aktualisieren Sie die pom.xml-Datei, um MySQL zur aktiven Konfiguration zu machen. Entfernen Sie das <activation>-Element aus dem H2-Profil, und fügen Sie es stattdessen in das MySQL-Profil ein, wie hier gezeigt. Der Rest des Codeausschnitts zeigt die vorhandene Konfiguration. Beachten Sie, wie die zuvor festgelegten Umgebungsvariablen von Maven verwendet werden, um Ihren MySQL-Zugriff zu konfigurieren.

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

Aktualisieren Sie als nächstes die Datei pom.xml, um Maven für eine Azure-Bereitstellung und MySQL-Verwendung zu konfigurieren. Fügen Sie nach dem zuvor hinzugefügten <plugin>-Element den folgenden XML-Code hinzu. Ändern Sie, falls notwendig, 2.5.0 in die aktuelle Version des Maven-Plug-Ins 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>

Erstellen Sie als nächstes die App, und testen Sie Sie lokal, indem Sie sie mit Tomcat bereitstellen und ausführen.

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

Sie können die App jetzt lokal unter http://localhost:8080 anzeigen. Die App sieht aus und verhält sich wie zuvor, verwendet aber Azure Database for MySQL anstelle von HSQLDB. Wenn Sie fertig sind, wählen Sie STRG+C an der Bash-Eingabeaufforderung aus, um Tomcat zu beenden.

Stellen Sie die App schließlich in App Service bereit.

mvn azure-webapp:deploy

Sie können jetzt zu https://<app-name>.azurewebsites.net navigieren, um die ausgeführte App mit App Service und Azure Database for MySQL anzuzeigen.

Zugriff auf die App-Protokolle

Wenn Sie Probleme beheben müssen, können Sie sich die App-Protokolle ansehen. Verwenden Sie den folgenden Befehl, um den Remoteprotokollstream auf dem lokalen Computer zu öffnen.

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

Wenn Sie mit dem Anzeigen der Protokolle fertig sind, wählen Sie STRG+C aus, um den Datenstrom anzuhalten.

Der Protokollstream ist auch unter https://<app-name>.scm.azurewebsites.net/api/logstreamverfügbar.

Aufskalieren

Zur Bewältigung eines höheren Datenverkehrsaufkommens für Ihre App können Sie mithilfe des folgenden Befehls eine Aufskalierung auf mehrere Instanzen durchführen.

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

Herzlichen Glückwunsch! Sie haben eine Java-Web-App mit Spring Framework, JSP, Spring Data, Hibernate, JDBC, App Service Linux und Azure Database for MySQL erstellt erweitert.

Bereinigen von Ressourcen

In den vorherigen Abschnitten haben Sie Azure-Ressourcen in einer Ressourcengruppe erstellt. Wenn Sie diese Ressourcen voraussichtlich nicht mehr verwenden, löschen Sie die Ressourcengruppe, indem Sie den folgenden Befehl ausführen.

az group delete --name ${RESOURCEGROUP_NAME}

Nächste Schritte

Sehen Sie sich als nächstes die anderen Konfigurations- und CI/CD-Optionen an, die für Java mit App Service verfügbar sind.