प्लग इन करने योग्य गोलंग एप्लीकेशन का निर्माण कैसे करें और AWS लाम्बडा लेयर्स से लाभान्वित हों।

गोलंग - यह आपके ध्यान के लायक क्यों है?

गोलंग एक खुला स्रोत प्रोग्रामिंग भाषा है जिसे Google द्वारा डिज़ाइन और कार्यान्वित किया गया है। यह विशेष रूप से क्लाउड में आधुनिक अनुप्रयोगों में बहुत व्यापक रूप से उपयोग किया जाता है। यह सबसे विशेषता विशेषताएं हैं:

  • गोलंग को सांख्यिकीय रूप से टाइप किया गया है - यह कम लचीलापन प्रदान करता है, लेकिन आपको गलती करने से बचाता है,
  • यह वस्तु-उन्मुख नहीं है। हालाँकि, आप संरचना और इंटरफेस बना सकते हैं और इससे आपको 3 में से 4 ओओपी सिद्धांत मिलते हैं: डेटा एब्स्ट्रक्शन, एनकैप्सुलेशन और पॉलीमोर्फिज़्म। विरासत में केवल एक लापता है,
  • Goroutines! - मेरे द्वारा उपयोग किए गए हल्के धागों का सबसे बड़ा कार्यान्वयन। यह आपको गो ऑपरेटर का उपयोग करके सुपर आसान तरीके से एक नया धागा बनाने की अनुमति देता है और चैनलों का उपयोग करके विभिन्न गोरोइन्ट्स के बीच संवाद करता है,
  • यह सभी निर्भरताओं के साथ एकल बाइनरी के लिए संकलित करता है - और अधिक पैकेजों का संघर्ष नहीं!

व्यक्तिगत रूप से, मैं गोलंग को सबसे बड़ी भाषा मानता हूं जिसका उपयोग मैं दैनिक आधार पर करता हूं। हालाँकि, यह लेख आपके पहले समारोह या "हैलो वर्ल्ड" को छापने के बारे में नहीं होगा। मैं आपको थोड़ा और उन्नत सामान दिखाऊंगा। यदि आप एक शुरुआत हैं और गोलंग के बारे में अधिक जानना चाहते हैं तो कृपया इसके मुख्य पृष्ठ पर जाएँ।

AWS लाम्बा और गोलंग

अमेज़ॅन वेब सर्विसेज द्वारा नवंबर 2014 में जारी किए गए सार्वजनिक क्लाउड में AWS लैंबडा सबसे लोकप्रिय सर्वर रहित कम्प्यूट सेवाओं में से एक है। यह आपको सर्वर को प्रोविजन या मैनेज किए बिना डायनामोबीडी, एसएनएस या एचटीटीपी ट्रिगर जैसी घटनाओं के जवाब में अपना कोड चलाने की अनुमति देता है! क्या आप जानते हैं कि वास्तव में महान क्या है? जनवरी 2018 से यह गोलंग रनटाइम का समर्थन करता है। AWS लैम्ब्डा के साथ काम करना वास्तव में सरल है - बस अपने कोड और सभी निर्भरता के साथ एक ज़िपित पैकेज अपलोड करें (गोलंग का उपयोग करते समय एकल बाइनरी)।

फास्ट फॉरवर्ड, 4 साल बाद 2018 फिर से: इन्वेंट एडब्ल्यूएस ने लैम्ब्डा लेयर्स जारी किया जो आपको एकल या यहां तक ​​कि कई एडब्ल्यूएस खातों में विभिन्न कार्यों में साझा किए गए डेटा को स्टोर करने और प्रबंधित करने की अनुमति देता है! उदाहरण के लिए, पायथन का उपयोग करते समय आप सभी निर्भरताओं को एक अतिरिक्त परत में रख सकते हैं जो बाद में अन्य लैम्ब्डा द्वारा उपयोग किया जा सकता है। अब प्रत्येक ज़िप्ड पैकेज में अलग-अलग निर्भरता रखने की आवश्यकता नहीं है! गोलांग दुनिया में स्थिति अलग है क्योंकि AWS लैम्ब्डा को आपको संकलित बाइनरी अपलोड करने की आवश्यकता है। हम AWS लाम्बा लेयर्स से कैसे लाभान्वित हो सकते हैं? उत्तर सरल है - गोलंग प्लगइन्स का उपयोग करके एक मॉड्यूलर एप्लिकेशन बनाएं!

गोलंग प्लगिन्स - एक मॉड्यूलर अनुप्रयोग बनाने का एक तरीका

गोलंग प्लगिन्स, Go1.8 में जारी किया गया फीचर है जो आपको साझा लाइब्रेरी (.so फ़ाइलों) को गतिशील रूप से लोड करने की अनुमति देता है। यह आपको अपने कुछ कोड को अलग लाइब्रेरी में निर्यात करने या किसी अन्य द्वारा तैयार और संकलित प्लगइन का उपयोग करने का अवसर देता है। यह आशाजनक है, हालांकि, कुछ सीमाएँ हैं:

  • आपका प्लगइन एकल मुख्य मॉड्यूल होना चाहिए,
  • आप केवल फ़ंक्शन और चर लोड कर सकते हैं जिन्हें ELF प्रतीकों के रूप में निर्यात किया जाता है,
  • स्थैतिक टाइपिंग के कारण, आपको हर लोड किए गए प्रतीक को सही प्रकार से डालना होगा। सबसे खराब स्थिति में, आपको अपने कोड में सही इंटरफ़ेस को परिभाषित करने की आवश्यकता है,
  • यह केवल Linux और MacOS के लिए काम करता है। निजी तौर पर, मैं इसे नुकसान नहीं मानता हूं :)

अपने पहले प्लगइन का निर्माण और परीक्षण

अब हमारा पहला प्लगइन बनाएं। एक उदाहरण के रूप में, हम स्ट्रिंग एन्क्रिप्शन के लिए एक सरल मॉड्यूल बनाएंगे। आइए मूल बातों पर वापस जाएं और 2 सरल एन्क्रिप्शन एल्गोरिदम - सीज़र और वर्मन को लागू करें।

  • सीज़र सिफर एल्गोरिथ्म सबसे पहले जूलियस सीज़र्स द्वारा उपयोग किया जाता है। यह पाठ में हर अक्षर को पदों की निश्चित संख्या से बदल देता है। उदाहरण के लिए, यदि आप कुंजी 4 के साथ गोलंग शब्द को एन्क्रिप्ट करना चाहते हैं तो आपको ktpek मिलेगा। डिक्रिप्शन उसी तरह से काम करता है। आपको बस विपरीत दिशा में अक्षरों को स्थानांतरित करने की आवश्यकता है।
  • वर्मन सिफर सीज़र के समान है, एक ही स्थानांतरण विचार के आधार पर, अंतर यह है कि आप प्रत्येक पत्र को विभिन्न पदों की संख्या से स्थानांतरित करते हैं। पाठ को डिक्रिप्ट करने के लिए आपको पाठ को एन्क्रिप्ट करने के लिए उपयोग की जाने वाली स्थितियों से संबंधित कुंजी की आवश्यकता होती है। उदाहरण के लिए, यदि आप कुंजी [-1, 4, 7, 20, 4, -2] के साथ गोलंग शब्द को एन्क्रिप्ट करना चाहते हैं तो आपको भविष्य मिलेगा।

इस उदाहरण का पूर्ण कार्यान्वयन यहाँ उपलब्ध है।

प्लगइन कार्यान्वयन

निम्नलिखित स्निपेट में ऊपर उल्लिखित दो एल्गोरिदम का कार्यान्वयन शामिल है। प्रत्येक के लिए हम अपने पाठ को एन्क्रिप्ट और डिक्रिप्ट करने के 2 तरीके लागू करते हैं:

जैसा कि आप देख सकते हैं, हमने यहां 3 अलग-अलग प्रतीकों का निर्यात किया (गोलंग केवल इन पहचानकर्ताओं को निर्यात करता है जो ऊपरी अक्षर से शुरू होते हैं):

  • EncryptCeasar - func (int, string) स्ट्रिंग जो सीज़र एल्गोरिदम का उपयोग करके पाठ को एन्क्रिप्ट करती है,
  • डिक्रिप्टेसर - फ़ंक (इंट, स्ट्रिंग) स्ट्रिंग जो सीज़र एल्गोरिथ्म का उपयोग करके पाठ को डिक्रिप्ट करता है,
  • वर्मनिफर - 2 तरीकों को लागू करने वाले प्रकार के वर्मनकिपर का चर: एनक्रिप्ट: फंक (स्ट्रिंग) स्ट्रिंग और डिक्रिप्ट: फंक () (* स्ट्रिंग, त्रुटि)

इस प्लगइन को संकलित करने के लिए आपको निम्नलिखित कमांड चलाना होगा:

go build -buildmode = plugin -o plugin / cipher.so plugin / cipher.go

अभी के लिए, कुछ विशेष नहीं है - कुछ सरल फ़ंक्शन बनाए गए थे और एक मॉड्यूल को एक प्लगइन के रूप में संकलित किया गया था, जिसमें -buildmode = प्लगइन तर्क जोड़ दिया गया था।

लोड और परीक्षण प्लगइन

मज़ा तब शुरू होता है जब हम अपने ऐप में संकलित प्लगइन का उपयोग करना चाहते हैं। आइए एक सरल उदाहरण बनाएं:

सबसे पहले, आपको golang plugin package आयात करना होगा। इसमें केवल दो कार्य शामिल हैं - पहला साझा पुस्तकालय को लोड करने के लिए है और दूसरा निर्यातित प्रतीक खोजने के लिए है। अपनी लाइब्रेरी को लोड करने के लिए आपको ओपन फंक्शन का उपयोग करना होगा, जिसमें आपके साझा प्लगइन को रास्ता प्रदान करना होगा और टाइप प्लगइन का रिटर्न वैरिएबल होना चाहिए। यदि लाइब्रेरी लोड करना संभव नहीं है (पूर्व गलत पथ या दूषित फ़ाइल) तो यह फ़ंक्शन उस त्रुटि को वापस करता है जिसे संभालना होगा।

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

एप्लिकेशन को संकलित करने और चलाने के लिए निम्नलिखित कमांड का उपयोग करें:

go app.go का निर्माण करें
./app

आउटपुट में, आपको एन्क्रिप्टेड और डिक्रिप्टेड टेक्स्ट को एक सबूत के रूप में देखना चाहिए कि एल्गोरिथ्म सही ढंग से काम करता है।

AWS लैम्ब्डा में प्लगइन का उपयोग करें

AWS लैम्ब्डा में हमारे प्लगइन का उपयोग करने के लिए हमें अपने आवेदन में कुछ संशोधन करने की आवश्यकता है:

  • AWS लेम्ब्डा लेम्बडा कंटेनर में / ऑप्ट डायरेक्टरी को लेयर्स को माउंट करता है, इसलिए हमें इस प्लगइन से अपना प्लगइन लोड करना होगा।
  • हमें एक हैंडलर फ़ंक्शन बनाने की आवश्यकता है जिसका उपयोग लैम्ब्डा इंजन द्वारा हमारे परीक्षण कार्यक्रम को संभालने के लिए किया जाएगा।

निम्नलिखित स्निपेट में लैम्ब्डा द्वारा उपयोग किए जाने के लिए समायोजित हमारा आवेदन शामिल है:

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

AWS लाम्बा की तैनाती

AWS लाम्बा कार्यों और परतों को तैनात करने के दो तरीके हैं। आप ज़िप किए गए पैकेज को मैन्युअल रूप से बना सकते हैं और अपलोड कर सकते हैं या अधिक उन्नत ढांचे का उपयोग कर सकते हैं, जिससे यह बहुत आसान और तेज हो जाता है। मेरी अधिकांश परियोजनाओं के लिए, मैं सर्वर रहित ढांचे का उपयोग करता हूं, इसलिए मैंने इस टूल का उपयोग करके पहले से ही सरल सर्वर रहित.लाइफ कॉन्फ़िगरेशन फ़ाइल तैयार कर ली है:

सेवा: सिफर सेवा
फ्रेमवर्क विसर्जन: "> = 1.28.0 <2.0.0"
प्रदाता:
  नाम: aws
  रनटाइम: go1.x
परतों:
  cipherLayer:
    पथ: बिन / प्लगइन
    compatibleRuntimes:
      - go1.x
कार्य:
  इंजन:
    हैंडलर: बिन / सिफरगाइन
    पैकेज:
      निकालना:
        - ./**
      शामिल:
        - ./bin/cipherEngine
    परतों:
      {{रेफ: सिपेयरलेयर लैम्बडालेयर}

परतों अनुभाग में हमने पहले से ही बनाए गए प्लगइन के पथ के साथ एक एकल परत को परिभाषित किया - यह लंबो फ़ंक्शन के साथ एक साथ तैनात किया जाएगा। आप 5 अलग-अलग परतों को परिभाषित कर सकते हैं जो क्रम वास्तव में महत्वपूर्ण है। वे एक ही / ऑप्ट डायरेक्टरी पर चढ़े हुए हैं, इसलिए अधिक संख्या वाली परतें पहले से माउंट की गई परतों से फ़ाइलों को ओवरराइड कर सकती हैं। प्रत्येक परत के लिए, आपको कम से कम 2 पैरामीटर प्रदान करने की आवश्यकता होती है: परत स्रोत वाली निर्देशिका का पथ (आपके मामले में प्लगइन बाइनरी का पथ) और संगत रनटाइम की सूची।

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

एक बार जब हमारा सर्वर रहित.लाइफ कॉन्फिगरेशन फाइल तैयार हो जाता है, तो अंतिम कार्य हमारे ऐप, प्लगइन को संकलित करना और उसे तैनात करना है। हम इसके लिए सरल मेकफाइल का उपयोग कर सकते हैं:

.PHONY: बिल्ड बिल्डप्लगिन क्लीन तैनाती
निर्माण:
 dep सुनिश्चित -v
 env GOOS = linux go build -ldflags = "- s -w" -o bin / cipherEngine cipherEngine / main.go
buildPlugin:
 env GOOS = linux go build -ldflags = "- s -w" -buildmode = plugin -o bin / plugin / cipher.so ../plugin/cipher.go
स्वच्छ:
 rm -rf ./bin/vendor Gopkg.lock
तैनात: साफ buildPlugin बिल्ड
 एसएल तैनात --verbose

आप निम्न कमांड को चलाकर अपने फ़ंक्शन का निर्माण और तैनाती कर सकते हैं:

तैनात करना

टेस्ट AWS लैम्ब्डा

जैसा कि मैंने पहले कहा था कि एडब्ल्यूएस लाम्बा घटना के जवाब में कोड निष्पादित करता है। हालाँकि, हमने किसी भी इवेंट ट्रिगर्स को कॉन्फ़िगर नहीं किया है, इसलिए इसे हमारी मदद के बिना लागू नहीं किया जाएगा। हमें इसे सर्वर रहित फ्रेमवर्क या अर्सकली टूल का उपयोग करके मैन्युअल रूप से करना होगा:

sls invoke -f function_name
aws lambda invoke - function-name function_name output_file

प्रतिक्रिया में, आपको पहले जैसा ही आउटपुट देखना चाहिए, जो यह साबित करता है कि हमारा लैम्ब्डा फ़ंक्शन सही तरीके से काम करता है और अतिरिक्त परत से प्लगइन को लोड करता है। अब आप अन्य कार्य बना सकते हैं जो एक ही परत का उपयोग करेंगे या यहां तक ​​कि अन्य AWS खातों के साथ साझा कर सकते हैं।

सारांश

गोलंग मॉड्यूल का उपयोग करने और नए जारी किए गए एडब्ल्यूएस लैंबडा लेयर्स के साथ उन्हें एकीकृत करने के तरीके का परीक्षण करने में बहुत मज़ा आया। प्लगइन लाइब्रेरी वास्तव में बहुत बढ़िया है, हालांकि इसकी सीमाओं और गोलंग विनिर्देशन के कारण इसका उपयोग केवल कुछ विशेष परिदृश्यों में ही किया जा सकता है। मुझे लगता है कि अधिकांश डेवलपर्स जो मानक परियोजनाओं पर काम कर रहे हैं, उनके लिए यह आवश्यक नहीं है या प्लगइन्स का उपयोग करना भी संभव है। मेरे दिमाग में केवल दो कारण हैं:

  • जटिल एल्गोरिदम को लागू करना जिसका उपयोग अन्य अनुप्रयोगों द्वारा पूर्व में किया जा सकता है। वीडियो कोडिंग या एन्क्रिप्शन एल्गोरिदम।
  • अपने कोड को प्रकाशित किए बिना अपने एल्गोरिथ्म को दूसरों के साथ साझा करना।