Självstudie: Skapa en Java Spring Boot-webbapp med Azure App Service på Linux och Azure Cosmos DB

Den här självstudien vägleder dig genom processen för att skapa, konfigurera, distribuera och skala Java-webbappar på Azure. När du är klar har du en Spring Boot-app som lagrar data i Azure Cosmos DB och körs på Azure App Service på Linux.

Spring Boot program som lagrar data i Azure Cosmos DB

I den här guiden får du lära dig att:

  • Skapa en Cosmos DB-databas.
  • Ansluta en exempelapp till databasen och testa den lokalt
  • Distribuera exempelappen till Azure
  • Strömma diagnostikloggar från App Service
  • Lägga till ytterligare instanser för att skala ut exempelappen

Om du inte har en Azure-prenumerationkan du skapa ett kostnads fritt konto innan du börjar.

Förutsättningar

Klona TODO-appen och förbereda lagringsplatsen

I den här självstudien används en TODO-exempelapp med ett webbgränssnitt som anropar REST-API för Spring som backas upp av Spring Data Azure Cosmos DB. Koden för appen är tillgänglig på GitHub. Mer information om hur du skriver Java-appar med Spring och Cosmos DB finns i självstudien om Spring Boot Starter med Azure Cosmos DB SQL API och Spring Data Azure Cosmos DB-snabbstarten.

Kör följande kommandon i terminalen för att klona exempeldatabasen och konfigurera exempelappmiljön.

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

Skapa ett Azure Cosmos DB-konto

Följ dessa steg för att skapa en Azure Cosmos DB-databas i din prenumeration. TODO-listappen ansluts till databasen och lagrar sina data under körning och sparar programtillståndet oavsett var du kör programmet.

  1. Logga in på Azure CLI och ange din prenumeration om du har fler än en ansluten till dina inloggningsuppgifter.

    az login
    az account set -s <your-subscription-id>
    
  2. Skapa en Azure-resursgrupp och notera resursgruppens namn.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Skapa Azure Cosmos DB av typen GlobalDocumentDB. Namnet på Cosmos DB får endast innehålla gemena bokstäver. Anteckna fältet documentEndpoint i svaret från kommandot.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Hämta din Azure Cosmos DB-nyckel för att ansluta till appen. Behåll primaryMasterKey , documentEndpoint i närheten eftersom du behöver dem i nästa steg.

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

Konfigurera egenskaper för TODO-appen

Öppna en terminal på datorn. Kopiera exempelskriptfilen i den klonade lagringsplatsen så att du kan anpassa den för din Cosmos DB-databas som du nyss skapade.

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

Redigera .scripts/set-env-variables.sh i din favoritredigerare och ange anslutningsinformation för Azure Cosmos DB. För App Service Linux-konfigurationen måste du använda samma region som tidigare (your-resource-group-region) och resursgruppen (your-azure-group-name) som användes när du skapade Cosmos DB-databasen. Välj ett WEBAPP_NAME som är unikt eftersom det inte kan duplicera alla webbappnamn i alla Azure-distributioner.

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>

Kör sedan skriptet:

source .scripts/set-env-variables.sh

Dessa miljövariabler används i application.properties i TODO-listappen. Fälten i egenskapsfilen konfigurerar en standardkonfiguration för databasen för Spring Data:

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

Exempelappen använder sedan den @Document anteckning som importerats från com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document för att ställa in en entitetstyp som ska lagras och hanteras av Cosmos DB:

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

Kör exempelappen

Använd Maven för att köra exemplet.

mvn package spring-boot:run

Resultatet bör likna följande.

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)

Du kan komma åt Spring TODO-appen lokalt med hjälp av den här länken när appen startas: http://localhost:8080/.

Få åtkomst till Spring TODO-appen lokalt

Om du ser undantag i stället för meddelandet "Started TodoApplication" kontrollerar du att skriptet i föregående steg exporterade miljövariablerna korrekt och att värdena är korrekta för den Azure Cosmos DB-databas som du bash skapade.

Konfigurera Azure-distribution

Öppna filen pom.xml i katalogen och lägg till följande Konfiguration av initial/spring-boot-todo Plugin-programmet Azure Web App för Maven.

<plugins> 

    <!--*************************************************-->
    <!-- Deploy to Java SE in App Service Linux           -->
    <!--*************************************************-->
       
    <plugin>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-webapp-maven-plugin</artifactId>
        <version>2.0.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>

Distribuera till App Service i Linux

Använd mvn azure-webapp:deploy Maven-målet för att distribuera TODO-appen till Azure App Service i 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.0.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] ------------------------------------------------------------------------

Utdata innehåller URL till dina distribuerade program (i det här exemplet https://spring-todo-app.azurewebsites.net ). Du kan kopiera denna URL i webbläsaren eller köra följande kommando i terminalfönstret för att läsa in din app.

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

Du bör se när appen körs med fjärrwebbadressen i adressfältet:

Spring Boot program som körs med en fjärr-URL

Strömma diagnostikloggar

Om du vill komma åt konsolloggarna som genereras i din programkod i App Service aktiverar du diagnostisk loggning genom att köra följande kommando i Cloud Shell:

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

Möjliga värden för --level är: Error, Warning, Info och Verbose. Varje efterföljande nivå omfattar den föregående nivån. Exempel: Error omfattar endast felmeddelanden och Verbose omfattar alla meddelanden.

När diagnostisk loggning har aktiverats kör du följande kommando för att visa loggströmmen:

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

Om du inte ser konsolloggarna omedelbart kan du titta efter igen efter 30 sekunder.

Anteckning

Du kan även granska loggfilerna från din webbläsare via https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Skriv Ctrl+C när som helst för att stoppa loggströmningen.

Skala ut TODO-appen

Skala ut programmet genom att lägga till en annan arbetsroll:

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

Rensa resurser

Om du inte behöver de här resurserna för en annan självstudie (se Nästa steg) kan du ta bort dem genom att köra följande kommando i Cloud Shell:

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

Nästa steg

Azure för Java-utvecklare Spring Boot, Spring Data för Cosmos DB, Azure Cosmos DB och App Service Linux.

Läs mer om hur du kör Java-appar i App Service på Linux i utvecklarhandboken.