Tutorial: Erstellen einer Java Spring Boot-Web-App mit Azure App Service für Linux und Azure Cosmos DB

Hinweis

Für Spring-Anwendungen wird die Verwendung von Azure Spring Apps empfohlen. Sie können Azure App Service jedoch weiterhin als Ziel verwenden. Weitere Informationen finden Sie unter Java-Workload-Zielleitfaden.

Dieses Tutorial führt Sie durch den Prozess der Kompilierung, Konfiguration, Bereitstellung und Skalierung Java-Web-Apps in Azure. Anschließend besitzen Sie eine Spring Boot-Anwendung, die Daten in Azure Cosmos DB speichert und mit Azure App Service unter Linux ausgeführt wird.

Spring Boot-Anwendung, die Daten in Azure Cosmos DB speichert

In diesem Tutorial lernen Sie, wie die folgenden Aufgaben ausgeführt werden:

  • Erstellen Sie eine Azure Cosmos DB-Datenbank.
  • Herstellen einer Verbindung zwischen einer Beispiel-App und der Datenbank und das lokale Testen
  • Bereitstellen der Beispiel-App in Azure
  • Streamen von Diagnoseprotokollen aus App Service
  • Hinzufügen zusätzlicher Instanzen zum Aufskalieren der Beispiel-App

Wenn Sie kein Azure-Abonnement haben, erstellen Sie ein kostenloses Azure-Konto, bevor Sie beginnen.

Voraussetzungen

Klonen der TODO-Beispiel-App und Vorbereiten des Repositorys

In diesem Tutorial wird eine TODO-Beispiel-Listen-App mit einer Web-Benutzeroberfläche verwendet, die eine Spring-REST-API aufruft, die durch Spring Data for Azure Cosmos DB unterstützt wird. Den Code für die App finden Sie auf GitHub. Weitere Informationen zum Schreiben von Java-Apps mit Spring und Azure Cosmos DB finden Sie im Tutorial zur Verwendung von Spring Boot Starter mit Azure Cosmos DB for NoSQL und im Schnellstart zu Spring Data for Azure Cosmos DB.

Führen Sie die folgenden Befehle in Ihrem Terminal aus, um das Beispielrepository zu klonen und die Beispiel-App-Umgebung einzurichten.

git clone --recurse-submodules https://github.com/Azure-Samples/e2e-java-experience-in-app-service-linux-part-2.git
cd e2e-java-experience-in-app-service-linux-part-2
yes | cp -rf .prep/* .

Erstellen einer Azure Cosmos DB-Instanz

Führen Sie diese Schritte aus, um eine Azure Cosmos DB-Datenbank in Ihrem Abonnement zu erstellen. Die TODO-Listen-App verbindet sich mit dieser Datenbank und speichert ihre Daten während der Ausführung, wobei der Anwendungszustand erhalten bleibt, unabhängig davon, wo Sie die Anwendung ausführen.

  1. Melden Sie sich bei der Azure CLI an, und legen Sie optional Ihr Abonnement fest, wenn Sie mehr als eines mit Ihren Anmeldeinformationen verbunden haben.

    az login
    az account set -s <your-subscription-id>
    
  2. Erstellen Sie eine Azure-Ressourcengruppe, und notieren Sie den Namen der Ressourcengruppe.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Erstellen Sie eine Azure Cosmos DB mit der Art GlobalDocumentDB. Der Name der Azure Cosmos DB-Instanz darf nur Kleinbuchstaben enthalten. Notieren Sie sich das Feld documentEndpoint in der Antwort des Befehls.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Rufen Sie Ihren Azure Cosmos DB-Schlüssel für die Verbindung zur App ab. Halten Sie die Werte für primaryMasterKey und documentEndpoint bereit, da Sie sie im nächsten Schritt brauchen.

    az cosmosdb keys list -g <your-azure-group-name> -n <your-azure-COSMOSDB-name>
    

Konfigurieren der TODO-App-Eigenschaften

Öffnen Sie ein Terminal auf Ihrem Computer. Kopieren Sie die Beispielskriptdatei in das geklonte Repository, damit Sie sie für Ihre gerade erstellte Azure Cosmos DB-Datenbank anpassen können.

cd initial/spring-todo-app
cp set-env-variables-template.sh .scripts/set-env-variables.sh

Bearbeiten Sie .scripts/set-env-variables.sh in Ihrem bevorzugten Editor, und stellen Sie die Azure Cosmos DB-Verbindungsinformationen bereit. Verwenden Sie für die App Service-Linux-Konfiguration die gleiche Region wie zuvor (your-resource-group-region) sowie die Ressourcengruppe (your-azure-group-name), die beim Erstellen der Azure Cosmos DB-Datenbank verwendet wurde. Wählen Sie einen eindeutigen WEBAPP_NAMEN, da er keinen Web-App-Namen in einer Azure-Bereitstellung duplizieren kann.

export COSMOSDB_URI=<put-your-COSMOS-DB-documentEndpoint-URI-here>
export COSMOSDB_KEY=<put-your-COSMOS-DB-primaryMasterKey-here>
export COSMOSDB_DBNAME=<put-your-COSMOS-DB-name-here>

# App Service Linux Configuration
export RESOURCEGROUP_NAME=<put-your-resource-group-name-here>
export WEBAPP_NAME=<put-your-Webapp-name-here>
export REGION=<put-your-REGION-here>

Führen Sie dann das Skript aus:

source .scripts/set-env-variables.sh

Diese Umgebungsvariablen werden in application.properties in der TODO-Listen-App verwendet. Die Felder in der Eigenschaftsdatei richten eine Standardrepositorykonfiguration für Spring Data ein:

azure.cosmosdb.uri=${COSMOSDB_URI}
azure.cosmosdb.key=${COSMOSDB_KEY}
azure.cosmosdb.database=${COSMOSDB_DBNAME}
@Repository
public interface TodoItemRepository extends DocumentDbRepository<TodoItem, String> {
}

Dann verwendet die Beispiel-App die aus com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document importierte @Document-Anmerkung, um einen Entitätstyp einzurichten, der von Azure Cosmos DB gespeichert und verwaltet wird:

@Document
public class TodoItem {
    private String id;
    private String description;
    private String owner;
    private boolean finished;

Ausführen der Beispiel-App

Verwenden Sie Maven, um das Beispiel auszuführen.

mvn package spring-boot:run

Die Ausgabe sollte wie im folgenden Beispiel aussehen.

bash-3.2$ mvn package spring-boot:run
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 


[INFO] SimpleUrlHandlerMapping - Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
[INFO] WelcomePageHandlerMapping - Adding welcome page: class path resource [static/index.html]
2018-10-28 15:04:32.101  INFO 7673 --- [           main] c.m.azure.documentdb.DocumentClient      : Initializing DocumentClient with serviceEndpoint [https://sample-cosmos-db-westus.documents.azure.com:443/], ConnectionPolicy [ConnectionPolicy [requestTimeout=60, mediaRequestTimeout=300, connectionMode=Gateway, mediaReadMode=Buffered, maxPoolSize=800, idleConnectionTimeout=60, userAgentSuffix=;spring-data/2.0.6;098063be661ab767976bd5a2ec350e978faba99348207e8627375e8033277cb2, retryOptions=com.microsoft.azure.documentdb.RetryOptions@6b9fb84d, enableEndpointDiscovery=true, preferredLocations=null]], ConsistencyLevel [null]
[INFO] AnnotationMBeanExporter - Registering beans for JMX exposure on startup
[INFO] TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
[INFO] TodoApplication - Started TodoApplication in 45.573 seconds (JVM running for 76.534)

Sie können die Spring-TODO-App lokal über den folgenden Link aufrufen, sobald die App gestartet wurde: http://localhost:8080/.

Lokales Zugreifen auf Spring-To-Do-App

Wenn Ausnahmen anstelle der Meldung „Started TodoApplication“ angezeigt werden, überprüfen Sie, ob das Skript bash im vorherigen Schritt die Umgebungsvariablen korrekt exportiert hat, und ob die Werte für die von Ihnen erstellte Azure Cosmos DB-Datenbank korrekt sind.

Konfigurieren der Azure-Bereitstellung

Öffnen Sie die Datei pom.xml im Verzeichnis initial/spring-boot-todo, und fügen Sie die folgende Konfiguration Azure-Web-App-Plug-In für Maven hinzu.

<plugins> 

    <!--*************************************************-->
    <!-- Deploy to Java SE in App Service Linux           -->
    <!--*************************************************-->
       
    <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>2.5.0</version>
        <configuration>
            <schemaVersion>v2</schemaVersion>

            <!-- Web App information -->
            <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
            <appName>${WEBAPP_NAME}</appName>
            <region>${REGION}</region>
            <pricingTier>P1v2</pricingTier>
            <!-- Java Runtime Stack for Web App on Linux-->
            <runtime>
                 <os>linux</os>
                 <javaVersion>Java 8</javaVersion>
                 <webContainer>Java SE</webContainer>
             </runtime>
             <deployment>
                 <resources>
                 <resource>
                     <directory>${project.basedir}/target</directory>
                     <includes>
                     <include>*.jar</include>
                     </includes>
                 </resource>
                 </resources>
             </deployment>

            <appSettings>
                <property>
                    <name>COSMOSDB_URI</name>
                    <value>${COSMOSDB_URI}</value>
                </property> 
                <property>
                    <name>COSMOSDB_KEY</name>
                    <value>${COSMOSDB_KEY}</value>
                </property>
                <property>
                    <name>COSMOSDB_DBNAME</name>
                    <value>${COSMOSDB_DBNAME}</value>
                </property>
                <property>
                    <name>JAVA_OPTS</name>
                    <value>-Dserver.port=80</value>
                </property>
            </appSettings>

        </configuration>
    </plugin>           
    ...
</plugins>

Bereitstellen für Azure App Service unter Linux

Verwenden Sie das Maven-Ziel mvn azure-webapp:deploy, um die TODO-App in Azure App Service unter Linux bereitzustellen.


# Deploy
bash-3.2$ mvn azure-webapp:deploy
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-todo-app 2.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- azure-webapp-maven-plugin:2.5.0:deploy (default-cli) @ spring-todo-app ---
Auth Type: AZURE_CLI
Default subscription: xxxxxxxxx
Username: xxxxxxxxx
[INFO] Subscription: xxxxxxxxx
[INFO] Creating App Service Plan 'ServicePlanb6ba8178-5bbb-49e7'...
[INFO] Successfully created App Service Plan.
[INFO] Creating web App spring-todo-app...
[INFO] Successfully created Web App spring-todo-app.
[INFO] Trying to deploy artifact to spring-todo-app...
[INFO] Successfully deployed the artifact to https://spring-todo-app.azurewebsites.net
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:19 min
[INFO] Finished at: 2019-11-06T15:32:03-07:00
[INFO] Final Memory: 50M/574M
[INFO] ------------------------------------------------------------------------

Die Ausgabe enthält die URL zu Ihrer bereitgestellten Anwendung (in diesem Beispiel https://spring-todo-app.azurewebsites.net). Sie können diese URL in Ihren Webbrowser kopieren oder den folgenden Befehl in Ihrem Terminalfenster ausführen, um Ihre App zu laden.

explorer https://spring-todo-app.azurewebsites.net

Sie sollten sehen, dass die App mit der Remote-URL in der Adressleiste ausgeführt wird:

Spring Boot-Anwendung, die mit einer Remote-URL ausgeführt wird

Streamen von Diagnoseprotokollen

Aktivieren Sie die Diagnoseprotokollierung, indem Sie den folgenden Befehl in Cloud Shellausführen, um auf die Konsolenprotokolle zuzugreifen, die innerhalb des Anwendungscodes in App Service generiert wurden:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

Mögliche Werte für --level sind Error, WarningInfo oder Verbose. Jede nachfolgende Ebene enthält die vorherige Ebene. Beispiel: Error enthält nur Fehlermeldungen, und Verbose enthält alle Meldungen.

Führen Sie den folgenden Befehl aus, um den Protokolldatenstrom anzuzeigen, nachdem die Diagnoseprotokollierung aktiviert wurde:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

Falls Sie nicht sofort Konsolenprotokolle sehen, können Sie es nach 30 Sekunden noch einmal versuchen.

Hinweis

Sie können die Protokolldateien auch im Browser unter https://<app-name>.scm.azurewebsites.net/api/logs/docker untersuchen.

Um das Protokollstreaming jederzeit zu beenden, geben Sie Ctrl+C ein.

Aufskalieren der TODO-App

Die Anwendung kann durch das Hinzufügen eines weiteren Workers aufskaliert werden:

az appservice plan update --number-of-workers 2 \
   --name ${WEBAPP_PLAN_NAME} \
   --resource-group <your-azure-group-name>

Bereinigen von Ressourcen

Wenn Sie diese Ressourcen nicht für ein anderes Tutorial benötigen (siehe Nächste Schritte), können Sie sie löschen, indem Sie den folgenden Befehl in Cloud Shell ausführen:

az group delete --name <your-azure-group-name> --yes

Nächste Schritte

Azure für Java-Entwickler*innenSpring Boot, Spring Data for Cosmos DB, Azure Cosmos DB und App Service Linux

Im Entwicklerhandbuch finden Sie weitere Informationen zum Ausführen von Java-Apps in App Service für Linux.

Erfahren Sie, wie Sie Ihre App mit einer benutzerdefinierten Domäne und einem Zertifikat schützen.