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

Kommentar

För Spring-program rekommenderar vi att du använder Azure Spring Apps. Du kan dock fortfarande använda Azure App Service som mål.

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 application storing data in Azure Cosmos DB

I den här självstudien lär du dig att:

  • Skapa en Azure 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-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Förutsättningar

Klona TODO-appen och förbereda lagringsplatsen

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

Kör följande kommandon i terminalen för att klona exempelrepo 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 en Azure Cosmos DB

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å Azure Cosmos DB-instansen får endast använda gemener. 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. primaryMasterKeyBehåll , 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 på den klonade lagringsplatsen så att du kan anpassa den för den Azure 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 Azure Cosmos DB. För App Service Linux-konfigurationen använder du samma region som före (your-resource-group-region) och resursgruppen (your-azure-group-name) som användes när du skapade Azure 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> {
}

Sedan använder exempelappen anteckningen @Document som importerats från com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document för att konfigurera en entitetstyp som ska lagras och hanteras av Azure 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/.

Access Spring TODO app locally

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

Konfigurera Azure-distribution

pom.xml Öppna filen i initial/spring-boot-todo katalogen och lägg till följande Azure Web App-plugin-program för Maven-konfiguration.

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

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

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 application running with a remote 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.

Kommentar

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 for Java Developers Spring Boot, Spring Data för Azure 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.

Lär dig hur du skyddar din app med en anpassad domän och ett certifikat.