अनुकूलित समाधानों को अनलॉक करना: Apache APISIX और Node-Red का सामंजस्यपूर्ण उपयोग
March 6, 2024
पृष्ठभूमि
कई Apache APISIX उपयोगकर्ताओं को विशेष परिदृश्यों में विशिष्ट आवश्यकताओं को पूरा करने के लिए उद्यम वातावरण में अनुकूलन की आवश्यकता होती है, भले ही इसमें कई शक्तिशाली बिल्ट-इन प्लगइन सुविधाएँ हों।
उपयोगकर्ता अक्सर Lua में प्लगइन लिखना और उन्हें APISIX इंस्टेंस पर माउंट करना चुनते हैं। हालांकि, Lua का दर्शक वर्ग अपेक्षाकृत सीमित है। यद्यपि इसे शुरू करना आसान है, इसमें महारत हासिल करना सरल नहीं है, और Lua में जटिल डेटा परिवर्तन लॉजिक को लागू करना काफी जटिल हो सकता है। वर्तमान में, Java Plugin Runner द्वारा डेवलपर्स को कॉल करने के लिए केवल कुछ हुक्स एक्सपोज़ किए गए हैं, जिसके लिए सीधे समर्थित नहीं होने वाली कार्यक्षमताओं के लिए Java Plugin Runner के स्रोत कोड में संशोधन की आवश्यकता होती है।
नीचे दिया गया चित्र तीन सामान्य प्लगइन उपयोग पैटर्न को दर्शाता है: Lua प्लगइन सीधे APISIX कोर में एम्बेडेड होकर चलते हैं; Plugin Runner Java, Golang आदि जैसी भाषाओं में Plugin Runners के साथ RPC के माध्यम से संचार करता है; और WASM प्लगइन बाइटकोड में परिवर्तित होकर APISIX कोर के अंदर चलते हैं।

उपयोगकर्ता प्रतिक्रिया से यह देखा गया है कि कस्टम प्लगइन की आवश्यकता अक्सर HTTP अनुरोध पैरामीटर्स और डेटा प्रसंस्करण के लिए बाहरी API को कॉल करने जैसे डेटा परिवर्तन से संबंधित होती है।
इसे संबोधित करने के लिए, Apache APISIX की क्षमताओं को बढ़ाने के लिए एक नया दृष्टिकोण प्रस्तावित किया गया है। इस दृष्टिकोण में Apache APISIX में केवल बिल्ट-इन प्लगइन का उपयोग करके प्रमाणीकरण और दर सीमा जैसी सामान्य क्षमताओं को कॉन्फ़िगर करना शामिल है, जबकि नई कस्टम लॉजिक को बाहरी सेवाओं में रखा जाता है। बाहरी सेवा या तो एक बाइनरी प्रोग्राम या एक अन्य API सेवा हो सकती है, जिसे APISIX के लिए एक अपस्ट्रीम के रूप में माना जाएगा। यह बाहरी सेवा मिडलवेयर की तरह अनुरोध और प्रतिक्रियाओं को संभालेगी। इस दृष्टिकोण को अन्य API गेटवे या प्रॉक्सी सेवाओं पर भी लागू किया जा सकता है।
परिदृश्य विवरण
हमारे पास अपस्ट्रीम में डेटा क्वेरी सेवाएं प्रदान करने वाली एक श्रृंखला है (यह लेख https://api-ninjas.com/api को उदाहरण के रूप में उपयोग करता है)। उदाहरण के लिए, शहर के नाम के आधार पर नवीनतम मौसम जानकारी और देश की जानकारी (जैसे देश का GDP, राजधानी का नाम, और मुद्रा इकाई) प्राप्त की जा सकती है।
हमारा मुख्य उद्देश्य डेवलपर्स को एक सामान्य अनुरोध इंटरफ़ेस प्रदान करना है, जबकि अभी भी शहर के नाम और डेटा स्कोप पैरामीटर्स के आधार पर वे कौन सा डेटा प्राप्त करना चाहते हैं, यह निर्धारित करने में सक्षम होना है। इसके अलावा, अपस्ट्रीम सेवाओं को दुरुपयोग से बचाने के लिए, हमें डेवलपर इंटरफ़ेस में एक प्रमाणीकरण सेवा जोड़नी होगी, जो केवल सही API Key वाले अनुरोधों को अपस्ट्रीम सेवा पर फॉरवर्ड करेगी।
समस्या विश्लेषण
Node-Red को पेश करने से पहले, उपरोक्त आवश्यकताओं को पूरा करने के लिए, APISIX डेवलपर्स Lua प्लगइन का उपयोग करने पर विचार करेंगे। हालांकि Apache APISIX विस्तृत प्लगइन विकास दस्तावेज़ प्रदान करता है, व्यावसायिक डेवलपर्स को Lua सिंटैक्स और ट्यूनिंग तकनीक सीखने की आवश्यकता होती है, APISIX द्वारा एक्सपोज़ किए गए विभिन्न अनुरोध हुक्स को समझने की आवश्यकता होती है, और पैरामीटर निष्कर्षण और सत्यापन के लिए लॉजिक लिखते समय लगातार प्लगइन को रीलोड करने की आवश्यकता होती है। परीक्षण पूरा करने के बाद, उन्हें Lua प्लगइन को APISIX प्रोग्राम में पैकेज करने या सभी APISIX इंस्टेंस पर माउंट करने के लिए वितरित करने की आवश्यकता होती है।
इस ब्लॉग में हम जो उदाहरण आवश्यकताएं प्रदान करते हैं, उसमें क्लाइंट अनुरोधों से विशिष्ट पैरामीटर्स को पार्स करना और फिर विभिन्न अपस्ट्रीम सेवाओं से डेटा प्राप्त करने के लिए अनुरोध बनाना शामिल है। हालांकि, हमने व्यावसायिक लेखन के बाहर के लेनदेन से निपटने में बहुत समय बिताया। इसलिए, पैरामीटर रूपांतरण, प्रारूप रूपांतरण, या बाहरी कॉल से संबंधित ऐसी लॉजिक के लिए, हम एक हल्के, अधिक सहज दृष्टिकोण को अपना सकते हैं, जो ठीक वही समस्या है जिसे Node-Red हल कर सकता है।
Node-Red परिचय
Node-RED एक शक्तिशाली और उपयोग में आसान फ्लो-आधारित प्रोग्रामिंग टूल है जो विभिन्न डोमेन में ऑटोमेशन और डेटा फ्लो प्रसंस्करण कार्यों के लिए उपयुक्त है। इसका प्रोग्रामिंग इंटरफ़ेस, समृद्ध नोड लाइब्रेरी, और लचीली विस्तार योग्यता हमें जटिल फ्लोज़ को जल्दी से बनाने और विभिन्न एप्लिकेशन परिदृश्यों को लागू करने की अनुमति देती है। यहाँ Node-RED द्वारा प्रदान किए गए कुछ नोड्स हैं:
-
HTTP_IN नोड: बाहरी सेवा आमंत्रण के लिए एक एंडपॉइंट एक्सपोज़ करता है, जिसे हम APISIX के लिए एक अपस्ट्रीम सेवा के रूप में उपयोग करेंगे।
-
फ़ंक्शन नोड: डेवलपर्स को इनपुट/आउटपुट को संशोधित, हटाने आदि के लिए JavaScript में कोड फ़ंक्शन लिखने की अनुमति देता है।
-
स्विच नोड: डेवलपर्स को एक शर्त सेट करने की अनुमति देता है ताकि जब कोई शर्त पूरी हो तो अगले निर्दिष्ट नोड में प्रवेश किया जा सके।
-
HTTP_Request नोड: URL आदि सेट कर सकता है, जब पूरा वर्कफ़्लो निष्पादित होता है तो इस एंडपॉइंट पर डेटा भेजने के लिए Node-RED का उपयोग कर सकता है।
-
चेंज नोड: किसी निर्दिष्ट ऑब्जेक्ट के निर्दिष्ट मानों को जोड़, संशोधित, या हटा सकता है।
-
HTTP_Response नोड: क्लाइंट को प्रतिक्रिया वापस करने के लिए उपयोग किया जाता है।
उपरोक्त नोड्स के अलावा, Node-RED कई अन्य बिल्ट-इन नोड्स भी प्रदान करता है। यह लेख पाठकों को दिखाएगा कि कैसे Node-RED के माध्यम से उपरोक्त आवश्यकताओं को लागू किया जा सकता है।
उदाहरण प्रदर्शन
पर्यावरण सेटअप
हम आवश्यक घटकों को कंटेनरीकरण के माध्यम से तैनात करेंगे, सर्वर संसाधन के रूप में एक DigitalOcean Droplet का उपयोग करेंगे।
$ doctl compute ssh-key list ID Name FingerPrint 25621060 Zhiyuan Ju 2c:84:b7:d8:14:0a:a0:0f:ca:fe:ca:24:06:a4:fe:39 $ doctl compute droplet create \ --image docker-20-04 \ --size s-2vcpu-4gb-amd \ --region sgp1 \ --vpc-uuid 646cf2b8-03d8-4f48-b7c8-57cdee60ad27 \ --ssh-keys 25621060 \ apisix-nodered-docker-ubuntu-s-2vcpu-4gb-amd-sgp1-01 $ doctl compute droplet list ID Name Public IPv4 Private IPv4 Public IPv6 Memory VCPUs Disk Region Image VPC UUID Status Tags Features Volumes 404094941 apisix-nodered-docker-ubuntu-s-2vcpu-4gb-amd-sgp1-01 143.198.192.64 10.104.0.3 4096 2 80 sgp1 Ubuntu Docker 25.0.3 on Ubuntu 22.04 646cf2b8-03d8-4f48-b7c8-57cdee60ad27 active droplet_agent,private_networking
Apache APISIX तैनात करें
हम APISIX Quickstart का उपयोग करके एक नया APISIX इंस्टेंस शुरू करेंगे, विशिष्ट दस्तावेज़ के लिए कृपया https://docs.api7.ai/apisix/getting-started/ देखें।
$ curl -sL https://run.api7.ai/apisix/quickstart | sh
Node-RED तैनात करें
Node-RED कई तैनाती विधियाँ प्रदान करता है, और हम Docker के माध्यम से जल्दी से तैनात करेंगे और इसे मौजूदा पर्यावरण के साथ एकीकृत करेंगे। अधिक तैनाती विवरण के लिए कृपया आधिकारिक दस्तावेज़ देखें: https://nodered.org/docs/getting-started/.
Node-RED तैनात करते समय, सुनिश्चित करें कि कंटेनर को APISIX नेटवर्क में जोड़ा गया है ताकि यह APISIX के साथ संचार कर सके और अनुरोधों को संभाल सके।
$ docker run -d -it -p 1880:1880 -v $PWD/configs/nodered/data:/data --network=apisix-quickstart-net --name mynodered -u Node-Red:dialout nodered/Node-Red
Node-RED कॉन्फ़िगर करें
- APISIX से Node-RED में प्रवेश करने वाले अनुरोधों को संभालने के लिए, Node-Red को यह जांचना होगा कि अनुरोध में पैरामीटर्स मौजूद हैं और वैध हैं। यदि पैरामीटर्स गायब हैं या अमान्य हैं, तो एक त्रुटि संदेश वापस किया जाएगा। यदि वे वैध हैं, तो अगला नोड निष्पादित किया जाएगा। इस विशिष्ट परिदृश्य में, हम केवल दो शहरों, स्टॉकहोम (city=stockholm) और बर्लिन (city=berlin) के लिए डेटा क्वेरी की अनुमति देते हैं।

- एक बार अनुरोध अगले नोड में प्रवेश कर जाता है, तो Node-RED को यह निर्धारित करना होगा कि किस प्रकार का डेटा अनुरोध किया गया है। इस परिदृश्य में, तीन प्रकार हैं: मौसम जानकारी (
scope=weather), शहर के स्थित देश की जानकारी (scope=country), और शहर के स्थित देश का GDP (scope=gdp).

- यदि
CityऔरScopeपैरामीटर्स दोनों वैध हैं, तो Node-RED scope के मान के आधार पर डेटा प्राप्त करने के लिए किस API का उपयोग करना है, यह निर्धारित करेगा। URL, Method, Payload, X-API-Key आदि सेट करने के बाद, Node-RED का नोड ट्रिगर होने पर संबंधित एंडपॉइंट से डेटा प्राप्त करने के लिए एक्सेस करेगा।

scope=gdpके लिए डेटा प्राप्त करते समय, Node-RED को बाहरी API की प्रतिक्रिया बॉडी से GDP का मान निकालना होगा। इसे Change नोड का उपयोग करके निकाला जा सकता है या Function नोड का उपयोग किया जा सकता है।

- अंत में, Node-RED संसाधित डेटा को APISIX को वापस करेगा, जो इसे क्लाइंट को पास करेगा। अंतिम Node-RED चित्र नीचे दिखाया गया है।

APISIX रूट बनाना
Node-Red सेवा को क्लाइंट्स के लिए उपलब्ध कराने के लिए, हमें APISIX का उपयोग Node-Red द्वारा एक्सपोज़ किए गए एंडपॉइंट्स के लिए एक रिवर्स प्रॉक्सी के रूप में करना होगा। यहाँ वे चरण हैं जिनका आपको पालन करना होगा:
-
एक APISIX रूट बनाएं और
mynodered:1880को इस रूट के लिए अपस्ट्रीम के रूप में सेट करें। ऐसा करने से, इस एंडपॉइंट पर भेजे गए सभी अनुरोध Node-Red सेवा पर फॉरवर्ड किए जाएंगे। -
Key Authentication को सक्षम करें ताकि केवल वैध API Key वाले अनुरोध ही प्रमाणीकरण पास कर सकें और Node-Red सेवा तक पहुंच सकें।
उपरोक्त चरणों का पालन करके, हम Node-Red सेवा को सुरक्षित रूप से क्लाइंट्स के लिए एक्सपोज़ कर सकते हैं और सुनिश्चित कर सकते हैं कि केवल अधिकृत उपयोगकर्ता ही इसे एक्सेस कर सकते हैं।
$ curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d ' { "id": "proxy-global-data-endpoint", "uri": "/global-data", "upstream": { "type": "roundrobin", "nodes": { "mynodered:1880": 1 } }, "plugins": { "key-auth": {} } }' $ curl -i "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d ' { "username": "tom", "plugins": { "key-auth": { "key": "secret-key" } } }'
अनुरोध सत्यापन
हम APISIX और Node-Red के अपेक्षित व्यवहार को सत्यापित करने के लिए कई परिदृश्यों को अलग-अलग प्रयास करेंगे:
परिदृश्य 1
-
परिदृश्य विवरण: गलत Key के साथ API तक पहुंचें।
-
अपेक्षित परिणाम: चूंकि प्रदान किया गया API Key गलत है, अनुरोध को अस्वीकार कर दिया जाना चाहिए, और संबंधित त्रुटि संदेश वापस किया जाना चाहिए।
$ curl http://143.198.192.64:9080/global-data -H "apikey: invalid-key" -i HTTP/1.1 401 Unauthorized Date: Mon, 04 Mar 2024 07:47:24 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Server: APISIX/3.8.0 {"message":"Invalid API key in request"}
परिदृश्य 2
-
परिदृश्य विवरण: सही Key के साथ API तक पहुंचें, लेकिन अमान्य
Cityफ़ील्ड के साथ। -
अपेक्षित परिणाम: चूंकि अनुरोध पैरामीटर्स आवश्यकताओं को पूरा नहीं करते हैं, संबंधित त्रुटि संदेश वापस किया जाना चाहिए, जो इंगित करता है कि
Cityफ़ील्ड अमान्य है।
$ curl "http://143.198.192.64:9080/global-data?city=singapore&scope=country" -H "apikey: secret-key" -i HTTP/1.1 400 Bad Request Content-Type: application/json; charset=utf-8 Content-Length: 69 Connection: keep-alive Access-Control-Allow-Origin: * X-Content-Type-Options: nosniff ETag: W/"45-IOhgB2XkDHi2Kt4PP42n1xa8Gys" Date: Mon, 04 Mar 2024 07:48:02 GMT Server: APISIX/3.8.0 {"errorCode":400,"message":"Allowed city Options: Stockholm, Berlin"}
परिदृश्य 3
-
परिदृश्य विवरण: सही Key के साथ API तक पहुंचें, और वैध
CityऔरScopeफ़ील्ड्स के साथ देश डेटा प्राप्त करें। -
अपेक्षित परिणाम: अनुरोध सफल होना चाहिए, और
Cityके स्थित देश की संबंधित जानकारी वापस की जानी चाहिए।
$ curl "http://143.198.192.64:9080/global-data?city=stockholm&scope=country" -H "apikey: secret-key" -i HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Content-Length: 947 Connection: keep-alive Access-Control-Allow-Origin: * X-Content-Type-Options: nosniff ETag: W/"3b3-XDlm9OHfuUrWH+g42q8L1F2uu/o" Date: Mon, 04 Mar 2024 07:48:26 GMT Server: APISIX/3.8.0 [{"gdp":556086,"sex_ratio":100.4,"surface_area":438574,"life_expectancy_male":80.8,"unemployment":6.7,"imports":158710,"homicide_rate":1.1,"currency":{"code":"SEK","name":"Swedish Krona"},"iso2":"SE","employment_services":80.7,"employment_industry":17.7,"urban_population_growth":1.1,"secondary_school_enrollment_female":157.9,"employment_agriculture":1.6,"capital":"Stockholm","co2_emissions":37.6,"forested_area":68.9,"tourists":7440,"exports":160538,"life_expectancy_female":84.4,"post_secondary_enrollment_female":82.1,"post_secondary_enrollment_male":52.7,"primary_school_enrollment_female":127.4,"infant_mortality":2,"gdp_growth":2.2,"threatened_species":98,"population":10099,"urban_population":87.7,"secondary_school_enrollment_male":148.1,"name":"Sweden","pop_growth":0.7,"region":"Northern Europe","pop_density":24.6,"internet_users":92.1,"gdp_per_capita":55766.8,"fertility":1.8,"refugees":310.4,"primary_school_enrollment_male":125.8}]
परिदृश्य 4
-
परिदृश्य विवरण: सही Key के साथ API तक पहुंचें, और वैध
CityऔरScopeफ़ील्ड्स के साथGDPडेटा प्राप्त करें। -
अपेक्षित परिणाम: अनुरोध सफल होना चाहिए, और
Cityके स्थित देश काGDPडेटा वापस किया जाना चाहिए।
$ curl "http://143.198.192.64:9080/global-data?city=stockholm&scope=gdp" -H "apikey: secret-key" -i HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Content-Length: 6 Connection: keep-alive Access-Control-Allow-Origin: * ETag: W/"6-j8I5kokycgWjCeKC1c2UfJW7AQY" Date: Mon, 04 Mar 2024 07:48:48 GMT Server: APISIX/3.8.0 556086
इन चार परिदृश्यों को सत्यापित करके, हम पुष्टि कर सकते हैं कि APISIX और Node-Red अपेक्षित रूप से काम कर रहे हैं और विभिन्न प्रकार के अनुरोधों को सही ढंग से संभाल सकते हैं।
सारांश
हम कस्टम क्षमता विकास की समस्या को अधिक चतुराई से हल करने के लिए एक नया दृष्टिकोण प्रदान करते हैं, जिसे एक विस्तृत उदाहरण द्वारा प्रदर्शित किया गया है।
-
API अनुरोध रूटिंग और पहचान सत्यापन: पहले, Apache APISIX की रूटिंग कार्यक्षमता और प्रमाणीकरण प्लगइन का उपयोग करके, APISIX क्लाइंट अनुरोधों को Node-Red सेवा पर फॉरवर्ड करता है जब प्रदान किए गए क्रेडेंशियल्स वैध होते हैं।
-
अनुरोध प्रसंस्करण और रूपांतरण: Node-Red में, हम आने वाले API अनुरोधों को संभालने के लिए एक फ्लो बनाते हैं। APISIX से अनुरोध प्राप्त करने के लिए HTTP इनपुट नोड का उपयोग करके, हम अनुरोध पैरामीटर्स को पार्स और सत्यापित करते हैं ताकि यह सुनिश्चित हो सके कि वे व्यावसायिक आवश्यकताओं को पूरा करते हैं।
-
व्यावसायिक लॉजिक प्रसंस्करण: एक बार वैध अनुरोध प्राप्त होने पर, हम Node-Red में व्यावसायिक लॉजिक निष्पादित कर सकते हैं। उदाहरण के लिए, पैरामीटर्स के आधार पर विभिन्न व्यावसायिक API को अनुरोध भेजकर डेटा प्राप्त करना और प्रतिक्रिया से आवश्यक फ़ील्ड्स निकालना। इन ऑपरेशन्स को पूरा करने के बाद, अंतिम डेटा APISIX को वापस किया जाता है।
-
त्रुटि संभाल और लॉगिंग: प्रसंस्करण के दौरान, यदि कोई त्रुटि या अपवाद होता है, तो हम Node-Red में त्रुटि संभाल नोड्स जोड़ सकते हैं ताकि असाधारण स्थितियों को पकड़ा और संभाला जा सके। इसके अलावा, हम लॉगिंग नोड्स का उपयोग करके प्रसंस्करण के दौरान महत्वपूर्ण जानकारी को रिकॉर्ड कर सकते हैं ताकि बाद में समस्या निवारण और विश्लेषण किया जा सके, जो इस उदाहरण में प्रदर्शित नहीं किया गया है।
APISIX और Node-Red को संयोजित करके, हम दृश्यमान रूप से एक पूर्ण अनुरोध-संभाल प्रक्रिया को लागू कर सकते हैं, जिसमें अनुरोध रूटिंग, डेटा प्रसंस्करण, व्यावसायिक लॉजिक आदि शामिल हैं, बिना जटिल कोड या प्लगइन लिखने की आवश्यकता के। यह लचीला, अनुकूलन योग्य समाधान हमें सिस्टम कार्यक्षमता को तेजी से बनाने और समायोजित करने में मदद कर सकता है, विकास दक्षता में सुधार कर सकता है, विकास लागत को कम कर सकता है, और सिस्टम स्थिरता और विस्तार योग्यता सुनिश्चित कर सकता है।