Apache APISIX Serverless Plugin لأحداث Event Hooks

Bobur Umurzokov

Bobur Umurzokov

February 15, 2023

Technology

Apache APISIX هو بوابة API مفتوحة المصدر وعالية الأداء مبنية على Nginx. واحدة من ميزاته القوية هي القدرة على إنشاء وظائف بدون خادم (serverless functions)، وهي برامج صغيرة وحالة لا تحتوي على حالة (stateless) يمكنها توسيع وظائف Apache APISIX. في هذه المقالة، سنغطي أساسيات الإضافة serverless في Apache APISIX وكيف يمكن استخدامها لتنشيط وظائف بدون خادم استجابة للأحداث.

أهداف التعلم

ستتعلم ما يلي خلال المقالة:

  • ما هي إضافة Apache APISIX serverless؟
  • كيف تعمل إضافة serverless وكيفية استخدامها؟
  • حالات استخدام إضافة serverless.
  • كيف يمكنك استخدام إضافة serverless للدمج مع webhook.

ما هي إضافة Apache APISIX serverless؟

تسمح لك إضافة serverless في Apache APISIX لربط الأحداث بكتابة وظائف بدون خادم ودمجها في بوابة API. توفر الإضافة طريقة بسيطة ومرنة لتشغيل التعليمات البرمجية المخصصة استجابة للأحداث، دون الحاجة إلى إدارة البنية التحتية الأساسية.

تفصل إضافة serverless منطق التعامل مع الأحداث إلى وظائف بدون خادم منفصلة، مما يمكنك من تبسيط بنية API الخاصة بك وجعلها أسهل في الإدارة. يوفر Apache APISIX دعمًا لأطر العمل بدون خادم لمزودي السحابة الشهيرة مثل Azure Functions وAWS Lambda.

كيفية استخدام إضافة serverless؟

لاستخدام إضافة Apache APISIX serverless لربط الأحداث، ستحتاج إلى كتابة كود وظيفة بدون خادم بلغة Lua التي تنفذ المنطق الذي تريد تشغيله استجابة لحدث وتمكين إضافة serverless-pre-function أو serverless-post-function اعتمادًا على مراحل دورة الطلب-الاستجابة التي تختارها.

حاليًا، يدعم APISIX فقط Lua لكتابة كود الوظيفة. إذا كنت تفضل لغات برمجة أخرى، يمكنك دائمًا استخدام مشغلات الإضافات لإنشاء إضافة مخصصة من الصفر.

حالات استخدام إضافة serverless

فيما يلي بعض حالات استخدام إضافة Apache APISIX serverless لربط الأحداث:

  1. التوجيه الديناميكي: يمكن استخدام إضافة serverless لتوجيه طلبات API الواردة بشكل ديناميكي بناءً على معايير محددة، مثل طريقة الطلب أو مسار URL أو قيم الرؤوس. هذا يسمح لك بتنفيذ سيناريوهات التوجيه المعقدة بسهولة دون الحاجة إلى تعديل تكوين Apache APISIX الأساسي.

  2. المصادقة والتفويض: يمكنك استخدام إضافة serverless لتنفيذ عمليات التحقق من المصادقة والتفويض لـ API الخاصة بك. على سبيل المثال، يمكنك كتابة وظيفة بدون خادم تتحقق من وجود مفتاح API صالح في رؤوس الطلب قبل السماح للطلب بالاستمرار. أو يمكن استخدامها كخدمة تفويض خارجية مع دمج إضافة forward-auth.

  3. تحويل الطلب: يمكن استخدام إضافة serverless لتحويل طلبات API الواردة قبل معالجتها بواسطة الخدمة الخلفية. على سبيل المثال، يمكنك كتابة وظيفة بدون خادم تعدل رؤوس الطلب أو الجسم لتتناسب مع التنسيق المتوقع من الخدمة الخلفية.

  4. تحويل الاستجابة: يمكنك أيضًا استخدام إضافة serverless لتحويل الاستجابة من الخدمة الخلفية قبل إرسالها مرة أخرى إلى العميل. على سبيل المثال، يمكنك كتابة وظيفة بدون خادم تعدل رؤوس الاستجابة أو الجسم لتتناسب مع التنسيق المتوقع من العميل.

  5. التسجيل والمراقبة: يمكنك استخدام إضافة serverless لتنفيذ عمليات التسجيل والمراقبة لـ API الخاصة بك. على سبيل المثال، يمكنك كتابة وظيفة بدون خادم تسجل معلومات مفصلة عن كل طلب API، مثل طريقة الطلب وURL والرؤوس والجسم، لتحليلها لاحقًا.

دمج Apache APISIX مع webhooks (عرض توضيحي)

لدمج Apache APISIX مع webhooks، تحتاج إلى إنشاء وظيفة بدون خادم تستمع لطلبات POST الواردة إلى نقطة نهاية URL، وتتحقق مما إذا كانت طريقة الطلب هي POST، وترسل إشعار webhook إلى خدمة طرف ثالث كلما تم نشر رسالة جديدة.

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

APISIX يرسل طلب POST إلى webhook

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

  • تثبيت Docker على جهازك لتشغيل APISIX.
  • معرفة أساسية ببعض مفاهيم APISIX الأساسية مثل Route وUpstream وPlugin.

إعداد المشروع

أول شيء تقوم به هو استنساخ مشروع apisix-docker من GitHub:

git clone https://github.com/apache/apisix-docker.git

افتح مجلد المشروع في محرر الأكواد المفضل لديك. يستخدم هذا البرنامج التعليمي VS Code.

تثبيت وتشغيل Apache APISIX

لتشغيل Apache APISIX، يمكنك اتباع هذه الخطوات:

افتح نافذة طرفية جديدة وقم بتشغيل الأمر docker compose up من المجلد الجذر للمشروع:

docker compose up -d

سيقوم الأمر أعلاه بتشغيل Apache APISIX وetcd معًا باستخدام Docker.

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

تكوين وظيفة بدون خادم في Apache APISIX

لإعداد وظيفة بدون خادم في Apache APISIX، تحتاج إلى إنشاء route جديد لنقطة النهاية وتكوين إضافة serverless مع كود الوظيفة المخصصة بلغة Lua.

فيما يلي مثال لوظيفة بدون خادم بلغة Lua تستمع لطلبات POST الواردة إلى نقطة النهاية وترسل إشعار webhook:

function webhook(conf, ctx)

    -- استيراد المكتبات الضرورية
    local http = require("resty.http")
    local core = require("apisix.core")

    -- إرسال إشعار webhook فقط إذا كانت طريقة الطلب POST، وإلا تخطي وإرساله إلى الخدمة الخلفية كالمعتاد
    if core.request.get_method() == "POST" then
        -- إرسال إشعار webhook إلى URL المحدد
        local httpc = http.new()
        local res, err = httpc:request_uri("http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d", {
            method = "POST",
            headers = {
                ["Content-Type"] = "application/json"
            },
            body = core.request.get_body(),
        })
        -- التحقق من الاستجابة من webhook
        if not res then
            core.log.error("Failed to send webhook: ", err)
            return 500, err
        end
    end

    -- إعادة الاستجابة من الخدمة الخلفية
    return conf.status, conf.body
end

كما ترى في كود الوظيفة أعلاه، يقوم بإرسال طلبات POST بتنسيق JSON إلى URL معين مع جسم الطلب (جسم الطلب من العميل إلى بوابة API) كحمولة. يتم استخدام موقع اختبار webhooks لمحاكاة نقطة نهاية webhook الخاصة بنا: https://webhook.site.

لإنشاء وتعيين نقطة نهاية webhook الخاصة بك:

  1. قم بإنشاء URL عن طريق الانتقال إلى https://webhook.site في متصفح الويب الخاص بك.
  2. اختر نسخ إلى الحافظة بجوار Your unique URL.
  3. الصقه في طريقة request_uri لطلب HTTP في كود الوظيفة.

أيضًا، سيتم توجيه جميع الطلبات الأخرى بما في ذلك POST إلى الخدمة الخلفية. في الخطوة التالية، نقوم بتكوين route وupstream.

تكوين Route وUpstream

الآن سنقوم بإنشاء route جديد مع تمكين إضافة serverless وupstream يعمل كخدمتنا الخلفية.

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \
    -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
    -H 'Content-Type: application/json' \
    -d '{
    "uri": "/post",
    "plugins": {
        "serverless-pre-function": {
            "phase": "rewrite",
            "functions" : ["
                    return function(conf, ctx)
                        -- استيراد المكتبات الضرورية
                        local http = require(\"resty.http\")
                        local core = require(\"apisix.core\")

                        -- إرسال إشعار webhook فقط إذا كانت طريقة الطلب POST، وإلا تخطي وإرساله إلى الخدمة الخلفية كالمعتاد
                        if core.request.get_method() == \"POST\" then
                            -- إرسال إشعار webhook إلى URL المحدد
                            local httpc = http.new()
                            local res, err = httpc:request_uri(\"http://webhook.site/9db3d3a0-ab64-4142-a39f-d4852ca50f8d\", {
                                method = \"POST\",
                                headers = {
                                    [\"Content-Type\"] = \"application/json\"
                                },
                                body = core.request.get_body(),
                            })
                            -- التحقق من الاستجابة من webhook
                            if not res then
                                core.log.error(\"Failed to send webhook: \", err)
                                return 500, err
                            end
                        end

                        -- إعادة الاستجابة من الخدمة الخلفية
                        return conf.status, conf.body
                    end"]
        }
    },
    "upstream": {
        "nodes": {
            "httpbin.org:80": 1
        },
        "type": "roundrobin"
    }
}'

في مثال تكوين route السابق، قمنا بإنشاء أول route لدينا عن طريق إرسال طلب curl إلى واجهة برمجة تطبيقات الإدارة في APISIX. في جسم طلب Route، حددنا أن أي طلبات إلى المسار /post ستشغل كود الوظيفة بدون خادم وسيتم توجيهها لاحقًا إلى الهدف httpbin.org. هذا يعني أن الطلب سيتم توجيهه إلى نقطة النهاية httpbin.org/post بعد التحقق مما إذا كانت طريقة الطلب هي POST وما إذا كان يجب إرسال الحدث إلى نقطة نهاية webhook للخدمة الخارجية أم لا. يمكن استبدال الخدمة الخلفية بخدمتك الخلفية.

قد تلاحظ أيضًا أننا أضفنا كود الوظيفة إلى خاصية functions في serverless-pre-function في كائن Json.

اختبار التكوين

أخيرًا، نقوم باختبار استدعاء نقطة نهاية /post في بوابة API لمعرفة ما إذا كان كل شيء يعمل كما هو متوقع وسيتم إرسال حدث POST إلى موقع webhook.

curl -i http://127.0.0.1:9080/post -X POST -d \
'{
   "message": "A new webhook message"
}'

بعد ذلك، انتقل إلى URL webhook من صفحة https://webhook.site التي قمت بإنشائها في الخطوات السابقة. يجب أن ترى طلب POST، يخطر نقطة نهاية webhook الخاصة بنا حول الحدث ويرسل جسم الطلب.

APISIX يرسل الحمولة إلى webhook

بالإضافة إلى ذلك، نحصل على الاستجابة من الخدمة الخلفية الوهمية httpbin.org:

HTTP/1.1 200 OK
Content-Type: application/json

{
  ...
  "form": {
    "{\n   \"message\": \"A new webhook message\"\n}": ""
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "41",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "127.0.0.1",
    "X-Forwarded-Host": "127.0.0.1"
  },
  "json": null,
  "url": "http://127.0.0.1/post"
}

من الواضح أنه إذا قمت بإرسال طلبات HTTP بطرق أخرى غير POST، فلن يتم تشغيل كود الوظيفة بدون خادم لإرسال نقطة نهاية webhook.

هذا مثال أساسي لإعداد وظيفة بدون خادم في Apache APISIX. يمكنك توسيع هذه الوظيفة عن طريق إضافة منطق أكثر تعقيدًا إلى وظيفتك بدون خادم مثل تشغيل وظيفة أخرى استجابة لـ webhooks.

الخلاصة

توفر إضافة Apache APISIX serverless لربط الأحداث طريقة مرنة وقابلة للتوسع لتنشيط وظائف بدون خادم استجابة للأحداث التي تحدث أثناء معالجة طلبات API. باستخدام الإضافة، يمكنك تبسيط بنية API الخاصة بك، وتحسين أداء وموثوقية خدماتك، وتقليل تكلفة إدارة بنية التطبيق الخاصة بك.

موارد ذات صلة

محتوى موصى به

المجتمع

🙋 انضم إلى مجتمع Apache APISIX 🐦 تابعنا على Twitter 📝 ابحث عننا على Slack

Tags: