Envoy और Apache APISIX: Envoy Filter को लागू करने का एक और तरीका

API7.ai

December 16, 2020

Technology

Envoy फ़िल्टर को लागू करने के तरीके

Envoy फ़िल्टर

Envoy एक L7 प्रॉक्सी और संचार बस है जो आधुनिक सेवा-उन्मुख आर्किटेक्चर के लिए डिज़ाइन किया गया है। एक प्लगइन फ़िल्टर चेन मैकेनिज्म फ़िल्टर को लिखने और मुख्य सर्वर में डालने की अनुमति देता है ताकि विभिन्न कार्यों को पूरा किया जा सके।

Envoy फ़िल्टर

विस्तार विधि

मौजूदा फ़िल्टर उपयोगकर्ता की कस्टम आवश्यकताओं को पूरा नहीं कर सकते हैं। ऐसे मामले में, Envoy को विस्तारित करने की आवश्यकता होती है। मौजूदा फ़िल्टर चेन के आधार पर नए फ़िल्टर को कस्टमाइज़ करें ताकि कस्टमाइज़ेशन आवश्यकताओं को पूरा किया जा सके।

डेवलपर्स Envoy को तीन तरीकों से विस्तारित कर सकते हैं:

शुरुआत करने की कठिनाईस्थिरताविकास दक्षताडिप्लॉय और कंपाइल
C++उच्चस्थिरकमकंपाइल करने में लंबा समय लगता है
Luaकमस्थिरउच्चकंपाइल करने की आवश्यकता नहीं, सीधे डिप्लॉय करें
WASMउच्च-मध्यमअनिश्चितभाषा पर निर्भरकंपाइल समय भाषा पर निर्भर करता है
  1. C++ का उपयोग करके विस्तार

इस तरीके में, Envoy के आधार पर सीधे C++ कोड लिखा जाता है ताकि कार्यक्षमता को बढ़ाया जा सके। एक कस्टम फ़िल्टर को लागू करने के बाद, नए बाइनरी फ़ाइल को फिर से कंपाइल करके अपग्रेड पूरा किया जाता है। इस तरीके में दो समस्याएं हैं:

  • C++ भाषा की सीमाओं के कारण, शुरुआत करने की कठिनाई, डेवलपर्स की कमी।
  • डिप्लॉयमेंट, ऑपरेशन और मेंटेनेंस, और अपग्रेड की जटिलता बढ़ जाती है। Envoy भारी होता जाएगा, और हर बदलाव के लिए बाइनरी फ़ाइल को फिर से कंपाइल करने की आवश्यकता होती है, जो इटरेशन और प्रबंधन के लिए अनुकूल नहीं है।
  1. Lua का उपयोग करके विस्तार

Lua एप्लिकेशन में एम्बेड होने के लिए बनाया गया है, ताकि एप्लिकेशन के लिए लचीला विस्तार और कस्टमाइज़ेशन सुविधाएं प्रदान की जा सकें, और यह व्यापक रूप से उपयोग किया जाता है।

Lua फ़िल्टर Lua स्क्रिप्ट को अनुरोध और प्रतिक्रिया प्रक्रिया में चलाने की अनुमति देता है। वर्तमान में समर्थित मुख्य सुविधाओं में शामिल हैं: अनुरोध प्रवाह, प्रतिक्रिया प्रवाह में स्ट्रीमिंग के दौरान हेडर, बॉडी, और ट्रेलर का निरीक्षण; हेडर और ट्रेलर को संशोधित करना; पूर्ण अनुरोध/प्रतिक्रिया बॉडी को निरीक्षण के लिए ब्लॉक और बफर करना; अपस्ट्रीम होस्ट को एक आउटबाउंड एसिंक HTTP कॉल करना; सीधे प्रतिक्रिया करना और आगे के फ़िल्टर इटरेशन को छोड़ना, आदि।

वर्तमान में, कई लोग सीधे कॉन्फ़िगरेशन में Lua कोड वितरित करते हैं, जो कोड संगठन और प्रबंधन के लिए अनुकूल नहीं है, और इसे दूसरों के साथ साझा करना मुश्किल है ताकि एक इकोसिस्टम बन सके।

  1. 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 फ़िल्टर की दिशा में काम कर सकें, Lua फ़िल्टर को ऑप्टिमाइज़ और सुधार सकें, Envoy की विस्तार क्षमताओं को बढ़ा सकें, और Envoy विस्तार की कठिनाई को कम कर सकें।

Tags: