Zelfstudie: Een Java Spring Boot-web-app bouwen met Azure-app Service in Linux en Azure Cosmos DB

Notitie

Voor Spring-toepassingen wordt u aangeraden Azure Spring Apps te gebruiken. U kunt echter nog steeds Azure-app Service als bestemming gebruiken.

In deze zelfstudie wordt u door het proces van het ontwikkelen, configureren, implementeren en schalen van Java-web-apps in Azure geleid. Wanneer u klaar bent, hebt u een Spring Boot-toepassing die gegevens opslaat in Azure Cosmos DB op Azure App Service in Linux.

Spring Boot application storing data in Azure Cosmos DB

In deze zelfstudie leert u het volgende:

  • Hiermee maakt u een Azure Cosmos DB-database.
  • Een voorbeeld-app verbinden met de database en deze lokaal testen
  • De voorbeeld-app implementeren in Azure
  • Logboeken met diagnostische gegevens vanaf App Service streamen
  • Extra exemplaren toevoegen om de voorbeeld-app uit te breiden

Als u geen Azure-abonnement hebt, kunt u een gratis Azure-account maken voordat u begint.

Vereisten

Kloon de voorbeeld-app voor taken en bereid de opslagplaats voor

In deze zelfstudie wordt een voorbeeld van een takenlijst-app gebruikt met een webgebruikersinterface die een Spring REST API aanroept die wordt ondersteund door Spring Data voor Azure Cosmos DB. De code voor de app is beschikbaar op GitHub. Voor meer informatie over het schrijven van Java-apps met Spring en Azure Cosmos DB raadpleegt u de Spring Boot Starter met de zelfstudie Azure Cosmos DB voor NoSQL en de Snelstartgids voor Spring Data voor Azure Cosmos DB.

Voer de volgende opdrachten in de terminal uit om de voorbeeldopslagplaats te klonen en de omgeving van de voorbeeld-app in te stellen.

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/* .

Een Azure Cosmos DB maken

Volg deze stappen voor het maken van een Azure Cosmos DB-database in uw abonnement. De takenlijst-app maakt verbinding met deze database en slaat de gegevens op wanneer deze actief is, waarbij de status van de toepassing wordt behouden ongeacht waar u de toepassing uitvoert.

  1. Meld uw Azure-CLI aan en stel eventueel uw abonnement in als er meer dan één abonnement verbonden is met uw aanmeldingsreferenties.

    az login
    az account set -s <your-subscription-id>
    
  2. Maak een Azure-resourcegroep, waarbij de naam van de resourcegroep noteert.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Maken Azure Cosmos DB met het GlobalDocumentDB type. De naam van het Azure Cosmos DB-exemplaar mag alleen kleine letters gebruiken. Noteer het veld documentEndpoint in de reactie van de opdracht.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Haal uw Azure Cosmos DB-sleutel op om verbinding te maken met de app. Houd de primaryMasterKey, documentEndpoint bij de hand, want u hebt ze in de volgende stap nodig.

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

De eigenschappen van de takenlijst-app configureren

Open een terminal op uw computer. Kopieer het voorbeeldscriptbestand in de gekloonde opslagplaats, zodat u het kunt aanpassen voor de Azure Cosmos DB-database die u zojuist hebt gemaakt.

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

Bewerk .scripts/set-env-variables.sh deze in uw favoriete editor en geef azure Cosmos DB-verbindingsgegevens op. Gebruik voor de Linux-configuratie van App Service dezelfde regio als voorheen (your-resource-group-region) en resourcegroep (your-azure-group-name) die wordt gebruikt bij het maken van de Azure Cosmos DB-database. Kies een WEBAPP_NAME die uniek is, omdat hiervoor niet de naam van een web-app in een Azure-implementatie kan worden gedupliceerd.

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>

Voer daarna het script uit:

source .scripts/set-env-variables.sh

Deze omgevingsvariabelen worden in application.properties in de takenlijst-app gebruikt. Met de velden in het eigenschappenbestand wordt een standaardconfiguratie voor de opslagplaats voor Spring Data ingesteld:

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

Vervolgens gebruikt de voorbeeld-app de @Document aantekening waaruit com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document is geïmporteerd om een entiteitstype in te stellen dat moet worden opgeslagen en beheerd door Azure Cosmos DB:

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

De voorbeeld-app uitvoeren

Gebruik Maven om het voorbeeld uit te voeren.

mvn package spring-boot:run

De uitvoer moet er als volgt uitzien.

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)

U hebt lokaal toegang tot de Spring-takenlijst-app via deze koppeling zodra de app wordt gestart: http://localhost:8080/.

Access Spring TODO app locally

Als u uitzonderingen ziet in plaats van het bericht 'TodoApplication gestart', controleert u of het script bash in de vorige stap de omgevingsvariabelen correct heeft geëxporteerd en of de waarden juist zijn voor de Azure Cosmos DB-database die u hebt gemaakt.

Azure-implementatie configureren

Open het bestand pom.xml in de map initial/spring-boot-todo en voeg de volgende configuratie van Azure Web App-invoegtoepassing voor Maven toe.

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

Implementeren naar App Service in Linux

Gebruik het Maven-doel mvn azure-webapp:deploy om de takenlijst-app naar Azure App Service te implementeren in Linux.


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

De uitvoer bevat de URL naar uw geïmplementeerde toepassing (in dit voorbeeld https://spring-todo-app.azurewebsites.net ). U kunt deze URL kopiëren naar uw webbrowser of de volgende opdracht in uw Terminal-venster uitvoeren om uw app te laden.

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

U moet de app zien wanneer die wordt uitgevoerd met de externe URL in de adresbalk:

Spring Boot application running with a remote URL

Diagnostische logboeken streamen

Als u toegang wilt tot de consolelogboeken die worden gegenereerd binnen uw toepassingscode in de App Service, schakelt u diagnostische logboekregistratie in door de volgende opdracht in de Cloud Shell uit te voeren:

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

Mogelijk waarden voor --level zijn: Error, Warning, Info en Verbose. Elk hoger niveau omvat het vorige niveau. Bijvoorbeeld: Error omvat alleen foutberichten en Verbose omvat alle berichten.

Nadat diagnostische logboekregistratie is ingeschakeld, voert u de volgende opdracht uit om de logboekstream te zien:

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

Als u de consolelogboeken niet meteen ziet, probeert u het opnieuw na 30 seconden.

Notitie

U kunt ook de logboekbestanden van de browser inspecteren op https://<app-name>.scm.azurewebsites.net/api/logs/docker.

U kunt op elk gewenst moment Ctrl+C typen om te stoppen met logboekstreaming.

De takenlijst-app uitbreiden

Breid de toepassing uit door een andere werknemer toe te voegen:

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

Resources opschonen

Als u deze resources niet voor een andere zelfstudie nodig hebt (zie Volgende stappen), kunt u ze verwijderen door de volgende opdracht in de Cloud Shell uit te voeren:

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

Volgende stappen

Azure voor Java-ontwikkelaars Spring Boot, Spring Data voor Azure Cosmos DB, Azure Cosmos DB en App Service Linux.

Lees meer over het uitvoeren van Java-apps in Azure App Service in Linux in de handleiding voor ontwikkelaars.

Meer informatie over het beveiligen van uw app met een aangepast domein en certificaat.