APISIX के लिए Lua और ChatGPT के साथ कस्टम प्लगइन डेवलपमेंट
June 12, 2023
Apache APISIX की एक प्रमुख विशेषता प्लगइन्स के माध्यम से इसकी विस्तारशीलता है। APISIX आपको अतिरिक्त कार्यक्षमताएं जोड़ने और API ट्रैफ़िक को अधिक कुशलता से प्रबंधित करने के लिए अपना स्वयं का कस्टम प्लगइन बनाने की अनुमति देता है। अक्सर, आप नए प्लगइन्स को लागू करने के लिए Lua प्रोग्रामिंग भाषा का उपयोग करते हैं या प्लगइन रनर्स का उपयोग करके अपनी पसंदीदा प्रोग्रामिंग भाषा में प्लगइन्स विकसित करते हैं। हालांकि, APISIX का Lua के लिए सबसे अच्छा समर्थन है। APISIX के लिए Lua में कुछ प्लगइन्स लिखने के बाद, मैंने समझा कि जब आपका ChatGPT दोस्त हमेशा आपके साथ होता है, तो आपको Lua प्रोग्रामिंग के मूल सिद्धांतों को जानने या इस भाषा में विशेषज्ञ होने की आवश्यकता नहीं है। उदाहरण के लिए, Java और C# में मेरी पृष्ठभूमि के साथ, मैं Lua में लिखे गए कोड और तर्क को समझ सकता हूं और मेरा मानना है कि आप भी ऐसा कर सकते हैं।
यह लेख आपको Lua और ChatGPT का उपयोग करके APISIX के लिए एक नया कस्टम प्लगइन file-proxy विकसित करने की प्रक्रिया के माध्यम से मार्गदर्शन करेगा (हम इसका उपयोग कुछ Lua कोड लिखने के लिए करते हैं)। यह प्लगइन API के माध्यम से स्थिर फ़ाइलों को एक्सपोज़ करने और निर्दिष्ट URL से एक फ़ाइल प्राप्त करने के लिए उपयोग किया जाएगा।
APISIX को Nginx की मौजूदा कार्यक्षमताओं को बढ़ाने के लिए बनाया गया था, और Nginx पुन: प्रयोज्य Lua मॉड्यूल्स का एक संग्रह प्रदान करता है जिसका APISIX उपयोग करता है।
सीखने के उद्देश्य
आप इस लेख के माध्यम से निम्नलिखित सीखेंगे:
- एक नया file-proxy प्लगइन कैसे विकसित करें।
- Lua कोड उत्पन्न करने के लिए ChatGPT का कुशलता से उपयोग कैसे करें।
- APISIX के लिए अपना स्वयं का प्लगइन बनाने के चरण।
नया file proxy प्लगइन उपयोग-मामला
वास्तविक प्लगइन कार्यान्वयन में कूदने से पहले, आइए पहले समझते हैं कि हमें इस प्लगइन की आवश्यकता क्यों है। इस पोस्ट को लिखते समय, APISIX एक समान मामले के लिए एक बिल्ट-इन प्लगइन प्रदान नहीं कर सकता है। इसलिए हम एक नया बनाने जा रहे हैं। अक्सर, हम एक स्थिर फ़ाइल (Yaml, JSON, JavaScript, CSS, या छवि फ़ाइलें) को API के माध्यम से एक्सपोज़ करना चाहते हैं।
उदाहरण के लिए, APISIX API गेटवे आपके एप्लिकेशन में रूट आने वाले अनुरोधों को कई API एंडपॉइंट्स पर भेजने के लिए एक फ्रंट डोर के रूप में कार्य करता है, यह सही स्थान है सभी सर्वर URLs, पथ, पैरामीटर्स, प्रत्येक API एंडपॉइंट के इनपुट और आउटपुट का विवरण परिभाषित करने के लिए। और आप API को दस्तावेज़ करने के लिए OpenAPI specifications बनाते हैं। OpenAPI .yaml फ़ाइल एक मानचित्र की तरह है जो आपके API उपयोगकर्ता को आपके API को समझने और इंटरैक्ट करने में मार्गदर्शन करती है। प्लगइन को openapi.yaml फ़ाइल का पथ (जहां यह आपके सर्वर पर संग्रहीत है) प्रदान करके, आप फ़ाइल को सीधे अपने API गेटवे के माध्यम से प्राप्त और प्रदान कर सकते हैं, जो API उपभोक्ताओं के लिए एक सुसंगत इंटरफ़ेस प्रदान करता है। तब आपके API उपयोगकर्ता निर्दिष्ट URL (https://example.com/openapi.yaml) पर .yaml फ़ाइल तक पहुंच सकते हैं।
और भी उपयोग मामले हैं, आप इस file-proxy प्लगइन का उपयोग एक सरल कंटेंट डिलीवरी नेटवर्क (CDN) प्रतिस्थापन के लिए कर सकते हैं। यदि आपके पास एक छोटे पैमाने का एप्लिकेशन है और आप एक पूर्ण-विकसित CDN का उपयोग नहीं करना चाहते हैं, तो आप file-proxy प्लगइन का उपयोग करके एक विशिष्ट स्थान से स्थिर फ़ाइलें प्रदान कर सकते हैं। file-proxy प्लगइन का उपयोग फ़ाइलों के लिए एक कैशिंग लेयर के रूप में किया जा सकता है। यदि आपके पास ऐसी फ़ाइलें हैं जिन्हें प्राप्त करना या उत्पन्न करना महंगा है, तो आप प्लगइन का उपयोग करके फ़ाइल को एक बार प्राप्त कर सकते हैं और फिर बाद के अनुरोधों के लिए कैश्ड संस्करण प्रदान कर सकते हैं।
file-proxy प्लगइन विकसित करने के चरण
हम APISIX को स्थानीय रूप से चलाने जा रहे हैं और हमारा API गेटवे http://localhost:9080 पर होस्ट किया जाएगा। जब विकास तैयार हो जाएगा, तो आप इसे अपने सर्वर या किसी क्लाउड प्रदाता पर तैनात कर सकते हैं। मूल रूप से, हम एक फ़ाइल openapi.yaml को http://localhost:9080/openapi.yaml पथ पर रखना चाहते हैं। आप सीखेंगे कि इसे कैसे प्राप्त किया जाए।
पूर्वापेक्षाएँ
- शुरू करने से पहले, APISIX की बुनियादी समझ होना अच्छा है। API गेटवे और इसके मुख्य अवधारणाओं जैसे रूट्स, अपस्ट्रीम, एडमिन API, प्लगइन्स से परिचित होना। HTTP प्रोटोकॉल की बुनियादी समझ भी लाभदायक है।
- Docker का उपयोग कंटेनराइज़्ड etcd और APISIX स्थापित करने के लिए किया जाता है।
- curl का उपयोग APISIX एडमिन API को अनुरोध भेजने के लिए किया जाता है। आप API के साथ इंटरैक्ट करने के लिए Postman जैसे टूल्स का भी उपयोग कर सकते हैं।
डेमो प्रोजेक्ट और फ़ाइलों को समझें
हम GitHub पर मौजूदा file-proxy डेमो प्रोजेक्ट का उपयोग करेंगे। इसकी संरचना मौजूदा Apisix docker उदाहरण रेपो के समान है, केवल हमने डेमो को सरल रखने के लिए अनावश्यक फ़ाइलों को हटा दिया है। प्रोजेक्ट में 3 फ़ोल्डर्स, docker-compose.yml, और नमूना openapi.yaml फ़ाइलें हैं।
- docker-compose.yml दो कंटेनर्स को परिभाषित करता है, एक APISIX के लिए और दूसरा etcd के लिए (जो APISIX के लिए कॉन्फ़िगरेशन स्टोरेज है)।
- custom-plugins फ़ोल्डर में Lua में file-proxy प्लगइन का कार्यान्वयन है। हम इसे निम्नलिखित अनुभागों में समीक्षा करेंगे।
- openapi.yaml केवल एक नमूना OpenAPI स्पेसिफिकेशन है जिसे हम एक्सपोज़ करते हैं।
file-proxy प्लगइन को लागू करें
हम ChatGPT से पूछकर शुरू करते हैं कि APISIX के लिए Lua में एक कस्टम file-proxy प्लगइन कैसे लागू किया जाए। ChatGPT एक गाइड उत्पन्न करता है जो वास्तविक कार्यान्वयन के समान है, लेकिन उत्तर बहुत अमूर्त है और जब आप प्रक्रिया का पालन करते हैं, तो आप एक गैर-कार्यशील प्लगइन के साथ समाप्त हो जाएंगे। हालांकि, यह हमें उपयोगी Lua कोड निकालने में मदद करता है। यदि हम प्लगइन्स विकसित करने की वास्तविक प्रक्रिया को जानते हैं, तो दोनों ज्ञान को व्यवहार में जोड़ना आसान होगा।

1. एक Lua फ़ाइल बनाएं
हम प्रोजेक्ट के /custom-plugins डायरेक्टरी में एक नई खाली Lua फ़ाइल बनाते हैं। फ़ाइल का नाम हमारे प्लगइन के नाम के समान होना चाहिए। उदाहरण के लिए, यदि आपका प्लगइन file-proxy नामक है, तो आपको file-proxy.lua नामक एक फ़ाइल बनानी चाहिए।
2. APISIX में प्लगइन को पंजीकृत करें
APISIX को यह जानना आवश्यक है कि यह प्लगइन फ़ाइल कहाँ स्थित है और तदनुसार प्लगइन को चला सकता है। ऐसा करने के लिए, हमें पहले फ़ाइल पथ को परिभाषित करना चाहिए जहां APISIX file-proxy.lua फ़ाइल को ढूंढता है, इसे APISIX के extra_lua_path विशेषता में config.yaml** में जोड़कर।
apisix: extra_lua_path: "/opt/?.lua" node_listen: 9080
अब आप पूछ सकते हैं कि फ़ाइल पथ /opt/?.lua क्यों सेट किया गया है। क्योंकि हम APISIX को docker का उपयोग करके चलाते हैं। आप docker-compose.yml फ़ाइल में देख सकते हैं कि वहां 3 वॉल्यूम हैं ./custom-plugins:/opt/apisix/plugins:ro
volumes: - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro - ./openapi.yaml:/usr/local/apisix/conf/openapi.yaml:ro - ./custom-plugins:/opt/apisix/plugins:ro
यह स्थानीय डायरेक्टरी ./custom-plugins को डॉकर कंटेनर में /opt/apisix/plugins पथ पर एक रीड-ओनली वॉल्यूम के रूप में माउंट करता है जहां हमारी file-proxy.lua फ़ाइल कस्टम प्लगइन कार्यान्वयन के साथ है। यह कस्टम प्लगइन को APISIX में रनटाइम में जोड़ने की अनुमति देता है जो डॉकर के अंदर /opt/?.lua में एक और पथ पर है। इसी तरह, अन्य दो फ़ाइलें जिन्हें हमने डॉकर फ़ोल्डर्स में कॉपी किया है।
अगला कदम, हम APISIX प्लगइन्स सूची में प्लगइन को सक्षम करते हैं। यह APISIX कॉन्फ़िगरेशन फ़ाइल (config.yaml) में plugins सूची में प्लगइन नाम जोड़कर किया जाता है:
plugins: - file-proxy
ध्यान दें कि यह क्रिया config-default.yaml में निर्दिष्ट सभी मौजूदा डिफ़ॉल्ट प्लगइन्स को ओवरराइड कर देगी। यदि आप अपने कस्टम प्लगइन को संयोजन के साथ उपयोग करना चाहते हैं, तो आपको अन्य प्लगइन्स को उनके नाम से मैन्युअल रूप से जोड़ना होगा।
3. File proxy प्लगइन Lua कोड ब्रेकडाउन
अब तक, हमने केवल प्लगइन को पंजीकृत किया है जो कुछ भी नहीं करता है। इसे लागू करने का समय आ गया है। प्लगइन लॉजिक को Lua फ़ंक्शन्स के रूप में लागू किया जाता है। आप file-proxy.lua में देख सकते हैं कि यह कैसे किया गया है।
आइए file-proxy.lua फ़ाइल को तोड़ें ताकि कोड की संरचना और प्रवाह को बेहतर ढंग से समझ सकें जो आपको अपने स्वयं के नए प्लगइन्स बनाने में मदद करेगा। आप बस ChatGPT से Lua कोड समझाने के लिए कह सकते हैं:

वास्तव में, हमें कोड की काफी अच्छी व्याख्या मिली (क्योंकि यह आंशिक रूप से ChatGPT द्वारा लिखा गया था)।

मैं केवल आपको इस कोड के महत्वपूर्ण भागों के माध्यम से चलाऊंगा ताकि आप खो न जाएं या पूरी तरह से AI पर निर्भर न रहें अपने प्लगइन्स लिखने के लिए।
4. प्लगइन फ़ाइल संरचना
हर प्लगइन Lua फ़ाइल में निम्नलिखित संरचना होनी चाहिए:
1. मॉड्यूल्स: आप प्लगइन के लिए आवश्यक मॉड्यूल/लाइब्रेरीज़ आयात करते हैं
local core = require("apisix.core") ...
2. प्लगइन नाम: हर प्लगइन का एक अद्वितीय नाम होता है, यह हमारी Lua फ़ाइल नाम के समान हो सकता है।
local plugin_name = "file-proxy"
3. प्लगइन स्कीमा: हर प्लगइन में एक प्लगइन स्कीमा होती है, जहां हम आमतौर पर प्लगइन के इनपुट्स निर्दिष्ट करते हैं। इनपुट हम APISIX रूट कॉन्फ़िगरेशन से पास करेंगे, जिसे आप बाद में प्लगइन का परीक्षण करते समय देखेंगे। file-proxy प्लगइन के लिए, प्लगइन को फ़ाइल पढ़ने और प्रतिक्रिया वापस करने के लिए एक फ़ाइल पथ की आवश्यकता होती है, इसलिए हमारा पैरामीटर path है जो स्ट्रिंग प्रकार का है। आप स्कीमा को अन्य प्रोग्रामिंग भाषाओं में पैराम्स के साथ एक विधि घोषणा की तरह समझ सकते हैं।
local plugin_schema = { type = "object", properties = { path = { type = "string" -- प्रदान की जाने वाली फ़ाइल का पथ }, }, required = {"path"} -- पथ एक आवश्यक फ़ील्ड है }
4. प्लगइन परिभाषा: यह प्लगइन कार्यान्वयन का एक बहुत महत्वपूर्ण हिस्सा है जिसे हम version, priority, name, और schema के गुणों के साथ एक टेबल के रूप में परिभाषित करते हैं। name और schema प्लगइन का नाम और स्कीमा हैं जो पहले परिभाषित किए गए हैं। version और priority का उपयोग APISIX द्वारा प्लगइन को प्रबंधित करने के लिए किया जाता है। संस्करण आमतौर पर वर्तमान में उपयोग किए जा रहे संस्करण को संदर्भित करता है जैसे API संस्करण। यदि आप अपने प्लगइन लॉजिक को प्रकाशित और अपडेट करते हैं, तो यह 1.1 होगा (आप कोई भी संस्करण सेट कर सकते हैं जो आप चाहते हैं)। लेकिन आपको प्राथमिकता चुनने में बहुत सावधान रहना होगा। priority फ़ील्ड परिभाषित करती है कि आपका प्लगइन किस क्रम और चरण में निष्पादित होना चाहिए। उदाहरण के लिए, 'ip-restriction' प्लगइन, जिसकी प्राथमिकता 3000 है, 'example-plugin' से पहले निष्पादित होगा, जिसकी प्राथमिकता 0 है। यह 'ip-restriction' प्लगइन की उच्च प्राथमिकता मान के कारण है। यदि आप अपना स्वयं का प्लगइन विकसित कर रहे हैं, तो सुनिश्चित करें कि आपने मौजूदा प्लगइन्स के क्रम का पालन किया है ताकि मौजूदा प्लगइन्स के क्रम को गड़बड़ न करें। आप config-default.yaml फ़ाइल में मौजूदा प्लगइन्स के क्रम की जांच कर सकते हैं और Apache APISIX Plugin Development Guide खोलकर निर्धारित कर सकते हैं।
local _M = { version = 1.0, priority = 1000, name = plugin_name, schema = plugin_schema }
5. स्कीमा जांच: check_schema Lua फ़ंक्शन का उपयोग रूट कॉन्फ़िगरेशन में प्लगइन को पहले परिभाषित प्लगइन स्कीमा के खिलाफ मान्य करने के लिए किया जाता है (आप इसे जल्द ही परीक्षण अनुभाग में देखेंगे)।
-- फ़ंक्शन यह जांचने के लिए कि प्लगइन कॉन्फ़िगरेशन सही है function _M.check_schema(conf) -- कॉन्फ़िगरेशन को स्कीमा के खिलाफ मान्य करें local ok, err = core.schema.check(plugin_schema, conf) -- यदि मान्यता विफल होती है, तो false और त्रुटि वापस करें if not ok then return false, err end -- यदि मान्यता सफल होती है, तो true वापस करें return true end
6. प्लगइन लॉजिक: access फ़ंक्शन मुख्य फ़ंक्शन है जहां हम प्रमुख प्लगइन लॉजिक लिख सकते हैं। इसे Nginx अनुरोध प्रसंस्करण पाइपलाइन के एक्सेस चरण के दौरान कहा जाता है और हम ट्रैफ़िक को नियंत्रित करते हैं और कस्टम निर्देश लिखते हैं। file-proxy के लिए, हमें प्लगइन कॉन्फ़िगरेशन में निर्दिष्ट फ़ाइल को खोलने, इसकी सामग्री को पढ़ने और सामग्री को प्रतिक्रिया के रूप में वापस करने की आवश्यकता है। यदि फ़ाइल खोली नहीं जा सकती है, तो यह एक त्रुटि लॉग करता है और 404 Not Found स्थिति वापस करता है। यह वह स्थान है जहां हम यह कार्य ChatGPT को देते हैं:

हमने कोड को संरचित और पुनर्गठित करने के बाद, यह इस तरह दिखता है:
function _M.access(conf, ctx) -- कॉन्फ़िगरेशन में निर्दिष्ट फ़ाइल को खोलें local fd = io.open(conf.path, "rb") -- यदि फ़ाइल सफलतापूर्वक खोली जाती है, तो इसकी सामग्री पढ़ें और इसे प्रतिक्रिया के रूप में वापस करें if fd then local content = fd:read("*all") fd:close() ngx.header.content_length = #content ngx.say(content) ngx.exit(ngx.OK) else -- यदि फ़ाइल खोली नहीं जा सकती है, तो एक त्रुटि लॉग करें और 404 Not Found स्थिति वापस करें ngx.exit(ngx.HTTP_NOT_FOUND) core.log.error("फ़ाइल नहीं मिली: ", conf.path, ", त्रुटि जानकारी: ", err) end end
7. लॉगिंग लॉजिक: यह हमेशा पसंदीदा होता है कि प्लगइन कॉन्फ़िगरेशन को लॉग करें ताकि हम डीबग कर सकें और जांच सकें कि प्लगइन हमारे अपेक्षित रूप से काम कर रहा है। हम प्लगइन के अनुरोधों और प्रतिक्रियाओं को लॉग कर सकते हैं।
-- लॉग चरण के दौरान कहा जाने वाला फ़ंक्शन function _M.log(conf, ctx) -- प्लगइन कॉन्फ़िगरेशन और अनुरोध संदर्भ को लॉग करें core.log.warn("conf: ", core.json.encode(conf)) core.log.warn("ctx: ", core.json.encode(ctx, true)) end
Apache APISIX स्थापित करें
एक बार जब हमने अपना कस्टम file-proxy प्लगइन विकसित करना सीख लिया, APISIX में पंजीकृत कर लिया। अब प्लगइन का परीक्षण करने का समय आ गया है। आप apisix-file-proxy-plugin-demo प्रोजेक्ट को आसानी से स्थापित कर सकते हैं, प्रोजेक्ट रूट फ़ोल्डर से docker compose up चलाकर, जब आप प्रोजेक्ट को फोर्क/क्लोन कर लेते हैं।
file-proxy प्लगइन के साथ एक रूट बनाएं
हमारे नए file-proxy प्लगइन का उपयोग और परीक्षण करने के लिए हमें APISIX में एक रूट बनाने की आवश्यकता है जो प्लगइन का उपयोग करता है:
curl "http://127.0.0.1:9180/apisix/admin/routes/open-api-definition" -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "name":"OpenAPI Definition", "desc":"Route for OpenAPI Definition file", "uri":"/openapi.yaml", "plugins":{ "file-proxy":{ "path":"/usr/local/apisix/conf/openapi.yaml" } } }'
आप ChatGPT से उपरोक्त कॉन्फ़िगरेशन समझाने के लिए कह सकते हैं:

प्लगइन का परीक्षण करें
फिर, आप रूट को एक cURL अनुरोध भेज सकते हैं या अपने ब्राउज़र में लिंक http://127.0.0.1:9080/openapi.yaml खोल सकते हैं। प्रतिक्रिया निर्दिष्ट URL पर openapi.yaml फ़ाइल की सामग्री होनी चाहिए।
curl -i http://127.0.0.1:9080/openapi.yaml
प्लगइन हमारे अपेक्षित रूप से काम करता है। इस प्लगइन कॉन्फ़िगरेशन के साथ, आप अब निर्दिष्ट रूट का उपयोग करके किसी भी फ़ाइल तक पहुंच सकते हैं।
सारांश
APISIX के लिए Lua के साथ कस्टम प्लगइन्स विकसित करना API गेटवे की कार्यक्षमता को बढ़ाने का एक शक्तिशाली तरीका है। हमने इस पोस्ट में file-proxy प्लगइन बनाने का प्रदर्शन किया, प्लगइन परिभाषा और स्कीमा को परिभाषित किया, प्लगइन कॉन्फ़िगरेशन को मान्य किया, और APISIX में अनुरोध प्रसंस्करण पाइपलाइन के एक्सेस और लॉग चरणों के दौरान कस्टम लॉजिक को लागू क