मैं कई ग्राहकों के लिए एक एपीआई बना रहा हूं। कोर एंडपॉइंट की तरह /users
हर ग्राहक द्वारा उपयोग किया जाता है लेकिन कुछ एंडपॉइंट व्यक्तिगत अनुकूलन पर भरोसा करते हैं। तो यह हो सकता है कि उपयोगकर्ता A एक विशेष समापन बिंदु चाहता है /groups
और किसी अन्य ग्राहक के पास वह सुविधा नहीं होगी। सिद्दत के रूप में , प्रत्येक ग्राहक उन अतिरिक्त विशेषताओं के कारण अपने स्वयं के डेटाबेस स्कीमा का भी उपयोग करेगा।
मैं व्यक्तिगत रूप से NestJs (हूड के तहत एक्सप्रेस) का उपयोग करता हूं। इसलिए app.module
वर्तमान में मेरे सभी कोर मॉड्यूल (अपने स्वयं के समापन बिंदुओं के साथ) को पंजीकृत करता है)
import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module'; // core module
@Module({
imports: [UsersModule]
})
export class AppModule {}
मुझे लगता है कि यह समस्या NestJs से संबंधित नहीं है तो आप सिद्धांत रूप में इसे कैसे संभालेंगे?
मुझे मूल रूप से एक बुनियादी ढांचे की आवश्यकता है जो एक बुनियादी प्रणाली प्रदान करने में सक्षम है। अब कोई कोर एंडपॉइंट नहीं हैं क्योंकि प्रत्येक एक्सटेंशन अद्वितीय है और कई /users
कार्यान्वयन संभव हो सकते हैं। एक नई सुविधा विकसित करते समय मुख्य अनुप्रयोग को छुआ नहीं जाना चाहिए। एक्सटेंशन को खुद को एकीकृत करना चाहिए या स्टार्टअप पर एकीकृत होना चाहिए। कोई अंतिम छोर के साथ कोर सिस्टम जहाज, लेकिन उन बाहरी फ़ाइलों से बढ़ाया जाएगा।
कुछ विचार मेरे दिमाग में आते हैं
पहले दृष्टिकोण:
प्रत्येक एक्सटेंशन एक नए रिपॉजिटरी का प्रतिनिधित्व करता है। एक कस्टम बाहरी फ़ोल्डर के लिए एक पथ परिभाषित करें जो सभी विस्तार परियोजनाओं को पकड़े हुए है। इस कस्टम निर्देशिका में एक के groups
साथ एक फ़ोल्डर होगाgroups.module
import { Module } from '@nestjs/common';
import { GroupsController } from './groups.controller';
@Module({
controllers: [GroupsController],
})
export class GroupsModule {}
मेरा एपीआई उस निर्देशिका के माध्यम से लूप कर सकता है और प्रत्येक मॉड्यूल फ़ाइल को आयात करने का प्रयास कर सकता है।
पेशेवरों:
- कस्टम कोड को कोर रिपॉजिटरी से दूर रखा गया है
विपक्ष:
NestJs टाइपस्क्रिप्ट का उपयोग करता है इसलिए मुझे पहले कोड संकलित करना होगा। मैं कस्टम ऐप्स से API बिल्ड और बिल्ड कैसे प्रबंधित करूंगा? (प्लग एंड प्ले सिस्टम)
कस्टम एक्सटेंशन बहुत ढीले हैं क्योंकि उनमें कुछ टाइपस्क्रिप्ट फाइलें हैं। इस तथ्य के कारण कि उनके पास एपीआई के नोड_मॉडल्स निर्देशिका तक पहुंच नहीं है, मेरे संपादक मुझे त्रुटियों को दिखाएंगे क्योंकि यह बाहरी पैकेज निर्भरता को हल नहीं कर सकता है।
कुछ एक्सटेंशन दूसरे एक्सटेंशन से डेटा प्राप्त कर सकते हैं। हो सकता है कि समूह सेवा को उपयोगकर्ता सेवा तक पहुंचने की आवश्यकता हो। यहां चीजें मुश्किल हो सकती हैं।
दूसरा तरीका: एपीआई के src फ़ोल्डर के सबफ़ोल्डर के अंदर प्रत्येक एक्सटेंशन रखें। लेकिन इस सबफ़ोल्डर को .gitignore फ़ाइल में जोड़ें। अब आप एपीआई के अंदर अपने एक्सटेंशन रख सकते हैं।
पेशेवरों:
आपका संपादक निर्भरता को हल करने में सक्षम है
अपना कोड तैनात करने से पहले आप बिल्ड कमांड चला सकते हैं और इसका एक ही वितरण होगा
आप अन्य सेवाओं तक आसानी से पहुँच सकते हैं (
/groups
आईडी द्वारा उपयोगकर्ता को खोजने की आवश्यकता है)
विपक्ष:
- जब आप विकास करते हैं तो आपको उस सबफ़ोल्डर के अंदर अपनी रिपॉजिटरी फ़ाइलों को कॉपी करना होगा। कुछ बदलने के बाद आपको इन फाइलों को वापस कॉपी करना होगा और अपनी रिपॉजिटरी फाइलों को अपडेट के साथ ओवरराइड करना होगा।
तीसरा तरीका:
एक बाहरी कस्टम फ़ोल्डर के अंदर, सभी एक्सटेंशन पूरी तरह से स्टैंडअलोन एपीआई हैं। आपका मुख्य एपीआई केवल प्रमाणीकरण सामग्री प्रदान करेगा और लक्ष्य एपीआई के लिए आने वाले अनुरोधों को पुनर्निर्देशित करने के लिए एक प्रॉक्सी के रूप में कार्य कर सकता है।
पेशेवरों:
- नए एक्सटेंशन को आसानी से विकसित और परीक्षण किया जा सकता है
विपक्ष:
तैनाती मुश्किल होगी। आपके पास अपनी प्रक्रिया शुरू करने और एक बंदरगाह को सुनने के लिए एक मुख्य एपीआई और एन एक्सटेंशन एपीआई होगा।
प्रॉक्सी सिस्टम मुश्किल हो सकता है। अगर क्लाइंट अनुरोध करता है
/users
कि प्रॉक्सी को यह जानने की जरूरत है कि एपीआई उस समापन बिंदु के लिए कौन सा विस्तार सुनता है, तो उस एपीआई और उसके बाद ग्राहक को प्रतिक्रिया दें।एक्सटेंशन एपीआई की सुरक्षा के लिए (प्रमाणीकरण मुख्य एपीआई द्वारा नियंत्रित किया जाता है) प्रॉक्सी को उन एपीआई के साथ एक रहस्य साझा करने की आवश्यकता होती है। इसलिए एक्सटेंशन API केवल आने वाले अनुरोधों को पारित करेगा यदि उस मेल को प्रॉक्सी से प्रदान किया गया है।
चौथा दृष्टिकोण:
माइक्रोसर्विसेज मदद कर सकते हैं। मैंने यहां से एक गाइड लिया https://docs.nestjs.com/microservices/basics
मैं उपयोगकर्ता प्रबंधन, समूह प्रबंधन आदि के लिए एक microservice हो सकता है और उन सेवाओं के लिए एक छोटा सा एपीआई / गेटवे / प्रॉक्सी बनाकर उन सेवाओं का उपभोग कर सकता हूं।
पेशेवरों:
नए एक्सटेंशन को आसानी से विकसित और परीक्षण किया जा सकता है
अलग की हुई चिंता
विपक्ष:
तैनाती मुश्किल होगी। आपके पास एक मुख्य एपीआई और एन माइक्रोसर्विसेज होंगे जो अपनी प्रक्रिया शुरू करेंगे और एक पोर्ट सुनेंगे।
ऐसा लगता है कि अगर मैं इसे अनुकूलन योग्य बनाना चाहता हूं तो मुझे प्रत्येक ग्राहक के लिए एक नया प्रवेश द्वार एपीआई बनाना होगा। इसलिए एक आवेदन को विस्तारित करने के बजाय मुझे हर बार एक अनुकूलित comsuming एपीआई बनाना होगा। यह समस्या हल नहीं होगी।
एक्सटेंशन एपीआई की सुरक्षा के लिए (प्रमाणीकरण मुख्य एपीआई द्वारा नियंत्रित किया जाता है) प्रॉक्सी को उन एपीआई के साथ एक रहस्य साझा करने की आवश्यकता होती है। इसलिए एक्सटेंशन API केवल आने वाले अनुरोधों को पारित करेगा यदि उस मेल को प्रॉक्सी से प्रदान किया गया है।