কাস্টম শেষ পয়েন্ট সহ বিদ্যমান এপিআই প্রসারিত করুন


12

আমি একাধিক গ্রাহকের জন্য একটি এপিআই তৈরি করছি। মত মূল এন্ডপয়েন্টগুলি /usersপ্রতিটি গ্রাহক ব্যবহার করেন তবে কিছু শেষবিন্দু পৃথক কাস্টমাইজেশনের উপর নির্ভর করে। সুতরাং এটি হতে পারে যে ব্যবহারকারী এ একটি বিশেষ শেষ পয়েন্ট চায় /groupsএবং অন্য কোনও গ্রাহকের কাছে সেই বৈশিষ্ট্য থাকবে না। কেবল একটি সিডনোট হিসাবে , এই অতিরিক্ত বৈশিষ্ট্যগুলির কারণে প্রতিটি গ্রাহক তার নিজস্ব ডাটাবেস স্কিমা ব্যবহার করবেন।

আমি ব্যক্তিগতভাবে নেস্টজে (হুডের নিচে এক্সপ্রেস) ব্যবহার করি। সুতরাং app.moduleবর্তমানে আমার সমস্ত মূল মডিউলগুলি (তাদের নিজস্ব শেষ পয়েন্টগুলি সহ) নিবন্ধিত করুন

import { Module } from '@nestjs/common';

import { UsersModule } from './users/users.module'; // core module

@Module({
  imports: [UsersModule]
})
export class AppModule {}

আমি মনে করি এই সমস্যাটি নেস্টজেগুলির সাথে সম্পর্কিত নয় তাই আপনি কীভাবে তত্ত্বটি পরিচালনা করবেন?

আমার মূলত এমন একটি অবকাঠামো দরকার যা একটি বেসিক সিস্টেম সরবরাহ করতে সক্ষম। কোনও মূল সমাপ্তি নেই কারণ প্রতিটি সম্প্রসারণ অনন্য এবং একাধিক /usersবাস্তবায়ন সম্ভব হতে পারে। একটি নতুন বৈশিষ্ট্য বিকাশ করার সময় মূল প্রয়োগটি স্পর্শ করা উচিত নয়। এক্সটেনশনগুলি তাদের একীভূত হওয়া উচিত বা প্রারম্ভের সময় সংহত হওয়া উচিত। মূল সিস্টেমটি শিপগুলি শেষ প্রান্তবিহীন তবে সেই বাহ্যিক ফাইলগুলি থেকে প্রসারিত হবে।

কিছু ধারণা আমার মনে আসে


প্রথম পদ্ধতির:

প্রতিটি এক্সটেনশন একটি নতুন সংগ্রহস্থল উপস্থাপন করে। সমস্ত এক্সটেনশন প্রকল্পগুলি ধারণ করে একটি কাস্টম বহিরাগত ফোল্ডারের একটি পথ নির্ধারণ করুন। এই কাস্টম ডিরেক্টরিতে একটি groupsসহ একটি ফোল্ডার থাকবেgroups.module

import { Module } from '@nestjs/common';

import { GroupsController } from './groups.controller';

@Module({
  controllers: [GroupsController],
})
export class GroupsModule {}

আমার এপিআই সেই ডিরেক্টরিটি লুপ করতে পারে এবং প্রতিটি মডিউল ফাইল আমদানির চেষ্টা করতে পারে।

  • পেশাদাররা:

    1. কাস্টম কোডটি মূল সংগ্রহস্থল থেকে দূরে রাখা হয়েছে
  • কনস:

    1. নেস্টজেগুলি টাইপসক্রিপ্ট ব্যবহার করে তাই আমাকে প্রথমে কোডটি সংকলন করতে হবে। আমি কীভাবে কাস্টম অ্যাপ্লিকেশনগুলি থেকে API বিল্ড এবং বিল্ডগুলি পরিচালনা করব? (প্লাগ এবং প্লে সিস্টেম)

    2. কাস্টম এক্সটেনশানগুলি খুব আলগা কারণ তারা কেবল কিছু টাইপ স্ক্রিপ্ট ফাইল ধারণ করে। এপিআইয়ের নোড_মডিউলগুলির ডিরেক্টরিতে তাদের অ্যাক্সেস না থাকার কারণে, আমার সম্পাদক আমাকে ত্রুটিগুলি দেখায় কারণ এটি বাহ্যিক প্যাকেজ নির্ভরতাগুলি সমাধান করতে পারে না।

    3. কিছু এক্সটেনশন অন্য এক্সটেনশান থেকে ডেটা আনতে পারে। গ্রুপ পরিষেবাদি ব্যবহারকারীর পরিষেবা অ্যাক্সেস করার প্রয়োজন হতে পারে। জিনিসগুলি এখানে জটিল হয়ে উঠতে পারে।


