SOA / Microservices: अंतर-सेवा संचार में प्राधिकरण को कैसे संभालना है?


19

अग्रभूमि

हम एक अखंड मंच से एक अधिक सेवा उन्मुख वास्तुकला के लिए आगे बढ़ रहे हैं। हम बहुत मूल DDD सिद्धांतों को लागू कर रहे हैं और अलग-अलग बंधे हुए संदर्भों में हमारे डोमेन को विभाजित कर रहे हैं। प्रत्येक डोमेन वेब API (REST) ​​के माध्यम से एक सेवा वितरित और उजागर करता है।

हमारे व्यवसाय की प्रकृति के कारण, हमारे पास बुकिंग , सेवाएँ , ग्राहक , उत्पाद आदि जैसी सेवाएँ हैं

हमने एक आइडेंटिटी सर्वर भी स्थापित किया है (थिंकट्रेक्ट आइडेंटिटी सर्वर 3 पर आधारित) जिसकी मुख्य भूमिका निम्नलिखित है:

  • प्रमाणीकरण को केंद्रीकृत करें (यह क्रेडेंशियल दिया गया जो टोकन जारी करता है)
  • टोकन में दावों को जोड़ें जैसे कि: ग्राहक के स्कोप्स (ग्राहक के अनुसार मेरा मतलब है कि आवेदन करने का अनुरोध), ग्राहक पहचानकर्ता (ग्राहक के अनुसार मेरा मतलब है कि आवेदन का उपयोग करने वाला व्यक्ति)

हमने एक एपीआई गेटवे की भूमिका भी पेश की जो हमारी सेवाओं तक बाहरी पहुंच को केंद्रीकृत करता है। एपीआई गेटवे कार्यात्मकता प्रदान करता है जिसे आंतरिक डोमेन के गहन ज्ञान की आवश्यकता नहीं होती है जैसे:

  • रिवर्स प्रॉक्सी: उचित आंतरिक सेवा में आने वाले अनुरोधों को रूट करता है
  • वर्जनिंग: आंतरिक सेवाओं के विभिन्न संस्करणों के लिए एपीआई गेटवे मैप्स का एक संस्करण
  • प्रमाणीकरण: क्लाइंट अनुरोधों में पहचान सर्वर द्वारा जारी किया गया टोकन शामिल है और एपीआई गेटवे टोकन को मान्य करता है (सुनिश्चित करें कि उपयोगकर्ता कहता है कि वह कौन है)
  • थ्रॉटलिंग: प्रति ग्राहक अनुरोधों की संख्या सीमित करें

प्राधिकरण

प्राधिकरण क्या चिंता करता है, यह एपीआई गेटवे में ही नहीं बल्कि आंतरिक सेवाओं में भी प्रबंधित है। हम वर्तमान में 2 मुख्य प्रकार के प्राधिकरण कर रहे हैं:

  • क्लाइंट स्कोप के आधार पर प्राधिकरण। उदाहरण: एक ग्राहक (हमारे एपीआई का उपभोग करने वाले बाहरी अनुप्रयोग) को बुकिंग सेवा एपीआई एंडपॉइंट तक पहुंचने के लिए गुंजाइश "बुकिंग" की आवश्यकता होती है
  • ग्राहक पर आधारित प्राधिकरण। उदाहरण: केवल यदि कोई ग्राहक (एप्लिकेशन का उपयोग करने वाला भौतिक व्यक्ति) बुकिंग का भागीदार है, तो बुकिंग सेवा से अंतिम बिंदु GET / बुकिंग तक पहुंच सकता है।

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

समस्या का विवरण

अब तक बहुत अच्छा है जब तक हमने अंतर-सेवा संचार पेश नहीं किया (कुछ सेवाएं कुछ डेटा प्राप्त करने के लिए अन्य सेवाओं के साथ संवाद कर सकती हैं)।

सवाल

हमें अंतर-सेवा संचार में प्राधिकरण से कैसे संपर्क करना चाहिए?

विकल्प पर विचार किया

विभिन्न विकल्पों पर चर्चा करने के लिए मैं निम्नलिखित नमूना परिदृश्य का उपयोग करूंगा:

  • हम एक बाहरी अनुप्रयोग कहा जाता है ExternalApp कि हमारे एपीआई (पहुँचता ExternalApp के रूप में देखा जा सकता है ग्राहक आदेश बुकिंग प्रवाह के निर्माण के लिए)
  • एक्सटर्नल एप की बुकिंग सेवा तक पहुंच की आवश्यकता होती है , इसलिए हम एक्सटर्नल को स्कोप "बुकिंग" प्रदान करते हैं।
  • आंतरिक रूप से (यह एक्सटर्नलएप के लिए कुछ पूरी तरह से पारदर्शी है ) बुकिंग सेवा बुकिंग , डिफ़ॉल्ट या कार किराए पर लेने जैसी बुकिंग की डिफ़ॉल्ट सेवाओं को प्राप्त करने के लिए सेवा सेवा को स्वीकार करती है।

जब इस मुद्दे पर चर्चा करते हुए आंतरिक रूप से कई विकल्प सामने आए, लेकिन हमें यकीन नहीं है कि कौन सा विकल्प सबसे अच्छा है:

  1. जब बुकिंग सेवाओं के साथ संचार करती है , तो उसे बस एपीआई गेटवे से प्राप्त मूल टोकन को अग्रेषित करना चाहिए (यह दर्शाता है कि ग्राहक बाहरी है )
    • निहितार्थ: हमें बाहरी एप्‍लिकेशन को स्‍कोप देने की आवश्‍यकता हो सकती है जो कि मंजूर नहीं किए जाने चाहिए। उदाहरण: एक्सटर्नलएप के लिए स्कोप "बुकिंग" और "सेवा" दोनों की आवश्यकता हो सकती है जबकि केवल "बुकिंग" स्कोप पर्याप्त हो सकता है
  2. जब बुकिंग के साथ संचार सेवा है, यह आगे एक टोकन ग्राहक अब बन गया है यह दर्शाता बुकिंग (के बजाय ExternalApp ) + यह एक का दावा संकेत कहते बुकिंग मूल ग्राहक धारण कर रहा है ExternalApp
    • यह भी जानकारी मूल ग्राहक है कि शामिल करके ExternalApp सेवाएं सेवा भी इस तरह के मूल फोन करने वाले पर निर्भर करता है कुछ सेवाओं को फ़िल्टर करना तर्क कर सकता है (उदाहरण के लिए आंतरिक एप्लिकेशन के लिए हम सब झगड़े बाहरी क्षुधा के लिए वापस आ जाएगी, केवल कुछ)
  3. सेवाओं को एक दूसरे के साथ संवाद नहीं करना चाहिए (इसलिए हमें इस प्रश्न का सामना नहीं करना चाहिए)

अपने इनपुट के लिए अग्रिम में शुक्रिया।


1
आपने इस समस्या को कैसे हल किया? हम एक समान स्थिति में हैं।
वरुण मेहता

+1: मुझे इस बात में दिलचस्पी है कि आप आखिरकार अपनी समस्या का समाधान कैसे करेंगे।
डियोसो

बिंदु 3 करने के लिए - सेवाएं एक-दूसरे के साथ संवाद नहीं करती हैं, आपको एक समग्र यूआई की आवश्यकता होती है। विशेष रूप से
।.net

जवाबों:


3

मैं आपको सलाह देता हूं कि आपके पास संचार सेवाओं के बीच एक आंतरिक चैनल होना चाहिए।

उदाहरण के लिए कुछ मैसेज ब्रोकर जैसे कि RabbitMQ का उपयोग करने के लिए आंतरिक रूप से microservices के बीच संदेशों को भेजने / प्राप्त करने या प्रकाशित करने के लिए

तब आपका पहला अंतिम उपयोगकर्ता सेवा "आपके उदाहरण में बुकिंग सेवा" टोकन को मान्य करने के लिए ज़िम्मेदार होगा और ग्राहक को यह विशिष्ट ऑपरेशन करने के लिए अधिकृत करेगा जो कि IdentityServer के साथ संवाद करके हो सकता है।

फिर यह संदेश ब्रोकर के माध्यम से सेवा सेवा के साथ संवाद करेगा और उस स्थिति में, टोकन को फिर से सत्यापित करने की आवश्यकता नहीं है।

मुझे लगता है कि यह मॉडल सरल होगा और आपको बेहतर प्रदर्शन देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.