Envoy و Apache APISIX: طريقة أخرى لتنفيذ Envoy Filter

API7.ai

December 16, 2020

Technology

طرق تنفيذ مرشح Envoy

مرشح Envoy

Envoy هو وكيل L7 وناقل اتصالات مصمم لهندسة الخدمات الحديثة الكبيرة. تتيح آلية سلسلة المرشحات القابلة للتوصيل كتابة مرشحات لأداء مهام مختلفة وإدراجها في الخادم الرئيسي.

مرشح Envoy

طريقة التوسع

قد لا تلبي المرشحات الحالية متطلبات المستخدم المخصصة. في هذه الحالة، يحتاج Envoy إلى التوسع. قم بتخصيص مرشحات جديدة وفقًا لسلسلة المرشحات الحالية لتحقيق متطلبات التخصيص.

يمكن للمطورين توسيع Envoy بثلاث طرق:

صعوبة البدءالاستقراركفاءة التطويرالنشر والترجمة
C++عاليةمستقرمنخفضةوقت طويل للترجمة
Luaمنخفضةمستقرعاليةلا حاجة للترجمة، نشر مباشر
WASMمتوسطة-عاليةغير مؤكديعتمد على اللغةوقت الترجمة يعتمد على اللغة
  1. استخدام C++ للتوسع

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

  • محدودية لغة C++، صعوبة البدء، ندرة المطورين.
  • زيادة تعقيد النشر، التشغيل، والصيانة. سيصبح Envoy أثقل وأثقل، وكل تغيير يتطلب إعادة ترجمة الملف الثنائي، مما لا يساعد على التكرار والإدارة.
  1. استخدام Lua للتوسع

Lua مصممة لتكون مدمجة في التطبيق، لتوفير ميزات التوسع والتخصيص المرنة للتطبيق، وتستخدم على نطاق واسع.

يسمح مرشح Lua بتشغيل نصوص Lua في عملية الطلب والاستجابة. تشمل الميزات الرئيسية المدعومة حاليًا: فحص الرؤوس، الجسم، والمقطورات أثناء التدفق في تدفق الطلب أو الاستجابة؛ تعديل الرؤوس والمقطورات؛ حظر وتخزين جسم الطلب/الاستجابة الكامل للفحص؛ إجراء مكالمة HTTP غير متزامنة إلى مضيف أعلى؛ إجراء استجابة مباشرة وتخطي التكرار الإضافي للمرشح، إلخ.

حاليًا، يقوم الكثيرون بتوزيع كود Lua مباشرة في التكوين، مما لا يساعد على تنظيم وإدارة الكود، ويصعب مشاركته مع الآخرين لتشكيل نظام بيئي.

  1. استخدام WASM للتوسع

يمكن للمطورين كتابة المرشحات بلغتهم البرمجية المفضلة، وترجمتها إلى تنسيق WASM باستخدام الأدوات، ودمجها في Envoy لتشغيلها.

يدعم حاليًا عددًا قليلاً من اللغات، واستخدام هذه اللغات للتوسع ليس بهذه البساطة. من ناحية أخرى، لا يزال الكثيرون لديهم تحفظات حول WASM وقد لا يستخدمونه مباشرة.

حل Apache APISIX

بناءً على التحليل أعلاه، نرى أن Lua مناسب جدًا لتوسيع Envoy، وسهل التعلم، وكفاءة التطوير عالية جدًا. لأنه مدمج في Envoy، فلا يوجد تكلفة شبكة إضافية، والأداء جيد.

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

Apache APISIX هو بوابة API ديناميكية، في الوقت الفعلي، عالية الأداء، مبنية على مكتبة Nginx وLua. يوفر Apache APISIX ميزات إدارة حركة مرور غنية مثل موازنة الحمل، المصدر الديناميكي، الإصدار التجريبي، كسر الدائرة، المصادقة، المراقبة، والمزيد.

مثال

يرجى التحقق من المستودع للكود المحدد وكيفية التشغيل: https://github.com/api7/envoy-apisix.

التكوين ذو الصلة لـ Envoy هو كما يلي:

تحديد مرشح:

http_filters:
  - name: entry.lua
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
      source_codes:
        entry.lua:
          filename: /apisix/entry.lua

تمكين المرشح لمسار وتكوينه مع البيانات الوصفية:

routes:
  - match:
      prefix: "/foo"
    route:
      cluster: web_service
    typed_per_filter_config:
      envoy.filters.http.lua:
        "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute
        name: entry.lua
    metadata:
      filter_metadata:
        envoy.filters.http.lua:
          plugins:
            - name: uri-blocker
              conf:
                rejected_code: 403
                block_rules:
                  - root.exe
                  - root.m+

كيف يعمل

لا نحتاج إلى إجراء تغييرات كبيرة على Envoy، فقط بعض التحسينات المناسبة للاحتياجات العامة.

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

مخطط الهندسة

نستخدم المثال السابق لإظهار كيفية تشغيل الإضافة:

عملية تشغيل الإضافة

الخطوة الأولى، قراءة التكوين

نقوم بالتكوين من خلال البيانات الوصفية لتحديد الإضافات التي تحتاج إلى التشغيل على كل مسار وما هو التكوين لكل إضافة. في المثال، قمنا بتكوين إضافة uri-blocker للمسار الذي يبدأ بـ /foo، بالإضافة إلى قاعدة الحظر للإضافة وحالة الاستجابة عند الحاجة إلى الحظر.

الخطوة الثانية، تحليل الطلب

نقوم بتغليف بيانات طلب العميل في ctx بحيث يمكن استخدامها مباشرة في العملية بأكملها.

الخطوة الثالثة، تشغيل الإضافة

نحدد ما إذا كنا بحاجة إلى حظر هذا الطلب من خلال مطابقة القواعد المكونة والـ URI الذي تم الحصول عليه. إذا كان الحظر مطلوبًا، نستدعي respond للاستجابة مباشرة، وإلا نسمح له بالمرور.

التطلعات المستقبلية

المزيد والمزيد من إضافات APISIX ستكون متاحة للتشغيل على Envoy، وفي النهاية جميع إضافات APISIX (حتى تلك التي سيتم تطويرها في المستقبل) ستكون متاحة للتشغيل على Envoy.

في نفس الوقت، نأمل أن نعمل مع مجتمع Envoy في اتجاه Lua Filter، لتحسين وتعزيز Lua Filter، وتعزيز قدرات توسيع Envoy، وتقليل صعوبة توسيع Envoy.

Tags: