Envoy و Apache APISIX: طريقة أخرى لتنفيذ Envoy Filter
API7.ai
December 16, 2020
طرق تنفيذ مرشح Envoy
مرشح Envoy
Envoy هو وكيل L7 وناقل اتصالات مصمم لهندسة الخدمات الحديثة الكبيرة. تتيح آلية سلسلة المرشحات القابلة للتوصيل كتابة مرشحات لأداء مهام مختلفة وإدراجها في الخادم الرئيسي.
طريقة التوسع
قد لا تلبي المرشحات الحالية متطلبات المستخدم المخصصة. في هذه الحالة، يحتاج Envoy إلى التوسع. قم بتخصيص مرشحات جديدة وفقًا لسلسلة المرشحات الحالية لتحقيق متطلبات التخصيص.
يمكن للمطورين توسيع Envoy بثلاث طرق:
صعوبة البدء | الاستقرار | كفاءة التطوير | النشر والترجمة | |
---|---|---|---|---|
C++ | عالية | مستقر | منخفضة | وقت طويل للترجمة |
Lua | منخفضة | مستقر | عالية | لا حاجة للترجمة، نشر مباشر |
WASM | متوسطة-عالية | غير مؤكد | يعتمد على اللغة | وقت الترجمة يعتمد على اللغة |
- استخدام C++ للتوسع
في هذه الطريقة، يتم كتابة كود C++ مباشرة على أساس Envoy لتعزيز الوظائف. بعد تنفيذ مرشح مخصص، يتم إعادة ترجمة الملف الثنائي الجديد لإكمال الترقية. هناك مشكلتان في هذه الطريقة:
- محدودية لغة C++، صعوبة البدء، ندرة المطورين.
- زيادة تعقيد النشر، التشغيل، والصيانة. سيصبح Envoy أثقل وأثقل، وكل تغيير يتطلب إعادة ترجمة الملف الثنائي، مما لا يساعد على التكرار والإدارة.
- استخدام Lua للتوسع
Lua مصممة لتكون مدمجة في التطبيق، لتوفير ميزات التوسع والتخصيص المرنة للتطبيق، وتستخدم على نطاق واسع.
يسمح مرشح Lua بتشغيل نصوص Lua في عملية الطلب والاستجابة. تشمل الميزات الرئيسية المدعومة حاليًا: فحص الرؤوس، الجسم، والمقطورات أثناء التدفق في تدفق الطلب أو الاستجابة؛ تعديل الرؤوس والمقطورات؛ حظر وتخزين جسم الطلب/الاستجابة الكامل للفحص؛ إجراء مكالمة HTTP غير متزامنة إلى مضيف أعلى؛ إجراء استجابة مباشرة وتخطي التكرار الإضافي للمرشح، إلخ.
حاليًا، يقوم الكثيرون بتوزيع كود Lua مباشرة في التكوين، مما لا يساعد على تنظيم وإدارة الكود، ويصعب مشاركته مع الآخرين لتشكيل نظام بيئي.
- استخدام 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.