দ্বিতীয় পদ্ধতির: প্রতিটি এক্সটেনশানটি API এর src ফোল্ডারের সাবফোল্ডারের ভিতরে রাখুন। তবে এই সাবফোল্ডারটি .gitignore ফাইলটিতে যুক্ত করুন। এখন আপনি নিজের এক্সটেনশানগুলি API এর ভিতরে রাখতে পারেন।

  • পেশাদাররা:

    1. আপনার সম্পাদক নির্ভরতাগুলি সমাধান করতে সক্ষম

    2. আপনার কোড স্থাপন করার আগে আপনি বিল্ড কমান্ড চালাতে পারেন এবং এতে একক বিতরণ হবে

    3. আপনি সহজেই অন্যান্য পরিষেবাদি অ্যাক্সেস করতে পারেন ( /groupsআইডি দ্বারা কোনও ব্যবহারকারীকে সন্ধানের প্রয়োজন)

  • কনস:

    1. বিকাশকালে আপনাকে সেই সংগ্রহকারীর ফাইলগুলি সেই সাবফোল্ডারের ভিতরে অনুলিপি করতে হবে। কিছু পরিবর্তন করার পরে আপনাকে এই ফাইলগুলি আবার অনুলিপি করতে হবে এবং আপডেট করা ফাইলগুলির সাহায্যে আপনার সংগ্রহস্থলগুলি ওভাররাইড করতে হবে।

তৃতীয় পদ্ধতি:

একটি বাহ্যিক কাস্টম ফোল্ডারের অভ্যন্তরে, সমস্ত এক্সটেনশান সম্পূর্ণরূপে স্ট্যান্ডএলোন এপিআই দ্বারা প্রস্তুত। আপনার মূল এপিআই কেবল প্রমাণীকরণ স্টাফ সরবরাহ করবে এবং আগত অনুরোধগুলিকে টার্গেট এপিআই এ পুনঃনির্দেশ করার জন্য একটি প্রক্সি হিসাবে কাজ করতে পারে।

  • পেশাদাররা:

    1. নতুন এক্সটেনশনগুলি সহজেই বিকাশ ও পরীক্ষা করা যায়
  • কনস:

    1. মোতায়েন করা জটিল হবে। আপনার নিজস্ব একটি প্রক্রিয়া শুরু করতে এবং একটি বন্দর শোনার জন্য একটি প্রধান এপিআই এবং এন এক্সটেনশন এপিআই থাকবে।

    2. প্রক্সি সিস্টেমটি জটিল হতে পারে। যদি ক্লায়েন্টকে /usersপ্রক্সিটির অনুরোধ করা হয় তবে কোন এক্সটেনশন এপিআই সেই শেষ পয়েন্টটি শুনবে, সেই এপিআই কল করে এবং সেই প্রতিক্রিয়াটি ক্লায়েন্টের কাছে ফরোয়ার্ড করে।

    3. এক্সটেনশন এপিআইগুলিকে সুরক্ষিত করতে (মূল API দ্বারা প্রমাণীকরণ পরিচালনা করা হয়) প্রক্সিটির সেই APIগুলির সাথে একটি গোপন ভাগ করা প্রয়োজন। সুতরাং এক্সটেনশান এপিআই কেবলমাত্র প্রক্সি থেকে ম্যাচিং গোপন সরবরাহ করা হলে আগত অনুরোধগুলি পাস করবে।


চতুর্থ পন্থা:

Microservices সাহায্য করতে পারে। আমি এখান থেকে https://docs.nestjs.com/microservices/basics থেকে একটি গাইড নিয়েছি

আমি ব্যবহারকারীর পরিচালনা, গোষ্ঠী পরিচালন ইত্যাদির জন্য একটি মাইক্রোসার্ভিস পেতে পারি এবং একটি ছোট এপিআই / গেটওয়ে / প্রক্সি তৈরি করে সেই পরিষেবাগুলি গ্রাস করতে পারি যা সেই মাইক্রোসার্ফিসগুলি কল করে।

  • পেশাদাররা:

    1. নতুন এক্সটেনশনগুলি সহজেই বিকাশ ও পরীক্ষা করা যায়

    2. উদ্বেগ পৃথক করা

  • কনস:

    1. মোতায়েন করা জটিল হবে। আপনার কাছে একটি নিজস্ব এপিআই এবং এন মাইক্রোসার্কেস রয়েছে তাদের নিজস্ব প্রক্রিয়া শুরু করার এবং একটি বন্দর শোনার।

    2. দেখে মনে হচ্ছে যে আমি প্রতিটি গ্রাহকের জন্য এটি অনুকূলিত করতে চাইলে একটি নতুন গেটওয়ে এপিআই তৈরি করতে হবে। সুতরাং অ্যাপ্লিকেশনটি প্রসারিত করার পরিবর্তে আমাকে প্রতিটি সময় কাস্টমাইজড কমসুমিং এপিআই তৈরি করতে হবে। এটি সমস্যার সমাধান করবে না।

    3. এক্সটেনশন এপিআইগুলিকে সুরক্ষিত করতে (মূল API দ্বারা প্রমাণীকরণ পরিচালনা করা হয়) প্রক্সিটির সেই APIগুলির সাথে একটি গোপন ভাগ করা প্রয়োজন। সুতরাং এক্সটেনশান এপিআই কেবলমাত্র প্রক্সি থেকে ম্যাচিং গোপন সরবরাহ করা হলে আগত অনুরোধগুলি পাস করবে।



লিঙ্কের জন্য ধন্যবাদ। তবে আমি আমার কোডের মধ্যে কাস্টম এক্সটেনশনগুলি থাকা উচিত বলে মনে করি না। মাইক্রোসার্ভেসিসগুলি ডক্স.নাস্টজেএস
hrp8sfH4xQ4

আমি মনে করি আপনার সমস্যা বিশ্রামের চেয়ে অনুমোদনের সাথে সম্পর্কিত।
আদনানমুতালেব

@ আদনানমুত্তালেব কেন = বোঝাতে আপনার মনে হবে?
hrp8sfH4xQ4

উত্তর:


6

এটির জন্য বেশ কয়েকটি পন্থা রয়েছে। আপনাকে যা করতে হবে তা হ'ল ওয়ার্কফ্লো আপনার দল, সংস্থা এবং ক্লায়েন্টদের জন্য সবচেয়ে উপযুক্ত।

যদি এটি আমার অবধি থাকে, আমি কনফিগারেশনটি পরিচালনা করতে ব্যক্তিগত বা সংস্থার স্কোপড প্যাকেজগুলির সাথে এনপিএমের মতো একটি প্যাকেজ ম্যানেজার ব্যবহার করব এবং মডিউল প্রতি একটি সংগ্রহস্থল ব্যবহার করার বিষয়টি বিবেচনা করব। তারপরে বিল্ড রিলিজ পাইপলাইনগুলি সেট আপ করুন যা নতুন বিল্ডগুলিতে প্যাকেজ রেপোতে চাপ দেয়।

এইভাবে আপনার যা দরকার তা হ'ল প্রধান ফাইল এবং কাস্টম ইনস্টলেশন প্রতি প্যাকেজ ম্যানিফেস্ট ফাইল। আপনি স্বাধীনভাবে নতুন সংস্করণগুলি বিকাশ করতে এবং স্থাপন করতে পারেন এবং যখন ক্লায়েন্ট-সাইডে আপনার প্রয়োজন হবে তখন আপনি নতুন সংস্করণগুলি লোড করতে পারেন।

যুক্ত মসৃণতার জন্য, আপনি রুটগুলিতে মডিউলগুলি মানচিত্র করতে এবং বেশিরভাগ বুটস্ট্র্যাপিংয়ের জন্য জেনেরিক রুট জেনারেটর স্ক্রিপ্ট লিখতে একটি কনফিগারেশন ফাইল ব্যবহার করতে পারেন।

যেহেতু একটি প্যাকেজ যে কোনও কিছু হতে পারে, তাই প্যাকেজগুলির মধ্যে ক্রস নির্ভরতা অনেক ঝামেলা ছাড়াই কাজ করবে। পরিবর্তন এবং সংস্করণ পরিচালনার ক্ষেত্রে আপনার কেবলমাত্র শৃঙ্খলাবদ্ধ হওয়া দরকার।

এখানে ব্যক্তিগত প্যাকেজ সম্পর্কে আরও পড়ুন: ব্যক্তিগত প্যাকেজগুলি এনপিএম

এখন বেসরকারী এনপিএম রেজিস্ট্রিগুলিতে অর্থ ব্যয় হয়, তবে এটি যদি সমস্যা হয় তবে আরও কয়েকটি বিকল্প রয়েছে। বিনামূল্যে এবং অর্থ প্রদান উভয় বিকল্পের জন্য দয়া করে এই নিবন্ধটি পর্যালোচনা করুন।

আপনার ব্যক্তিগত এনএমপি রেজিস্ট্রি করার উপায়

এখন আপনি যদি নিজের ব্যবস্থাপককে রোল করতে চান তবে আপনি একটি সাধারণ সার্ভিস লোকেটার লিখতে পারেন, এটি একটি কনফিগারেশন ফাইলের মধ্যে প্রয়োজনীয় তথ্য সম্বলিত রেপো থেকে কোডটি টানতে, এটি লোড করতে, এবং তারপরে পুনরুদ্ধার করার জন্য কিছু পদ্ধতি সরবরাহ করতে পারে এটি উদাহরণস্বরূপ।

আমি এই জাতীয় সিস্টেমের জন্য একটি সাধারণ রেফারেন্স বাস্তবায়ন লিখেছি:

কাঠামো: লোকোমোশন পরিষেবা লোকেটার

প্যালিনড্রোমগুলির জন্য প্লাগইন চেকের একটি উদাহরণ: লোকমোশন প্লাগইন উদাহরণ

প্লাগইনগুলি সনাক্ত করতে ফ্রেমওয়ার্ক ব্যবহার করে একটি অ্যাপ্লিকেশন: লোকমোশন অ্যাপ্লিকেশন উদাহরণ

এনপিএম থেকে এটি ব্যবহার করে npm install -s locomotionআপনি এটিকে ঘিরে খেলতে পারেন এটি ব্যবহার করে আপনাকে plugins.jsonনিম্নলিখিত স্কিমা সহ কোনও ফাইল নির্দিষ্ট করতে হবে :

{
    "path": "relative path where plugins should be stored",
    "plugins": [
        { 
           "module":"name of service", 
           "dir":"location within plugin folder",
           "source":"link to git repository"
        }
    ]
}

উদাহরণ:

{
    "path": "./plugins",
    "plugins": [
        {
            "module": "palindrome",
            "dir": "locomotion-plugin-example",
            "source": "https://github.com/drcircuit/locomotion-plugin-example.git"
        }
    ]
}

এটি এটিকে লোড করুন: কনট লোকো = প্রয়োজনীয় ("লোকোমোশন");

এরপরে এটি একটি প্রতিশ্রুতি দেয় যা পরিষেবা লোকেটার অবজেক্টটিকে সমাধান করবে, এতে আপনার পরিষেবার হোল্ড পেতে লোকেটার পদ্ধতি রয়েছে:

loco.then((svc) => {
    let pal = svc.locate("palindrome"); //get the palindrome service
    if (pal) {
        console.log("Is: no X in Nixon! a palindrome? ", (pal.isPalindrome("no X in Nixon!")) ? "Yes" : "no"); // test if it works :)
    }
}).catch((err) => {
    console.error(err);
});

দয়া করে মনে রাখবেন এটি কেবল একটি রেফারেন্স বাস্তবায়ন, এবং গুরুতর অ্যাপ্লিকেশনটির জন্য যথেষ্ট শক্তিশালী নয়। তবে, প্যাটার্নটি এখনও বৈধ এবং এই ধরণের ফ্রেমওয়ার্কটি লেখার আক্ষেপ দেখায়।

এখন, এটি প্লাগইন কনফিগারেশন, ইনিশিয়ালাইজেশন, ত্রুটি যাচাইকরণ, সম্ভবত নির্ভরতা ইনজেকশন ইত্যাদির জন্য সমর্থন যুক্ত করার জন্য সমর্থন বাড়ানো দরকার।


ধন্যবাদ। দুটি সমস্যা দেখা দেয়, মনে হয় আমরা তখন এনপিএমের উপর নির্ভর করি এবং একটি স্ব-হোস্টেড রেজিস্ট্রি সেটআপ করতে হবে। দ্বিতীয় জিনিসটি হ'ল প্রাইভেট এনপিএম আর মুক্ত নয়। আমি একটি প্রাথমিক প্রযুক্তিগত সমাধান খুঁজে পেতে আশা ছিল। তবে ধারণার জন্য +1 :)
hrp8sfH4xQ4

1
এই ধরণের সিস্টেমের জন্য একটি প্রাথমিক সমাধানের একটি রেফারেন্স বাস্তবায়ন যুক্ত করেছে।
এস্পেন

3

আমি বাহ্যিক প্যাকেজ বিকল্পের জন্য যেতে হবে।

আপনি একটি packagesফোল্ডার রাখতে আপনার অ্যাপ্লিকেশনটি কাঠামো করতে পারেন । আমি এই ফোল্ডারে বাহ্যিক প্যাকেজগুলির UMD সংকলন করব যাতে আপনার সংকলিত টাইপস্ক্রিপ্ট প্যাকেজগুলির সাথে কোনও সমস্যা না হয়। সমস্ত প্যাকেজগুলির index.jsপ্রতিটি প্যাকেজের রুট ফোল্ডারে একটি ফাইল থাকা উচিত ।

এবং আপনার অ্যাপ্লিকেশন প্যাকেজ ফোল্ডার fsএবং requireসমস্ত প্যাকেজ ব্যবহার করে একটি লুপ চালাতে পারেindex.js আপনার অ্যাপ মধ্যে।

তারপরে আবার নির্ভরতা ইনস্টলেশনটি আপনাকে যত্ন নিতে হবে। আমি মনে করি প্রতিটি প্যাকেজের একটি কনফিগারেশন ফাইলও এটি সমাধান করতে পারে। npmঅ্যাপ্লিকেশন শুরু করার আগে সমস্ত প্যাকেজ নির্ভরতা ইনস্টল করার জন্য আপনার প্রধান অ্যাপ্লিকেশনটিতে একটি কাস্টম স্ক্রিপ্ট থাকতে পারে।

এইভাবে, আপনি প্যাকেজগুলি ফোল্ডারে প্যাকেজটি অনুলিপি করে অ্যাপটি পুনরায় বুট করে আপনার অ্যাপ্লিকেশনটিতে নতুন প্যাকেজগুলি যুক্ত করতে পারেন। আপনার সংকলিত টাইপসক্রিপ্ট ফাইলগুলি স্পর্শ করা যাবে না এবং আপনার নিজের প্যাকেজগুলির জন্য আপনাকে ব্যক্তিগত এনপিএম ব্যবহার করতে হবে না।


আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. আমি মনে করি @ এ্যাসপেন ইতিমধ্যে পোস্ট করা সমাধানটির মতো মনে হচ্ছে, না?
hrp8sfH4xQ4

@ hrp8sfH4xQ4 হ্যাঁ, প্রসারিত। আমি আপনার মন্তব্যটি ব্যবহার করতে চাইছেন না পড়ার পরে এটি যুক্ত করেছি npm। উপরে বেসিক এনএমপি অ্যাকাউন্ট এড়াতে আপনি করতে পারেন এমন একটি সমাধান। তদুপরি, আমি বিশ্বাস করি আপনার প্রতিষ্ঠানের বাইরের কেউ তৈরি প্যাকেজ যুক্ত করার দরকার নেই। রাইট?
কালেশ কালাধরন

BTW। তবে এটিকে সমর্থন করাও দুর্দান্ত লাগবে ... একরকম ...
hrp8sfH4xQ4

আপনার যদি তৃতীয় পক্ষের প্যাকেজ যুক্ত করার বিকল্পের প্রয়োজন হয় তবে npmতা করার উপায় বা অন্য কোনও প্যাকেজ ম্যানেজার। এই ধরনের ক্ষেত্রে, আমার সমাধান যথেষ্ট হবে না।
কালেশ কালাধারন

আপনি যদি আপত্তি না করেন তবে আমি যথাসম্ভব অনেকগুলি সংগ্রহ করার জন্য অপেক্ষা করতে চাই
hrp8sfH4xQ4
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.