API Gateway के साथ API अनुरोधों को श्रृंखलाबद्ध करना

Bobur Umurzokov

Bobur Umurzokov

May 23, 2023

Technology

जैसे-जैसे एकीकृत करने के लिए आवश्यक API की संख्या बढ़ती है, API इंटरैक्शन की जटिलता को प्रबंधित करना अधिक चुनौतीपूर्ण होता जाता है। API Gateway का उपयोग करके हम API कॉल्स का एक क्रम बना सकते हैं, जो API वर्कफ़्लो को छोटे, अधिक प्रबंधनीय चरणों में विभाजित करता है। उदाहरण के लिए, एक ऑनलाइन शॉपिंग वेबसाइट पर जब कोई ग्राहक किसी उत्पाद की खोज करता है, तो प्लेटफ़ॉर्म उत्पाद खोज API को एक अनुरोध भेज सकता है, फिर उत्पाद विवरण API को उत्पादों के बारे में अधिक जानकारी प्राप्त करने के लिए एक अनुरोध भेज सकता है। इस लेख में, हम Apache APISIX API Gateway के लिए एक कस्टम प्लगइन बनाएंगे जो क्लाइंट अनुरोधों को संभालने के लिए क्रम में कॉल किए जाने वाले अनुरोधों को प्रबंधित करेगा।

सीखने के उद्देश्य

आप इस लेख में निम्नलिखित सीखेंगे:

  • चेनिंग API अनुरोध क्या हैं?
  • क्रमिक API कॉल का उदाहरण।
  • Apache APISIX के लिए कस्टम पाइपलाइन-अनुरोध प्लगइन कैसे बनाएं।
  • पाइपलाइन-अनुरोध प्लगइन डेमो।

API Gateway के साथ पाइपलाइनिंग API अनुरोध

चेनिंग API अनुरोध क्या है और हमें इसकी आवश्यकता क्यों है?

चेनिंग API अनुरोध (या पाइपलाइन अनुरोध, या क्रमिक API कॉल) सॉफ्टवेयर विकास में उपयोग की जाने वाली एक तकनीक है जो API इंटरैक्शन की जटिलता को प्रबंधित करने के लिए उपयोग की जाती है जहां सॉफ्टवेयर को किसी कार्य को पूरा करने के लिए कई API कॉल की आवश्यकता होती है। यह बैच अनुरोध प्रसंस्करण के समान है जहां आप कई API अनुरोधों को एक ही अनुरोध में समूहित करते हैं और उन्हें सर्वर को एक बैच के रूप में भेजते हैं। हालांकि वे समान लग सकते हैं, एक पाइपलाइन अनुरोध में सर्वर को एक ही अनुरोध भेजा जाता है जो एक परिभाषित क्रम में कई API अनुरोधों को ट्रिगर करता है। अनुक्रम में प्रत्येक API अनुरोध अनुरोध और प्रतिक्रिया डेटा को संशोधित कर सकता है, और एक API अनुरोध की प्रतिक्रिया को अनुक्रम में अगले API अनुरोध के इनपुट के रूप में पास किया जाता है। पाइपलाइन अनुरोध तब उपयोगी हो सकते हैं जब क्लाइंट को निर्भर API अनुरोधों का एक क्रम निष्पादित करने की आवश्यकता होती है जो एक विशिष्ट क्रम में निष्पादित होने चाहिए।

पाइपलाइन के प्रत्येक चरण में, हम प्रतिक्रिया डेटा को रूपांतरित या संशोधित कर सकते हैं इससे पहले कि इसे अगले चरण में पास किया जाए। यह उन स्थितियों में उपयोगी हो सकता है जहां डेटा को सामान्यीकृत या रूपांतरित करने की आवश्यकता होती है या संवेदनशील डेटा को फ़िल्टर करने की आवश्यकता होती है इससे पहले कि इसे क्लाइंट को वापस भेजा जाए। यह समग्र विलंबता को कम करने में मदद कर सकता है। उदाहरण के लिए, एक API कॉल तब किया जा सकता है जब दूसरा प्रतिक्रिया की प्रतीक्षा कर रहा हो, जिससे वर्कफ़्लो को पूरा करने के लिए आवश्यक समग्र समय कम हो जाता है।

API Gateway के साथ क्रमिक API कॉल

Apache APISIX के लिए कस्टम पाइपलाइन-अनुरोध प्लगइन

एक API गेटवे इस कार्यक्षमता को लागू करने के लिए सही स्थान हो सकता है क्योंकि यह सभी क्लाइंट ऐप अनुरोधों को इंटरसेप्ट कर सकता है और उन्हें इच्छित गंतव्यों पर फॉरवर्ड कर सकता है। हम Apache APISIX का उपयोग करने जा रहे हैं क्योंकि यह एक लोकप्रिय ओपन-सोर्स API गेटवे समाधान है जिसमें बिल्ट-इन प्लगइन्स का एक समूह है। हालांकि, वर्तमान ब्लॉग पोस्ट को विकसित करते समय, APISIX में पाइपलाइन-अनुरोध प्लगइन के लिए आधिकारिक समर्थन नहीं था। APISIX की कस्टम प्लगइन विकास क्षमताओं के ज्ञान के साथ, हमने एक नया प्लगइन पेश करने का निर्णय लिया जो समान सुविधा प्रदान कर सके। GitHub पर एक रेपो है जिसमें Lua प्रोग्रामिंग भाषा में लिखा गया स्रोत कोड और पाइपलाइन-अनुरोध प्लगइन का विवरण है।

इस प्लगइन के साथ, आप एकल क्लाइंट अनुरोध को संभालने के लिए क्रम में कॉल किए जाने वाले अपस्ट्रीम API की एक सूची निर्दिष्ट कर सकते हैं। प्रत्येक अपस्ट्रीम API अनुरोध और प्रतिक्रिया डेटा को संशोधित कर सकता है, और एक अपस्ट्रीम API की प्रतिक्रिया को पाइपलाइन में अगले अपस्ट्रीम API के इनपुट के रूप में पास किया जाता है। पाइपलाइन को रूट कॉन्फ़िगरेशन में परिभाषित किया जा सकता है, और आप API URL के लिए ऑर्डर भी परिभाषित कर सकते हैं जब पाइपलाइन को उन्हें निष्पादित करना चाहिए।

आइए इस प्लगइन के उपयोग को एक उदाहरण के साथ समझते हैं। मान लीजिए कि आपके पास दो API हैं - एक जो GET /credit_cards अनुरोध करता है क्रेडिट कार्ड जानकारी प्राप्त करने के लिए और दूसरा जो पिछली प्रतिक्रिया डेटा को POST /filter अनुरोध के बॉडी में प्राप्त करता है और फिर यह संवेदनशील डेटा (जैसे क्रेडिट कार्ड नंबर और समाप्ति तिथि) को फ़िल्टर करता है इससे पहले कि इसे क्लाइंट को वापस भेजा जाए। क्योंकि क्रेडिट कार्ड API एंडपॉइंट संवेदनशील जानकारी लौटाता है जो अनधिकृत पार्टियों को उजागर नहीं होनी चाहिए। नीचे दिया गया चित्र समग्र डेटा प्रवाह को दर्शाता है:

API Gateway के साथ क्रमिक API कॉल को फ़िल्टर करने के लिए

  1. जब कोई क्लाइंट क्रेडिट कार्ड API एंडपॉइंट के लिए API Gateway को सभी क्रेडिट कार्ड जानकारी प्राप्त करने के लिए अनुरोध करता है, तो API Gateway क्रेडिट कार्ड बैकएंड सेवा से क्रेडिट कार्ड डेटा प्राप्त करने के लिए एक अनुरोध फॉरवर्ड करता है।
  2. यदि अनुरोध सफल होता है और क्रेडिट कार्ड डेटा लौटाता है, तो यह पाइपलाइन में अगले चरण को पास करता है जो सुरक्षा सेवा है।
  3. जब सुरक्षा सेवा से फ़िल्टर की गई प्रतिक्रिया प्राप्त होती है, तो यह संयुक्त प्रतिक्रिया को क्लाइंट को वापस लौटाता है।

पाइपलाइन-अनुरोध प्लगइन डेमो

इस डेमो के लिए, हम GitHub पर एक और तैयार डेमो प्रोजेक्ट का उपयोग करने जा रहे हैं जहां आप इस ट्यूटोरियल में उपयोग किए गए सभी curl कमांड उदाहरण पा सकते हैं, APISIX चला सकते हैं और कस्टम प्लगइन को Docker compose.yml फ़ाइल के साथ अतिरिक्त कॉन्फ़िगरेशन के बिना सक्षम कर सकते हैं।

पूर्वापेक्षाएँ

  • Docker का उपयोग कंटेनराइज्ड etcd और APISIX स्थापित करने के लिए किया जाता है।
  • curl का उपयोग APISIX Admin API को अनुरोध भेजने के लिए किया जाता है। आप API के साथ इंटरैक्ट करने के लिए Postman जैसे आसान टूल्स का भी उपयोग कर सकते हैं।

चरण 1: APISIX और etcd स्थापित करें और चलाएं

आप प्रोजेक्ट रूट फ़ोल्डर से docker compose up चलाकर APISIX और etcd को आसानी से स्थापित कर सकते हैं जब आप प्रोजेक्ट को फोर्क/क्लोन कर लेते हैं। आप देख सकते हैं कि docker-compose.yml फ़ाइल में एक वॉल्यूम ./custom-plugins:/opt/apisix/plugins:ro निर्दिष्ट है। यह स्थानीय डायरेक्टरी ./custom-plugins को डॉकर कंटेनर में /opt/apisix/plugins पथ पर एक रीड-ओनली वॉल्यूम के रूप में माउंट करता है जहां हमारा pipeline-request.lua फ़ाइल कस्टम प्लगइन कार्यान्वयन के साथ है। यह APISIX में रनटाइम में कस्टम प्लगइन्स को जोड़ने की अनुमति देता है (यह सेटअप केवल तब लागू होता है जब आप APISIX को डॉकर के साथ चलाते हैं)।

चरण 2: पाइपलाइन-अनुरोध प्लगइन के साथ पहला रूट बनाएं

एक बार APISIX चलने के बाद, हम cURL कमांड का उपयोग करते हैं जो APISIX Admin API /routes एंडपॉइंट को एक HTTP PUT अनुरोध भेजने के लिए उपयोग किया जाता है ताकि हमारा पहला रूट बनाया जा सके जो URI पथ /my-credit-cards के लिए सुनता है।

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/1' \ --header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ --header 'Content-Type: application/json' \ --data-raw '{ "uri":"/my-credit-cards", "plugins":{ "pipeline-request":{ "nodes":[ { "url":"https://random-data-api.com/api/v2/credit_cards" }, { "url":"http://127.0.0.1:9080/filter" } ] } } }'

कॉन्फ़िगरेशन का महत्वपूर्ण हिस्सा "प्लगइन्स" सेक्शन है, जो निर्दिष्ट करता है कि इस API रूट के लिए "पाइपलाइन-अनुरोध" प्लगइन का उपयोग किया जाना चाहिए। प्लगइन कॉन्फ़िगरेशन में एक "नोड्स" सरणी होती है, जो पाइपलाइन में निष्पादित किए जाने वाले API अनुरोधों के क्रम को परिभाषित करती है। आप वहां एक या कई API परिभाषित कर सकते हैं। इस मामले में, पाइपलाइन में दो नोड्स होते हैं: पहला नोड https://random-data-api.com/api/v2/credit_cards API को क्रेडिट कार्ड डेटा प्राप्त करने के लिए एक अनुरोध भेजता है, और दूसरा नोड http://127.0.0.1:9080/filter पर एक स्थानीय API को क्रेडिट कार्ड जानकारी से संवेदनशील डेटा को फ़िल्टर करने के लिए एक अनुरोध भेजता है। दूसरा API केवल serverless-pre-function APISIX प्लगइन का उपयोग करके एक सर्वरलेस फ़ंक्शन होगा। यह केवल पहले API से प्रतिक्रिया को संशोधित करने के लिए एक बैकएंड सेवा के रूप में कार्य करता है।

चरण 3: सर्वरलेस प्लगइन के साथ दूसरा रूट बनाएं

अगला, हम एक नया रूट कॉन्फ़िगर करते हैं जिसमें ID 2 है जो पाइपलाइन में /filter एंडपॉइंट के लिए अनुरोधों को संभालता है। यह serverless-pre-function APISIX के मौजूदा प्लगइन को भी सक्षम करता है जहां हम एक Lua फ़ंक्शन निर्दिष्ट करते हैं जिसे प्लगइन द्वारा निष्पादित किया जाना चाहिए। यह फ़ंक्शन केवल पिछली प्रतिक्रिया से अनुरोध बॉडी को प्राप्त करता है, क्रेडिट कार्ड नंबर फ़ील्ड को प्रतिस्थापित करता है, और शेष प्रतिक्रिया को अपरिवर्तित छोड़ देता है। अंत में, यह वर्तमान प्रतिक्रिया बॉडी को संशोधित अनुरोध बॉडी पर सेट करता है और क्लाइंट को HTTP 200 प्रतिक्रिया वापस भेजता है। आप इस स्क्रिप्ट को अपनी आवश्यकताओं के अनुसार संशोधित कर सकते हैं, जैसे कि डिकोडेड बॉडी का उपयोग करके आगे प्रसंस्करण या सत्यापन करना।

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/2' \ --header 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ --header 'Content-Type: application/json' \ --data-raw ' { "uri": "/filter", "plugins":{ "serverless-pre-function": { "phase": "access", "functions": [ "return function(conf, ctx) local core = require(\"apisix.core\") local cjson = require(\"cjson.safe\") -- Get the request body local body = core.request.get_body() -- Decode the JSON body local decoded_body = cjson.decode(body) -- Hide the credit card number decoded_body.credit_card_number = \"****-****-****-****\" core.response.exit(200, decoded_body); end" ] } } }'

चरण 3: सेटअप का परीक्षण करें

अब समग्र कॉन्फ़िगरेशन का परीक्षण करने का समय है। नीचे दिए गए curl कमांड के साथ, हम एंडपॉइंट http://127.0.0.1:9080/my-credit-cards को एक HTTP GET अनुरोध भेजते हैं।

curl http://127.0.0.1:9080/my-credit-cards

हमारे पास दूसरे चरण में संबंधित रूट कॉन्फ़िगर किया गया है जो pipeline-request प्लगइन का उपयोग करता है जिसमें दो नोड्स हैं, यह अनुरोध पाइपलाइन को ट्रिगर करेगा ताकि https://random-data-api.com/api/v2/credit_cards एंडपॉइंट से क्रेडिट कार्ड जानकारी प्राप्त की जा सके, http://127.0.0.1:9080/filter एंडपॉइंट का उपयोग करके संवेदनशील डेटा को फ़िल्टर किया जा सके, और संशोधित प्रतिक्रिया को क्लाइंट को वापस लौटाया जा सके। आउटपुट देखें:

{ "uid":"a66239cd-960b-4e14-8d3c-a8940cedd907", "credit_card_expiry_date":"2025-05-10", "credit_card_type":"visa", "credit_card_number":"****-****-****-****", "id":2248 }

जैसा कि आप देख सकते हैं, यह अनुरोध बॉडी (वास्तव में, यह चेन में पहले API कॉल से प्रतिक्रिया है) में क्रेडिट कार्ड नंबर को एस्टरिस्क के साथ प्रतिस्थापित करता है।

सारांश

अब तक, हमने सीखा कि Apache APISIX API Gateway के लिए हमारा कस्टम पाइपलाइन अनुरोध प्लगइन हमें एक विशिष्ट क्रम में API कॉल्स के एक क्रम को पाइपलाइन के रूप में परिभाषित करने की अनुमति देता है। हम इस नए प्लगइन का उपयोग मौजूदा प्लगइन्स के संयोजन में हमारे API एंडपॉइंट्स के लिए प्रमाणीकरण, सुरक्षा और अन्य API Gateway सुविधाओं को सक्षम करने के लिए भी कर सकते हैं।

संबंधित संसाधन

Tags: