نشر تطبيقات Java بلا خادم باستخدام Quarkus على Azure Functions

في هذه المقالة، ستقوم بتطوير وبناء ونشر تطبيق Java بلا خادم إلى Azure Functions باستخدام Quarkus. تستخدم هذه المقالة Quarkus Funqy ودعمه المضمن لمشغل HTTP وظائف Azure ل Java. يمنحك استخدام Quarkus مع Azure Functions قوة نموذج برمجة Quarkus مع مقياس ومرونة Azure Functions. عند الانتهاء، ستقوم بتشغيل تطبيقات Quarkus بلا خادم على Azure Functions وتستمر في مراقبة تطبيقك على Azure.

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

إنشاء مشروع التطبيق

استخدم الأمر التالي لاستنساخ نموذج مشروع Java لهذه المقالة. العينة متاحة على GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2023-01-10
cd functions-quarkus

إذا رأيت رسالة حول وجودك في حالة HEAD منفصلة، فهذه الرسالة آمنة للتجاهل. نظرا لأن هذه المقالة لا تتطلب أي تثبيتات، فإن حالة HEAD المنفصلة مناسبة.

استكشف نموذج الدالة. افتح الملف functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java .

قم بتشغيل الأمر التالي. @Funq يجعل التعليق التوضيحي الأسلوب الخاص بك (في هذه الحالة، funqyHello) دالة بلا خادم.

@Funq
public String funqyHello() {
    return "hello funqy";
}

تحتوي Azure Functions Java على مجموعة خاصة بها من التعليقات التوضيحية الخاصة ب Azure، ولكن هذه التعليقات التوضيحية ليست ضرورية عند استخدام Quarkus على Azure Functions بسعة بسيطة كما نفعل هنا. لمزيد من المعلومات حول التعليقات التوضيحية ل Azure Functions Java، راجع دليل مطور Azure Functions Java.

ما لم تحدد خلاف ذلك، يكون اسم الدالة هو نفس اسم الأسلوب. يمكنك أيضا استخدام الأمر التالي لتعريف اسم الدالة مع معلمة إلى التعليق التوضيحي:

@Funq("alternateName")
public String funqyHello() {
    return "hello funqy";
}

الاسم مهم. يصبح جزءا من REST URI لاستدعاء الدالة، كما هو موضح لاحقا في المقالة.

اختبِر الدالة محليًا

استخدم mvn لتشغيل وضع تطوير Quarkus على المحطة الطرفية المحلية. يتيح تشغيل Quarkus بهذه الطريقة إعادة التحميل المباشر مع التحويل البرمجي للخلفية. عند تعديل ملفات Java و/أو ملفات الموارد وتحديث المستعرض الخاص بك، ستصبح هذه التغييرات سارية المفعول تلقائيا.

يؤدي تحديث المستعرض إلى إجراء مسح ضوئي لمساحة العمل. إذا اكتشف الفحص أي تغييرات، تتم إعادة تحويل ملفات Java وإعادة نشر التطبيق. خدمات التطبيق المعاد توزيعها الطلب. إذا كانت هناك أي مشاكل في التحويل البرمجي أو النشر، فستعلمك صفحة الخطأ.

في الإجراء التالي، استبدل yourResourceGroupName باسم مجموعة موارد. يجب أن تكون أسماء تطبيقات الوظائف فريدة عالميا عبر جميع Azure. يجب أن تكون أسماء مجموعة الموارد فريدة عالميا داخل الاشتراك. تحقق هذه المقالة التفرد الضروري عن طريق إلحاق اسم مجموعة الموارد باسم الدالة. ضع في اعتبارك إلحاق معرف فريد بأي أسماء تقوم بإنشائها يجب أن تكون فريدة. ومن التقنيات المفيدة استخدام الأحرف الأولى من اسمك متبوعا بتاريخ اليوم بالتنسيق mmdd .

مجموعة الموارد ليست ضرورية لهذا الجزء من الإرشادات، ولكنها مطلوبة لاحقا. للتبسيط، يتطلب منك مشروع Maven تحديد الخاصية .

  1. استدعاء وضع تطوير Quarkus:

    cd functions-azure
    mvn -DskipTests -DresourceGroup=<yourResourceGroupName> quarkus:dev
    

    يجب أن يبدو الإخراج كما يلي:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    INFO  [io.quarkus] (Quarkus Main Thread) quarkus-azure-function 1.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 1.290s. Listening on: http://localhost:8080
    
    INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
    INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, funqy-http, smallrye-context-propagation, vertx]
    
    --
    Tests paused
    Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
    
  2. الوصول إلى الدالة باستخدام الأمر على CURL المحطة الطرفية المحلية:

    curl localhost:8080/api/funqyHello
    

    يجب أن يبدو الإخراج كما يلي:

    "hello funqy"
    

إضافة إدخال التبعية إلى الدالة

توفر التقنية المفتوحة القياسية Jakarta EE Contexts and Dependency Injection (CDI) حقن التبعية في Quarkus. للحصول على نظرة عامة عالية المستوى على الحقن بشكل عام، وCDI على وجه التحديد، راجع البرنامج التعليمي Jakarta EE.

  1. إضافة دالة جديدة تستخدم إدخال التبعية.

    إنشاء ملف GreetingService.java في الدليل functions-quarkus/src/main/java/io/quarkus. استخدم التعليمات البرمجية التالية كتعلم برمجية المصدر للملف:

    package io.quarkus;
    
    import javax.enterprise.context.ApplicationScoped;
    
    @ApplicationScoped
    public class GreetingService {
    
        public String greeting(String name) {
            return "Welcome to build Serverless Java with Quarkus on Azure Functions, " + name;
        }
    
    }
    

    احفظ الملف.

    GreetingService هو منتقاة قابلة للحقن تنفذ أسلوبا greeting() . يقوم الأسلوب بإرجاع رسالة سلسلة Welcome... مع معلمة name .

  2. افتح الملف functions-quarkus /src/main/java/io/quarkus/GreetingFunction.java الموجود. استبدل الفئة بالتعليمات البرمجية التالية لإضافة حقل جديد gService والأسلوب greeting :

    package io.quarkus;
    
    import javax.inject.Inject;
    import io.quarkus.funqy.Funq;
    
    public class GreetingFunction {
    
        @Inject
        GreetingService gService;
    
        @Funq
        public String greeting(String name) {
            return gService.greeting(name);
        }
    
        @Funq
        public String funqyHello() {
            return "hello funqy";
        }
    
    }
    

    احفظ الملف.

  3. الوصول إلى الدالة الجديدة greeting باستخدام الأمر على curl المحطة الطرفية المحلية:

    curl -d '"Dan"' -X POST localhost:8080/api/greeting
    

    يجب أن يبدو الإخراج كما يلي:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan"
    

    هام

    يسمح لك Live Coding (يسمى أيضا وضع التطوير) بتشغيل التطبيق وإجراء تغييرات بسرعة. سيقوم Quarkus تلقائيا بإعادة التحويل البرمجي وإعادة تحميل التطبيق عند إجراء التغييرات. هذا نمط قوي وفعال لتطوير ستستخدمه خلال هذه المقالة.

    قبل الانتقال إلى الخطوة التالية، أوقف وضع تطوير Quarkus عن طريق تحديد Ctrl+C.

توزيع التطبيق على Azure

  1. إذا لم تكن قد قمت بتسجيل الدخول بالفعل، فسجل الدخول إلى اشتراك Azure باستخدام الأمر التالي az login واتبع التوجيهات التي تظهر على الشاشة:

    az login
    

    إشعار

    إذا كان العديد من مستأجري Azure مقترنين ببيانات اعتماد Azure، فيجب عليك تحديد المستأجر الذي تريد تسجيل الدخول إليه. يمكنك القيام بذلك باستخدام --tenant الخيار . على سبيل المثال: az login --tenant contoso.onmicrosoft.com.

    متابعة العملية في مستعرض الويب. إذا لم يتوفر مستعرض ويب أو إذا فشل فتح مستعرض الويب، فاستخدم تدفق التعليمات البرمجية للجهاز مع az login --use-device-code.

    بعد تسجيل الدخول بنجاح، يجب أن يبدو الإخراج على المحطة الطرفية المحلية مشابها للآتي:

    xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxx 'Microsoft'
    [
        {
            "cloudName": "AzureCloud",
            "homeTenantId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
            "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "isDefault": true,
            "managedByTenants": [],
            "name": "Contoso account services",
            "state": "Enabled",
            "tenantId": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx",
            "user": {
            "name": "user@contoso.com",
            "type": "user"
            }
        }
    ]
    
  2. إنشاء الوظائف ونشرها إلى Azure.

    يستخدم azure-functions-maven-pluginملف pom.xml الذي أنشأته في الخطوة السابقة . يؤدي التشغيل mvn install إلى إنشاء ملفات التكوين ودليل التقسيم المرحلي الذي azure-functions-maven-plugin يتطلبه. بالنسبة إلى yourResourceGroupName، استخدم القيمة التي استخدمتها سابقا.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. أثناء النشر، سجل الدخول إلى Azure. azure-functions-maven-plugin يتم تكوين المكون الإضافي لمطالبة تسجيل الدخول إلى Azure في كل مرة يتم فيها نشر المشروع. أثناء الإنشاء، يظهر إخراج مشابه للآتي:

    [INFO] Auth type: DEVICE_CODE
    To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AXCWTLGMP to authenticate.
    

    قم بما يقوله الإخراج وقم بالمصادقة على Azure باستخدام المتصفح ورمز الجهاز المتوفر. تتوفر العديد من خيارات المصادقة والتكوين الأخرى. تتوفر الوثائق المرجعية الكاملة ل azure-functions-maven-plugin في وظائف Azure: تفاصيل التكوين.

  4. بعد المصادقة، يجب أن يستمر البناء وينتهي. تأكد من أن الإخراج يتضمن BUILD SUCCESS بالقرب من النهاية.

    Successfully deployed the artifact to https://quarkus-demo-123451234.azurewebsites.net
    

    يمكنك أيضا العثور على عنوان URL لتشغيل دالتك على Azure في سجل الإخراج:

    [INFO] HTTP Trigger Urls:
    [INFO] 	 quarkus : https://quarkus-azure-functions-http-archetype-20220629204040017.azurewebsites.net/api/{*path}
    

    سيستغرق النشر بعض الوقت حتى ينتهي. في هذه الأثناء، دعنا نستكشف Azure Functions في مدخل Microsoft Azure.

الوصول إلى الدالة بلا خادم ومراقبتها على Azure

سجل الدخول إلى المدخل وتأكد من تحديد نفس المستأجر والاشتراك الذي استخدمته في Azure CLI.

  1. اكتب تطبيق الوظائف على شريط البحث في أعلى مدخل Microsoft Azure وحدد مفتاح الإدخال Enter. يجب نشر تطبيق الوظائف الخاص بك وعرضه بالاسم <yourResourceGroupName>-function-quarkus.

    Screenshot that shows the function app in the portal.

  2. حدد تطبيق الوظائف لعرض معلومات مفصلة، مثل الموقع والاشتراك وعنوان URL والمقاييس وخطة خدمة التطبيقات. ثم حدد قيمة URL .

    Screenshot that shows a URL and other function app details.

  3. تأكد من أن صفحة الترحيب تشير إلى أن تطبيق الوظائف الخاص بك "قيد التشغيل".

    Screenshot that shows the welcome page for a function app.

  4. استدعاء الدالة greeting باستخدام الأمر التالي curl على المحطة الطرفية المحلية.

    هام

    استبدل YOUR_HTTP_TRIGGER_URL بعنوان URL للدالة الخاصة بك التي تجدها في مدخل Azure أو الإخراج.

    curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting
    

    يجب أن يبدو الإخراج مشابهًا لما يلي:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan on Azure"
    

    يمكنك أيضا الوصول إلى الدالة الأخرى (funqyHello) باستخدام الأمر التالي curl :

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    يجب أن يكون الإخراج هو نفسه ما لاحظته سابقا:

    "hello funqy"
    

    إذا كنت ترغب في ممارسة إمكانية المقاييس الأساسية في مدخل Microsoft Azure، فحاول استدعاء الدالة ضمن حلقة shell for :

    for i in {1..100}; do curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting; done
    

    بعد فترة من الوقت، سترى بعض بيانات المقاييس في المدخل.

    Screenshot that shows function metrics in the portal.

الآن بعد أن فتحت دالة Azure في المدخل، إليك المزيد من الميزات التي يمكنك الوصول إليها من المدخل:

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

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

az group delete --name <yourResourceGroupName> --yes

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

في هذا المقال، ستتعلم كيفية إجراء ما يلي:

  • تشغيل وضع تطوير Quarkus.
  • نشر تطبيق Funqy إلى وظائف Azure باستخدام azure-functions-maven-plugin.
  • فحص أداء الدالة في المدخل.

لمعرفة المزيد حول Azure Functions و Quarkus، راجع المقالات والمراجع التالية: