البرنامج التعليمي: إنشاء تطبيق ويب Java Spring Boot باستخدام Azure App Service على Linux وAzure Cosmos DB

إشعار

بالنسبة لتطبيقات Spring، نوصي باستخدام Azure Spring Apps. ومع ذلك، لا يزال بإمكانك استخدام Azure App Service كوجهة. راجع إرشادات وجهة حمل عمل Java للحصول على المشورة.

يرشدك هذا البرنامج التعليمي خلال عملية إنشاء تطبيقات Java على الويب وتكوينها ونشرها وتوسيع نطاقها على Azure. عند الانتهاء، سيكون لديك تطبيق Spring Boot يخزن البيانات في Azure Cosmos DB الذي يعمل على Azure App Service على Linux.

يقوم تطبيق Spring Boot بتخزين البيانات في Azure Cosmos DB

في هذا البرنامج التعليمي، تتعلم كيفية:

  • إنشاء قاعدة بيانات في Azure Cosmos DB.
  • قم بتوصيل نموذج التطبيق بقاعدة البيانات واختبره محليًا
  • انشر نموذج التطبيق إلى Azure
  • سجلات تشخيص الدفق من App Service
  • أضف مثيلات إضافية لتوسيع نطاق نموذج التطبيق

إذا لم يكن لديك اشتراك في Azure، فأنشئ حساب Azure مجاني قبل أن تبدأ.

المتطلبات الأساسية

استنساخ عينة التطبيق TODO وإعداد الريبو

يستخدم هذا البرنامج التعليمي نموذج تطبيق قائمة TODO مع واجهة مستخدم ويب تستدعي واجهة برمجة تطبيقات Spring REST المدعومة من Spring Data ل Azure Cosmos DB. تتوفر التعليمات البرمجية للتطبيق على GitHub. لمعرفة المزيد حول كتابة تطبيقات Java باستخدام Spring وAzure Cosmos DB، راجع Spring Boot Starter مع البرنامج التعليمي Azure Cosmos DB for NoSQL والبدء السريع ل Spring Data ل Azure Cosmos DB.

قم بتشغيل الأوامر التالية في الوحدة الطرفية الخاصة بك لاستنساخ عينة الريبو وإعداد بيئة نموذج التطبيق.

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

اتبع هذه الخطوات لإنشاء قاعدة بيانات Azure Cosmos DB في اشتراكك. سيقوم تطبيق قائمة TODO بالاتصال بقاعدة البيانات هذه وتخزين البيانات الخاصة به عند التشغيل، مع الاستمرار في حالة التطبيق بغض النظر عن مكان تشغيل التطبيق.

  1. قم بتسجيل الدخول إلى Azure CLI، ثم قم بشكل اختياري تعيين اشتراكك إذا كان لديك أكثر من اشتراك متصل ببيانات اعتماد تسجيل الدخول الخاصة بك.

    az login
    az account set -s <your-subscription-id>
    
  2. إنشاء مجموعة موارد Azure، بالإضافة إلى إعادة تحديد اسم مجموعة الموارد.

    az group create -n <your-azure-group-name> \
        -l <your-resource-group-region>
    
  3. إنشاء Azure Cosmos DB مع GlobalDocumentDB النوع . يجب أن يستخدم اسم مثيل Azure Cosmos DB أحرفا صغيرة فقط. لاحظ أسفل documentEndpoint الحقل في الاستجابة من الأمر .

    az cosmosdb create --kind GlobalDocumentDB \
        -g <your-azure-group-name> \
        -n <your-azure-COSMOS-DB-name-in-lower-case-letters>
    
  4. احصل على مفتاح Azure Cosmos DB للاتصال بالتطبيق. احتفظ ب primaryMasterKey، documentEndpoint في مكان قريب كما ستحتاج إليه في الخطوة التالية.

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

قم بتكوين خصائص تطبيق TODO

افتح وحدة طرفية على جهاز الكمبيوتر الخاص بك. انسخ نموذج ملف البرنامج النصي في المستودع المستنسخ حتى تتمكن من تخصيصه لقاعدة بيانات Azure Cosmos DB التي أنشأتها للتو.

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

قم بالتحرير .scripts/set-env-variables.sh في المحرر المفضل لديك وتوفير معلومات اتصال Azure Cosmos DB. لتكوين App Service Linux، استخدم نفس المنطقة كما كان من قبل (your-resource-group-region) ومجموعة الموارد (your-azure-group-name) المستخدمة عند إنشاء قاعدة بيانات Azure Cosmos DB. اختر WEBAPP_NAME ويكون اسمًا مميزًا حيث لا يمكن تكرار أي اسم لتطبيق ويب في أي نشر Azure.

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>

ثم قم بتشغيل البرنامج النصي:

source .scripts/set-env-variables.sh

يتم استخدام متغيرات البيئة هذه في application.properties تطبيق قائمة TODO. تقوم الحقول الموجودة في ملف الخصائص بإعداد تكوين مستودع افتراضي لـ 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> {
}

ثم يستخدم نموذج التطبيق التعليق التوضيحي @Document المستورد من com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document لإعداد نوع كيان ليتم تخزينه وإدارته بواسطة Azure Cosmos DB:

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

تشغيل نموذج التطبيق

استخدم Maven لتشغيل النموذج.

mvn package spring-boot:run

يجب أن يبدو الناتج كما يلي.

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)

يمكنك الوصول إلى تطبيق Spring TODO محليا باستخدام هذا الارتباط بمجرد بدء تشغيل التطبيق: http://localhost:8080/.

الوصول إلى تطبيق Spring TODO محليًا

إذا رأيت استثناءات بدلا من رسالة "Started TodoApplication"، فتحقق من أن bash البرنامج النصي في الخطوة السابقة قام بتصدير متغيرات البيئة بشكل صحيح وأن القيم صحيحة لقاعدة بيانات Azure Cosmos DB التي قمت بإنشائها.

تكوين توزيع Azure

افتح ملف pom.xml في initial/spring-boot-todo وأضف التكوين التالي Azure Web App Plugin for Maven.

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

انشر في App Service على Linux

mvn azure-webapp:deploy استخدم هدف Maven لنشر تطبيق TODO إلى Azure App Service على 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] ------------------------------------------------------------------------

يحتوي الإخراج على عنوان URL للتطبيق المنشور (في هذا المثال، https://spring-todo-app.azurewebsites.net). يمكنك نسخ عنوان URL هذا إلى مستعرض الويب أو تشغيل الأمر التالي في نافذة الوحدة الطرفية لتحميل التطبيق.

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

يجب أن تشاهد التطبيق قيد التشغيل باستخدام عنوان URL في شريط العناوين:

تطبيق Spring Boot يعمل مع عنوان URL عن بُعد

دفق سجلات التشخيص

للوصول إلى سجلات وحدة التحكم التي تم إنشاؤها من داخل التعليمة البرمجية للتطبيق في خدمة التطبيقات، قم بتشغيل تسجيل التشخيص عن طريق تشغيل الأمر التالي في Cloud Shell:

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

القيم المحتملة لـ --level هي: Error وWarning وInfo وVerbose. يتضمن كل مستوى لاحق المستوى السابق. على سبيل المثال: Error يتضمن رسائل الخطأ فقط بينما Verbose يتضمن جميع الرسائل.

بمجرد تشغيل التسجيل التشخيصي، قم بتشغيل الأمر التالي لمشاهدة تدفق السجل:

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

وفي حال عدم رؤية سجلات وحدة التحكم على الفور، فتحقق مجددًا في غضون 30 ثانية.

إشعار

يمكنك أيضا فحص ملفات السجل من المستعرض في https://<app-name>.scm.azurewebsites.net/api/logs/docker.

لإيقاف تسجيل التدفق في أي وقت، اكتب Ctrl+C.

توسيع نطاق تطبيق TODO

قم بتوسيع نطاق التطبيق بإضافة عامل آخر:

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

تنظيف الموارد

إذا لم تكن بحاجة إلى هذه الموارد لبرنامج تعليمي آخر (راجع الخطوات التالية)، يمكنك حذفها عن طريق تشغيل الأمر التالي في Cloud Shell:

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

الخطوات التالية

Azure لمطوريJava Spring Boot وSpring Data ل Azure Cosmos DB وAzure Cosmos DB وApp Service Linux.

تعرّف على المزيد حول تشغيل تطبيقات Java على خدمة التطبيقات على Linux في دليل المطور.

تعرف على كيفية تأمين تطبيقك باستخدام مجال وشهادة مخصصين.