كيفية إدارة حزم الطرف الثالث لـ OpenResty من خلال LuaRocks و OPM؟
API7.ai
September 17, 2022
في المقالة السابقة، حصلنا على نظرة عامة على بعض مشاريع OpenResty الرسمية. ومع ذلك، إذا استخدمنا OpenResty في بيئة الإنتاج، فإن هذه المكتبات التي تأتي مع حزمة OpenResty تكون غير كافية. على سبيل المثال، لا توجد مكتبة lua-resty
لإرسال طلبات HTTP، ولا توجد طريقة للتفاعل مع Kafka.
إذن ماذا يجب أن نفعل؟
لأن OpenResty ليس نسخة من NGINX، ولا هو إعادة تعبئة لـ NGINX مع بعض المكتبات القياسية، بل هو مجرد استخدام لـ NGINX كـ مكتبة شبكات أساسية.
عند استخدام NGINX، لا تفكر في كيفية بدء طلبات HTTP مخصصة وكيفية التفاعل مع Kafka. وفي عالم OpenResty، بفضل cosocket
، يمكن للمطورين كتابة lua-resty-http
و lua-resty-kafka
بسرعة للتعامل مع هذه الاحتياجات، تمامًا كما يمكنك القيام به مع لغات التطوير مثل Python، PHP، إلخ.
نصيحة أخرى لك: يجب ألا تستخدم أي مكتبات من عالم Lua لحل المشكلات المذكورة أعلاه، بل استخدم مكتبات lua-resty-*
التي تعتمد على cosocket
. المكتبات من عالم Lua قد تسبب انسدادًا، مما يؤدي إلى انخفاض أداء الخدمة عالية الأداء بشكل كبير. هذا خطأ شائع للمبتدئين في OpenResty ولا يلاحظ بسهولة.
إذن كيف نجد هذه المكتبات غير المسببة للانسداد lua-resty-*
؟ بعد ذلك، دعني أقدم لك الطرق التالية.
OPM
OPM (مدير حزم OpenResty) هو مدير الحزم الذي يأتي مع OpenResty ويمكن استخدامه بعد تثبيت OpenResty. يمكننا محاولة العثور على المكتبة التي ترسل طلبات HTTP باستخدام الأمر opm search http
.
قد يكون الاستعلام بطيئًا في المرة الأولى، عادةً ما يستغرق بضع ثوانٍ. opm.openresty.org سيقوم بالاستعلام من قاعدة بيانات PostgreSQL وتخزين النتائج مؤقتًا لفترة.
openresty/lua-resty-upload قارئ ومحلل تدفقي لتحميل ملفات HTTP يعتمد على ngx_lua cosocket
عندما ترى هذه النتيجة، قد تتساءل: ما علاقة حزمة lua-resty-upload
بإرسال HTTP؟
اتضح أنه عند البحث في OPM، يتم البحث في كل من اسم الحزمة وملف تعريف الحزمة باستخدام الكلمة المفتاحية الأخيرة. هذا هو السبب في أن البحث أعلاه يستغرق بضع ثوانٍ. يقوم بالبحث النصي الكامل داخل PostgreSQL.
ولكن، على أي حال، هذه النتيجة ليست ودية. دعونا نعدل الكلمة المفتاحية ونبحث مرة أخرى.
$ opm search lua-resty-http
ledgetech/lua-resty-http عميل HTTP لـ Lua يعتمد على cosocket لـ OpenResty/ngx_lua
pintsized/lua-resty-http عميل HTTP لـ Lua يعتمد على cosocket لـ OpenResty/ngx_lua
agentzh/lua-resty-http عميل HTTP لـ Lua يعتمد على cosocket لـ OpenResty/ngx_lua
في عالم OpenResty، إذا قمت بتنفيذ حزمة باستخدام cosocket
، يجب عليك استخدام البادئة lua-resty
، وهي قاعدة غير مكتوبة.
بالنظر إلى نتائج البحث، يستخدم OPM عنوان مستودع GitHub للمساهم كاسم الحزمة، أي معرف GitHub / اسم المستودع. يعرض ثلاث مكتبات lua-resty-http
تابعة لجهات خارجية. أي منها يجب أن نختار؟
قبل اختيار الحزمة، دعنا ننظر إلى عدد النجوم ووقت التحديث الأخير: عدد النجوم قليل؛ آخر تحديث كان في 2016. هذه حفرة مهجورة. بالنظر بشكل أعمق، pintsized/lua-resty-http
و ledgetech/lua-resty-http
يشيران إلى نفس المستودع. لذا لا يهم أي منهما تختار، فهما نفس الشيء.
أيضًا، موقع OPM بسيط نسبيًا ولا يوفر عدد مرات تنزيل الحزمة أو التبعيات لهذه الحزمة. سيكون من المفيد قضاء المزيد من الوقت في معرفة أي مكتبات lua-resty
هي المناسبة للاستخدام، بينما يجب أن تكون هذه مهمة الحافظ.
LuaRocks
LuaRocks هو مدير حزم آخر لعالم OpenResty، وُلد قبل OPM. على عكس OPM الذي يحتوي فقط على الحزم المتعلقة بـ OpenResty، يحتوي LuaRocks أيضًا على مكتبات من عالم Lua. على سبيل المثال، LuaSQL-MySQL في LuaRocks هي حزمة للاتصال بـ MySQL في عالم Lua ولا يمكن استخدامها في OpenResty.
لا يزال باستخدام مكتبة HTTP
كمثال، دعنا نحاول استخدام LuaRocks للعثور عليها.
$ luarocks search http
كما ترى، يعرض أيضًا مجموعة من الحزم.
دعونا نغير الكلمة المفتاحية مرة أخرى.
$ luarocks search lua-resty-http
هذه المرة تم إرجاع حزمة واحدة فقط. يمكننا الذهاب إلى موقع LuaRocks والنظر في تفاصيل هذه الحزمة. هنا لقطة شاشة لصفحة الموقع.
تحتوي لقطة الشاشة أعلاه على المؤلف، الرخصة، عنوان GitHub، عدد التنزيلات، ملخص الميزات، تاريخ الإصدارات، التبعيات، إلخ. على عكس OPM، لا يستخدم LuaRocks معلومات مستخدم GitHub مباشرة، بل يتطلب من المطورين التسجيل في LuaRocks بشكل منفصل.
مشروع بوابة API المفتوح المصدر، Apache APISIX، يستخدم LuaRocks لإدارة الحزم. دعنا نلقي نظرة سريعة على كيفية كتابة تكوين إدارة الحزم في APISIX.
الإصدار الأخير من APISIX هو 2.15، ويمكنك العثور على ملف apisix-2.15.0-0.rockspec
تحت مشروع Apache APISIX.
package = "apisix"
version = "2.15.0-0"
supported_platforms = {"linux", "macosx"}
source = {
url = "git://github.com/apache/apisix",
branch = "2.15.0",
}
description = {
summary = "Apache APISIX هو بوابة API للخدمات المصغرة السحابية، يوفر الأداء الأمثل، الأمان، المصدر المفتوح، ومنصة قابلة للتوسيع لجميع واجهات برمجة التطبيقات والخدمات المصغرة الخاصة بك.",
homepage = "https://github.com/apache/apisix",
license = "Apache License 2.0",
}
dependencies = {
"lua-resty-ctxdump = 0.1-0",
"lua-resty-dns-client = 6.0.2",
"lua-resty-template = 2.0",
"lua-resty-etcd = 1.8.2",
"api7-lua-resty-http = 0.2.0",
"lua-resty-balancer = 0.04",
"lua-resty-ngxvar = 0.5.2",
"lua-resty-jit-uuid = 0.0.7",
"lua-resty-healthcheck-api7 = 2.2.0",
"api7-lua-resty-jwt = 0.2.4",
"lua-resty-hmac-ffi = 0.05",
"lua-resty-cookie = 0.1.0",
"lua-resty-session = 3.10",
"opentracing-openresty = 0.1",
"lua-resty-radixtree = 2.8.2",
"lua-protobuf = 0.3.4",
"lua-resty-openidc = 1.7.5",
"luafilesystem = 1.7.0-2",
"api7-lua-tinyyaml = 0.4.2",
"nginx-lua-prometheus = 0.20220527",
"jsonschema = 0.9.8",
"lua-resty-ipmatcher = 0.6.1",
"lua-resty-kafka = 0.20-0",
"lua-resty-logger-socket = 2.0.1-0",
"skywalking-nginx-lua = 0.6.0",
"base64 = 1.5-2",
"binaryheap = 0.4",
"api7-dkjson = 0.1.1",
"resty-redis-cluster = 1.02-4",
"lua-resty-expr = 1.3.1",
"graphql = 0.0.2",
"argparse = 0.7.1-1",
"luasocket = 3.0rc1-2",
"luasec = 0.9-1",
"lua-resty-consul = 0.3-2",
"penlight = 1.9.2-1",
"ext-plugin-proto = 0.5.0",
"casbin = 1.41.1",
"api7-snowflake = 2.0-1",
"inspect == 3.1.1",
"lualdap = 1.2.6-1",
"lua-resty-rocketmq = 0.3.0-0",
"opentelemetry-lua = 0.1-3",
"net-url = 0.9-1",
"xml2lua = 1.5-2",
"nanoid = 0.1-1",
"lua-resty-mediador = 0.1.2-1"
}
build = {
type = "make",
build_variables = {
CFLAGS="$(CFLAGS)",
LIBFLAG="$(LIBFLAG)",
LUA_LIBDIR="$(LUA_LIBDIR)",
LUA_BINDIR="$(LUA_BINDIR)",
LUA_INCDIR="$(LUA_INCDIR)",
LUA="$(LUA)",
OPENSSL_INCDIR="$(OPENSSL_INCDIR)",
OPENSSL_LIBDIR="$(OPENSSL_LIBDIR)",
},
install_variables = {
ENV_INST_PREFIX="$(PREFIX)",
ENV_INST_BINDIR="$(BINDIR)",
ENV_INST_LIBDIR="$(LIBDIR)",
ENV_INST_LUADIR="$(LUADIR)",
ENV_INST_CONFDIR="$(CONFDIR)",
},
}
كما ترى من الملف، يتم خلط التبعيات مع مكتبات lua-resty-*
ومكتبات من عالم Lua النقي، والتي يمكن تثبيتها جزئيًا فقط باستخدام OPM. بعد كتابة التكوين، استخدم أمر التحميل في LuaRocks
لتحميل هذا التكوين، ويمكن للمستخدم استخدام LuaRocks
لتنزيل وتثبيت APISIX.
يدعم LuaRocks
هذا. يمكنك تحديد مسار واسم كود المصدر C في ملف .rockspec
، وسيقوم LuaRocks بتجميعه محليًا لك. OPM لا يدعم هذه الميزة بعد.
awesome-resty
مشروع awesome-resty يحافظ على جميع الحزم المتاحة تقريبًا لـ OpenResty، ويتم تنظيمها في فئات. هذا هو أفضل مكان للذهاب إليه عندما لا تكون متأكدًا من وجود حزمة تابعة لجهة خارجية مناسبة.
لنأخذ مكتبة HTTP كمثال. في awesome-resty
تنتمي بشكل طبيعي إلى فئة networking.
lua-resty-http by @pintsized — عميل HTTP لـ Lua يعتمد على cosocket لـ OpenResty / ngx_lua
lua-resty-http by @liseen — عميل HTTP لـ Lua يعتمد على واجهة برمجة التطبيقات cosocket لـ ngx_lua
lua-resty-http by @DorianGray — عميل HTTP لـ Lua يعتمد على واجهة برمجة التطبيقات cosocket لـ ngx_lua
lua-resty-http-simple — عميل HTTP بسيط لـ Lua يعتمد على ngx_lua
lua-resty-httpipe — عميل HTTP لـ Lua يعتمد على cosocket لـ OpenResty / ngx_lua
lua-resty-httpclient — مكتبة عميل HTTP غير مسدودة لـ Lua لـ aLiLua & ngx_lua
lua-httpcli-resty — وحدة عميل HTTP لـ Lua لـ OpenResty
lua-resty-requests — مكتبة HTTP أخرى لـ OpenResty
نرى أن هناك ثماني مكتبات تابعة لجهات خارجية لـ lua-resty-http
. بالمقارنة مع النتائج السابقة، وجدنا فقط 2 باستخدام OPM وواحدة فقط في LuaRocks. ومع ذلك، إذا كان من الصعب الاختيار، استخدم الأولى، وهي نفسها الموجودة في LuaRocks.
للمهندسين الذين يرغبون في التجربة، أوصي بالمكتبة الأخيرة: lua-resty-requests، وهي مكتبة وصول HTTP أكثر ملاءمة للإنسان بنفس نمط واجهة برمجة التطبيقات الشهيرة Requests لـ Python. إذا كنت من محبي Python مثلي، فستحب lua-resty-requests
، وهي من تأليف tokers
النشط في مجتمع OpenResty حتى تتمكن من استخدامها بثقة.
الخلاصة
لكي يزدهر مشروع مفتوح المصدر، يحتاج ليس فقط إلى تقنية قوية، وثائق جيدة، واختبارات كاملة، ولكن أيضًا إلى نظام بيئي يجمع المزيد من المطورين والشركات. كما قال أسلوب Apache: المجتمع فوق الكود.
لا توجد مواد تعليمية منهجية لـ OpenResty، ولا دليل كود رسمي، والعديد من نقاط التحسين مكتوبة في المشروع المفتوح المصدر. ولكن معظم المطورين يعرفون ما يتحدثون عنه ولكن لا يعرفون السبب. هذا هو الغرض من هذا الكتاب الإلكتروني. بعد تعلمه، آمل أن تتمكن من كتابة كود OpenResty أكثر كفاءة والمشاركة بشكل أكثر فعالية في المشاريع المفتوحة المصدر المتعلقة بـ OpenResty، على سبيل المثال، Apache APISIX.
ما رأيك في نظام OpenResty البيئي؟ لا تتردد في ترك تعليق، ودعنا نتحدث عنه. أيضًا، مرحبًا بمشاركة هذه المقالة.