البرنامج التعليمي: إنشاء تطبيق إعلام بلا خادم باستخدام Azure Functions وخدمة Azure Web PubSub

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

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

  • إنشاء تطبيق إعلام بلا خادم
  • العمل مع روابط إدخال وإخراج وظيفة Web PubSub
  • تشغيل نماذج الدوال محلياً
  • توزيع الدالة إلى تطبيق Azure Function

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

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

تسجيل الدخول إلى Azure

سجل الدخول إلى مدخل Microsoft Azure على https://portal.azure.com/ باستخدام بيانات حساب Azure.

إنشاء مثيل خدمة Azure Web PubSub

سيقوم التطبيق بالاتصال بمثيل خدمة Web PubSub في Azure.

  1. حدد الزر جديد «New» الموجود في الزاوية العلوية اليسرى من مدخل Microsoft Azure. في الشاشة «New»، اكتب «Web PubSub» في مربع البحث واضغط على إدخال. (يمكنك أيضًا البحث في Azure Web PubSub من الفئة Web.)

    Screenshot of searching the Azure Web PubSub in portal.

  2. حدد «Web PubSub» من نتائج البحث، ثم حدد «Create».

  3. أدخل الإعدادات التالية.

    الإعدادات القيمة المقترحة ‏‏الوصف
    اسم المورد اسم فريد عالميًا الاسم الفريد العام الذي يعرّف مثيل خدمة Web PubSub الجديد. الأحرف الصالحة هي a-zو A-Z0-9و و.-
    الاشتراك اشتراكك اشتراك Azure الذي يتم بموجبه إنشاء مثيل خدمة Web PubSub الجديد هذا.
    مجموعة الموارد myResourceGroup اسم مجموعة الموارد الجديدة التي يتم فيها إنشاء مثيل خدمة Web PubSub.
    Location غرب الولايات المتحدة اختر منطقة قريبة منك.
    مستوى الأسعار مجاني يمكنك أولًا تجربة خدمة Azure Web PubSub مجانًا. تعرف على مزيد من التفاصيل حول مستويات تسعير خدمة Azure Web PubSub
    عدد الوحدات - يحدد عدد الوحدات عدد الاتصالات التي يمكن لمثيل خدمة PubSub على الويب قبولها. تدعم كل وحدة 1000 اتصال متزامن على الأكثر. لا يمكن تكوينه إلا في المستوى القياسي.

    Screenshot of creating the Azure Web PubSub instance in portal.

  4. حدد «Create» لبدء نشر مثيل خدمة Web PubSub.

إنشاء وتشغيل الدوال محلياً

  1. تأكد من تثبيت Azure Functions Core Tools. الآن، قم بإنشاء دليل فارغ للمشروع. قم بتشغيل الأمر ضمن دليل العمل هذا. استخدم أحد الخيارات المحددة أدناه.

    func init --worker-runtime javascript --model V4
    
  2. اتبع الخطوات لتثبيت Microsoft.Azure.WebJobs.Extensions.WebPubSub.

    قم بتأكيد extensionBundle أو تحديثه host.jsonإلى الإصدار 4.* أو إصدار أحدث للحصول على دعم Web PubSub. لتحديث host.json، افتح الملف في المحرر، ثم استبدل extensionBundle الإصدار الموجود بالإصدار 4.* أو أحدث.

    {
        "extensionBundle": {
            "id": "Microsoft.Azure.Functions.ExtensionBundle",
            "version": "[4.*, 5.0.0)"
        }
    }
    
  3. قم بإنشاء دالة index لقراءة واستضافة صفحة ويب ثابتة للعملاء.

    func new -n index -t HttpTrigger
    
    • قم بتحديث src/functions/index.js وانسخ التعليمات البرمجية التالية.
      const { app } = require('@azure/functions');
      const { readFile } = require('fs/promises');
      
      app.http('index', {
          methods: ['GET', 'POST'],
          authLevel: 'anonymous',
          handler: async (context) => {
              const content = await readFile('index.html', 'utf8', (err, data) => {
                  if (err) {
                      context.err(err)
                      return
                  }
              });
      
              return { 
                  status: 200,
                  headers: { 
                      'Content-Type': 'text/html'
                  }, 
                  body: content, 
              };
          }
      });
      
  4. أنشئ الدالة negotiate لمساعدة العملاء في الحصول على عنوان url لاتصال الخدمة مع رمز الوصول المميز.

    func new -n negotiate -t HttpTrigger
    
    • قم بتحديث src/functions/negotiate.js وانسخ التعليمات البرمجية التالية.
      const { app, input } = require('@azure/functions');
      
      const connection = input.generic({
          type: 'webPubSubConnection',
          name: 'connection',
          hub: 'notification'
      });
      
      app.http('negotiate', {
          methods: ['GET', 'POST'],
          authLevel: 'anonymous',
          extraInputs: [connection],
          handler: async (request, context) => {
              return { body: JSON.stringify(context.extraInputs.get('connection')) };
          },
      });
      
  5. أنشئ الدالة notification لإنشاء الإعلامات بـ TimerTrigger.

    func new -n notification -t TimerTrigger
    
    • قم بتحديث src/functions/notification.js وانسخ التعليمات البرمجية التالية.
      const { app, output } = require('@azure/functions');
      
      const wpsAction = output.generic({
          type: 'webPubSub',
          name: 'action',
          hub: 'notification'
      });
      
      app.timer('notification', {
          schedule: "*/10 * * * * *",
          extraOutputs: [wpsAction],
          handler: (myTimer, context) => {
              context.extraOutputs.set(wpsAction, {
                  actionName: 'sendToAll',
                  data: `[DateTime: ${new Date()}] Temperature: ${getValue(22, 1)}\xB0C, Humidity: ${getValue(40, 2)}%`,
                  dataType: 'text',
              });
          },
      });
      
      function getValue(baseNum, floatNum) {
          return (baseNum + 2 * floatNum * (Math.random() - 0.5)).toFixed(3);
      }
      
  6. أضف صفحة index.html العميل الفردية في المجلد الجذر للمشروع وانسخ المحتوى.

    <html>
        <body>
        <h1>Azure Web PubSub Notification</h1>
        <div id="messages"></div>
        <script>
            (async function () {
                let messages = document.querySelector('#messages');
                let res = await fetch(`${window.location.origin}/api/negotiate`);
                let url = await res.json();
                let ws = new WebSocket(url.url);
                ws.onopen = () => console.log('connected');
    
                ws.onmessage = event => {
                    let m = document.createElement('p');
                    m.innerText = event.data;
                    messages.appendChild(m);
                };
            })();
        </script>
        </body>
    </html>
    
  7. تكوين وتشغيل تطبيق Azure Function

    • في المستعرض، افتح مدخل Azure وتأكد من إنشاء مثيل Web PubSub Service الذي قمت بتوزيعه مسبقًا بنجاح. انتقل إلى المثيل.
    • حدد Keys وانسخ سلسلة الاتصال.

    Screenshot of copying the Web PubSub connection string.

    قم بتشغيل الأمر في مجلد الدالة لتعيين سلسلة الاتصال الخدمة. استبدل <connection-string> بقيمتك حسب الحاجة.

    func settings add WebPubSubConnectionString "<connection-string>"
    

    إشعار

    يعتمد TimerTrigger المستخدم في العينة على Azure Storage، ولكن يمكنك استخدام محاكي التخزين المحلي عندما تكون الدالة قيد التشغيل محليًا. إذا تلقيت بعض الأخطاء مثل There was an error performing a read operation on the Blob Storage Secret Repository. Please ensure the 'AzureWebJobsStorage' connection string is valid.، فستحتاج إلى تنزيل محاكي التخزين وتمكينه.

    الآن أنت قادر على تشغيل الدالة المحلية الخاصة بك حسب الأمر.

    func start --port 7071
    

    وللتحقق من سجلات التشغيل، يمكنك زيارة الصفحة الثابتة للمضيف المحلي من خلال زيارة: http://localhost:7071/api/index.

    إشعار

    بعض عابسات إعادة توجيه تلقائيا إلى https أن يؤدي إلى عنوان URL خاطئ. اقترح استخدام Edge وتحقق مرة وافحص عنوان url إذا لم يكن العرض ناجحا.

توزيع Function App إلى Azure

قبل أن تتمكن من نشر رمز دالتك على Azure، تحتاج إلى إنشاء ثلاثة موارد:

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

استخدم الأوامر التالية لإنشاء هذه العناصر.

  1. تسجيل الدخول إلى Azure:

    az login
    
  2. إنشاء مجموعة موارد أو يمكنك التخطي عن طريق إعادة استخدام إحدى خدمات Azure Web PubSub:

    az group create -n WebPubSubFunction -l <REGION>
    
  3. إنشاء حساب تخزين للأغراض العامة في مجموعة الموارد والمنطقة الخاصة بك:

    az storage account create -n <STORAGE_NAME> -l <REGION> -g WebPubSubFunction
    
  4. أنشئ تطبيق الدالة في Azure:

    az functionapp create --resource-group WebPubSubFunction --consumption-plan-location <REGION> --runtime node --runtime-version 18 --functions-version 4 --name <FUNCIONAPP_NAME> --storage-account <STORAGE_NAME>
    

    إشعار

    تحقق من وثائق إصدارات وقت تشغيل Azure Functions لتعيين --runtime-version المعلمة إلى القيمة المدعومة.

  5. انشر مشروع الدالة في Azure:

    بمجرد إنشاء تطبيق الوظائف في Azure، تكون الآن جاهزا لنشر مشروع الوظائف المحلية باستخدام الأمر func azure functionapp publish .

    func azure functionapp publish <FUNCIONAPP_NAME> --publish-local-settings
    

    إشعار

    نحن هنا ننشر الإعدادات المحلية local.settings.json مع معلمة الأمر--publish-local-settings. إذا كنت تستخدم Microsoft Azure Storage Emulator، يمكنك كتابة no لتخطي الكتابة فوق هذه القيمة على Azure باتباع رسالة المطالبة:App setting AzureWebJobsStorage is different between azure and local.settings.json, Would you like to overwrite value in azure? [yes/no/show]. بالإضافة إلى ذلك، يمكنك تحديث إعدادات Function App في مدخل Microsoft Azure ->الإعدادات ->Configuration.

  6. يمكنك الآن التحقق من موقعك من تطبيق Azure Function عن طريق الانتقال إلى عنوان URL: https://<FUNCIONAPP_NAME>.azurewebsites.net/api/index.

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

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

  1. من القائمة اليسرى في مدخل Azure، حدد مجموعات الموارد ثم حدد مجموعة الموارد التي أنشأتها. استخدم مربع البحث للعثور على مجموعة الموارد باسمها بدلا من ذلك.

  2. في النافذة التي تفتح، حدد resourceGroup، ثم حدد Delete resource group.

  3. في النافذة الجديدة، اكتب اسم resourceGroup المراد حذفها، ثم حدد Delete.

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

في هذا التشغيل السريع، تعلمت كيفية تشغيل تطبيق دردشة بلا خادم. الآن، يمكنك البدء في إنشاء تطبيقك.