Öğretici: Linux ve Azure Cosmos DB'de Azure Uygulaması Hizmeti ile Java Spring Boot web uygulaması oluşturma

Not

Spring uygulamaları için Azure Spring Apps kullanmanızı öneririz. Ancak, Azure Uygulaması Hizmetini hedef olarak kullanmaya devam edebilirsiniz.

Bu öğretici, Azure'da Java web uygulamaları oluşturma, yapılandırma, dağıtma ve ölçeklendirme işleminde size yol gösterir. İşiniz bittiğinde, Linux üzerinde Azure Uygulaması Hizmeti'nde çalışan Azure Cosmos DB'de veri depolayan bir Spring Boot uygulamanız olur.

Spring Boot application storing data in Azure Cosmos DB

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Azure Cosmos DB veritabanı oluşturun.
  • Veritabanına örnek bir uygulama Bağlan ve yerel olarak test edin
  • Örnek uygulamayı Azure'a dağıtma
  • App Service'ten tanılama günlüklerini akışla aktarma
  • Örnek uygulamanın ölçeğini genişletmek için ek örnekler ekleme

Azure aboneliğiniz yoksa başlamadan önce birücretsiz Azure hesabı oluşturun.

Önkoşullar

Örnek TODO uygulamasını kopyalayın ve depoyu hazırlayın

Bu öğreticide, Azure Cosmos DB için Spring Data tarafından desteklenen spring REST API'sini çağıran bir web kullanıcı arabirimine sahip örnek bir TODO liste uygulaması kullanılmaktadır. Uygulamanın kodu GitHub'da kullanılabilir. Spring ve Azure Cosmos DB kullanarak Java uygulamaları yazma hakkında daha fazla bilgi edinmek için, NoSQL için Azure Cosmos DB ile Spring Boot Starter öğreticisineve Azure Cosmos DB için Spring Data hızlı başlangıcına bakın.

Örnek depoyu kopyalamak ve örnek uygulama ortamını ayarlamak için terminalinizde aşağıdaki komutları çalıştırı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/* .

Azure Cosmos DB oluşturma

Aboneliğinizde bir Azure Cosmos DB veritabanı oluşturmak için bu adımları izleyin. TODO listesi uygulaması bu veritabanına bağlanır ve çalıştırılırken verilerini depolar ve uygulamayı nerede çalıştırdığınızdan bağımsız olarak uygulama durumunu kalıcı hale döndürür.

  1. Azure CLI'nızda oturum açın ve oturum açma kimlik bilgilerinize bağlı birden fazla aboneliğiniz varsa aboneliğinizi isteğe bağlı olarak ayarlayın.

    az login
    az account set -s <your-subscription-id>
    
  2. Kaynak grubu adını not ederek bir Azure Kaynak Grubu oluşturun.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. Türüyle GlobalDocumentDB Azure Cosmos DB oluşturun. Azure Cosmos DB örneğinin adı yalnızca küçük harf kullanmalıdır. komutundan documentEndpoint gelen yanıttaki alanı not edin.

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. Uygulamaya bağlanmak için Azure Cosmos DB anahtarınızı alın. primaryMasterKeysonraki adımda ihtiyacınız olacak şekilde öğesini documentEndpoint yakınınızda tutun.

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

TODO uygulama özelliklerini yapılandırma

Bilgisayarınızda bir terminali açın. Kopyalanan depodaki örnek betik dosyasını kopyalayarak yeni oluşturduğunuz Azure Cosmos DB veritabanı için özelleştirebilirsiniz.

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

Sık kullandığınız düzenleyicide düzenleyin .scripts/set-env-variables.sh ve Azure Cosmos DB bağlantı bilgilerini sağlayın. App Service Linux yapılandırması için Azure Cosmos DB veritabanını oluştururken kullanılan önceki (your-resource-group-region) ve kaynak grubuyla (your-azure-group-name) aynı bölgeyi kullanın. Herhangi bir Azure dağıtımında herhangi bir web uygulaması adını çoğaltamadığından benzersiz bir WEBAPP_NAME seçin.

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>

Ardından betiği çalıştırın:

source .scripts/set-env-variables.sh

Bu ortam değişkenleri TODO liste uygulamasında kullanılır application.properties . Özellikler dosyasındaki alanlar Spring Data için varsayılan depo yapılandırmasını ayarlar:

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

Ardından örnek uygulama, Azure Cosmos DB tarafından depolanacak ve yönetilecek bir varlık türü ayarlamak için 'den com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document içeri aktarılan ek açıklamayı kullanır@Document:

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

Örnek uygulamayı çalıştırma

Örneği çalıştırmak için Maven kullanın.

mvn package spring-boot:run

Çıkış aşağıdaki gibi görünmelidir.

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)

Uygulama başlatıldıktan sonra bu bağlantıyı kullanarak Spring TODO Uygulamasına yerel olarak erişebilirsiniz: http://localhost:8080/.

Access Spring TODO app locally

"TodoApplication Başlatıldı" iletisi yerine özel durumlar görürseniz, önceki adımdaki betiğin bash ortam değişkenlerini düzgün dışarı aktarıp dışarı aktarmadığını ve değerlerin oluşturduğunuz Azure Cosmos DB veritabanı için doğru olup olmadığını denetleyin.

Azure dağıtımını yapılandırma

pom.xml Dosyayı dizinde initial/spring-boot-todo açın ve maven yapılandırması için aşağıdaki Azure Web App Eklentisini ekleyin.

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

Linux üzerinde App Service dağıtma

mvn azure-webapp:deploy TODO uygulamasını Linux üzerinde Azure Uygulaması Hizmetine dağıtmak için Maven hedefini kullanın.


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

Çıktı, dağıtılan uygulamanızın URL'sini içerir (bu örnekte). https://spring-todo-app.azurewebsites.net Bu URL'yi web tarayıcınıza kopyalayabilir veya uygulamanızı yüklemek için Terminal pencerenizde aşağıdaki komutu çalıştırabilirsiniz.

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

Uygulamanın adres çubuğunda uzak URL ile çalıştığını görmeniz gerekir:

Spring Boot application running with a remote URL

Tanılama günlüklerini akışla aktarma

App Service’te uygulama kodunuzun içinden oluşturulan konsol günlüklerine erişmek için şu komutu Cloud Shell’de çalıştırarak tanılama günlüğüne kaydetmeyi açın:

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

--level için olası değerler: Error, Warning, Info ve Verbose. Her düzey kendisinden önceki düzeyi içerir. Örneğin: Error yalnızca hata iletilerini içerir, Verbose ise tüm iletileri içerir.

Tanılama günlüğüne kaydetme açıldıktan sonra günlük akışını görmek için şu komutu çalıştırın:

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

Konsol günlüklerini hemen görmüyorsanız, 30 saniye içinde yeniden kontrol edin.

Not

Ayrıca, tarayıcıdan https://<app-name>.scm.azurewebsites.net/api/logs/docker adresine giderek günlük dosyalarını inceleyebilirsiniz.

Günlük akışını dilediğiniz zaman durdurmak için Ctrl+C yazın.

TODO Uygulamasının ölçeğini genişletme

Başka bir çalışan ekleyerek uygulamanın ölçeğini genişletme:

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

Kaynakları temizleme

Bu kaynaklara başka bir öğretici (bkz. Sonraki adımlar) için gereksinim duymuyorsanız, Cloud Shell'de aşağıdaki komutu çalıştırarak bu kaynakları silebilirsiniz:

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

Sonraki adımlar

Java Geliştiricileriiçin Azure Spring Boot, Azure Cosmos DB için Spring Data, Azure Cosmos DB ve App Service Linux.

Geliştirici kılavuzunda java uygulamalarını Linux üzerinde App Service çalıştırma hakkında daha fazla bilgi edinin.

Özel bir etki alanı ve sertifikayla uygulamanızın güvenliğini sağlamayı öğrenin.