কাস্টম প্লাগইনগুলি বিকাশ করুন

আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন
.info- তে যান।

Edge Microgateway v. 2.5.x

দর্শক

এই বিষয়টি সেইসব ডেভেলপারদের জন্য, যারা কাস্টম প্লাগইন লিখে Edge Microgateway-এর ফিচারগুলো প্রসারিত করতে চান। আপনি যদি একটি নতুন প্লাগইন লিখতে চান, তবে JavaScript এবং Node.js-এ অভিজ্ঞতা থাকা আবশ্যক।

কাস্টম এজ মাইক্রোগেটওয়ে প্লাগইন বলতে কী বোঝায়?

প্লাগইন হলো একটি Node.js মডিউল যা Edge Microgateway-তে বিভিন্ন কার্যকারিতা যোগ করে। প্লাগইন মডিউলগুলো একটি নির্দিষ্ট প্যাটার্ন অনুসরণ করে এবং Edge Microgateway-এর পরিচিত কোনো স্থানে সংরক্ষিত থাকে, যার ফলে এগুলো স্বয়ংক্রিয়ভাবে আবিষ্কৃত ও চালিত হতে পারে। আপনি যখন Edge Microgateway ইনস্টল করেন, তখন বেশ কিছু পূর্বনির্ধারিত প্লাগইন সরবরাহ করা হয়। এগুলোর মধ্যে রয়েছে অথেনটিকেশন, স্পাইক অ্যারেস্ট, কোটা এবং অ্যানালিটিক্স-এর জন্য প্লাগইন। এই বিদ্যমান প্লাগইনগুলো "প্লাগইন ব্যবহার করুন" অংশে বর্ণনা করা হয়েছে।

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

কাস্টম প্লাগইন কোড কোথায় রাখতে হবে

এখানে Edge Microgateway ইনস্টলেশনের অংশ হিসেবে কাস্টম প্লাগইনগুলির জন্য একটি ফোল্ডার অন্তর্ভুক্ত রয়েছে:

[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins

যেখানে [prefix] হলো npm প্রিফিক্স ডিরেক্টরি, যেমনটি Edge Microgateway ইনস্টল করার "Where is Edge Microgateway" অংশে বর্ণনা করা হয়েছে।

আপনি এই ডিফল্ট প্লাগইন ডিরেক্টরিটি পরিবর্তন করতে পারেন। প্লাগইন কোথায় পাবেন তা দেখুন।

পূর্বনির্ধারিত প্লাগইনগুলি পর্যালোচনা করা হচ্ছে

আপনার নিজের প্লাগইন তৈরি করার চেষ্টা করার আগে, আগে থেকে তৈরি করা কোনো প্লাগইন আপনার প্রয়োজন মেটাচ্ছে কিনা তা যাচাই করে নেওয়া ভালো। এই প্লাগইনগুলো এখানে অবস্থিত:

[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins

যেখানে [prefix] হলো npm প্রিফিক্স ডিরেক্টরি। Edge Microgateway ইনস্টল করার অংশে "Edge Microgateway কোথায় ইনস্টল করা আছে" অংশটিও দেখুন।

বিস্তারিত জানতে, Edge Microgateway-এর সাথে প্রদত্ত পূর্বনির্ধারিত প্লাগইনগুলোও দেখুন।

একটি সহজ প্লাগইন লিখুন

এই অংশে, আমরা একটি সাধারণ প্লাগইন তৈরি করার জন্য প্রয়োজনীয় ধাপগুলো আলোচনা করব। এই প্লাগইনটি রেসপন্স ডেটাকে (সেটি যা-ই হোক না কেন) "Hello, World!" স্ট্রিংটি দিয়ে ওভাররাইড করে এবং তা টার্মিনালে প্রিন্ট করে।

  1. যদি Edge Microgateway চালু থাকে, তবে এখনই এটি বন্ধ করুন:
    edgemicro stop
  2. কাস্টম প্লাগইন ডিরেক্টরিতে cd :

    cd [prefix]/lib/node_modules/edgemicro/plugins

    যেখানে [prefix] হলো npm প্রিফিক্স ডিরেক্টরি, যেমনটি Edge Microgateway ইনস্টল করার "Where is Edge Microgateway" অংশে বর্ণনা করা হয়েছে।

  3. response-override নামে একটি নতুন প্লাগইন প্রজেক্ট তৈরি করুন এবং সেটিতে cd :
    mkdir response-override && cd response-override
  4. একটি নতুন Node.js প্রজেক্ট তৈরি করুন:
    npm init
    ডিফল্টগুলো গ্রহণ করতে একাধিকবার রিটার্ন চাপুন।
  5. একটি টেক্সট এডিটর ব্যবহার করে index.js নামে একটি নতুন ফাইল তৈরি করুন।
  6. নিচের কোডটি index.js ফাইলে কপি করুন এবং ফাইলটি সেভ করুন।
    'use strict';
    var debug = require('debug')
    
    module.exports.init = function(config, logger, stats) {
    
      return {
       
        ondata_response: function(req, res, data, next) {
          debug('***** plugin ondata_response');
          next(null, null);
        },
        
        onend_response: function(req, res, data, next) {
          debug('***** plugin onend_response');
          next(null, "Hello, World!\n\n");
        }
      };
    }
  7. এখন আপনি একটি প্লাগইন তৈরি করেছেন এবং আপনাকে এটি Edge Microgateway কনফিগারেশনে যুক্ত করতে হবে। $HOME/.edgemicro/[org]-[env]-config.yaml ফাইলটি খুলুন, যেখানে org এবং env হলো আপনার Edge অর্গানাইজেশন এবং এনভায়রনমেন্টের নাম।
  8. নিচে দেখানো অনুযায়ী plugins:sequence এলিমেন্টে response-override প্লাগইনটি যোগ করুন।
          ...
          
          plugins:
            dir: ../plugins
            sequence:
              - oauth
              - response-override
              
          ...
        
  9. Edge Microgateway পুনরায় চালু করুন।
  10. Edge Microgateway-এর মাধ্যমে একটি API কল করুন। (এই API কলটি ধরে নেয় যে আপনি "Edge Microgateway সেট আপ এবং কনফিগার করা" অংশে বর্ণিত API কী সুরক্ষার সাথে টিউটোরিয়ালের মতো একই কনফিগারেশন সেট আপ করেছেন:)
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!

একটি প্লাগইনের গঠন

নিম্নলিখিত Edge Microgateway নমুনা প্লাগইনটি আপনার নিজের প্লাগইন তৈরি করার সময় অনুসরণীয় পদ্ধতিটি তুলে ধরে। এই বিভাগে আলোচিত নমুনা প্লাগইনটির সোর্স কোড plugins/header-uppercase/index.js.

  • প্লাগইনগুলো হলো স্ট্যান্ডার্ড NPM মডিউল, যেগুলোর রুট ফোল্ডারে package.json এবং index.js ফাইল থাকে।
  • একটি প্লাগইনকে অবশ্যই একটি init() ফাংশন এক্সপোর্ট করতে হবে।
  • init() ফাংশনটি তিনটি আর্গুমেন্ট গ্রহণ করে: config , logger , এবং stats । এই আর্গুমেন্টগুলো প্লাগইন init() ফাংশনের আর্গুমেন্ট অংশে বর্ণনা করা হয়েছে।
  • init() একটি অবজেক্ট রিটার্ন করে, যাতে নামযুক্ত ফাংশন হ্যান্ডলার থাকে, যেগুলো একটি রিকোয়েস্টের জীবনকালে নির্দিষ্ট কিছু ঘটনা ঘটলে কল করা হয়।

ইভেন্ট হ্যান্ডলার ফাংশন

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

অনুরোধ প্রবাহ ইভেন্ট হ্যান্ডলার

Edge Microgateway-তে রিকোয়েস্ট ইভেন্টের ভিত্তিতে এই ফাংশনগুলো কল করা হয়।

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest ফাংশন

ক্লায়েন্ট অনুরোধের শুরুতে এটি কল করা হয়। Edge Microgateway-তে অনুরোধের প্রথম বাইটটি গৃহীত হলে এই ফাংশনটি চালু হয়। এই ফাংশনটি আপনাকে অনুরোধের হেডার, URL, কোয়েরি প্যারামিটার এবং HTTP মেথড অ্যাক্সেস করার সুযোগ দেয়। আপনি যদি 'next' ফাংশনটিকে একটি ট্রুথি ফার্স্ট আর্গুমেন্ট (যেমন Error-এর একটি ইনস্ট্যান্স) দিয়ে কল করেন, তাহলে অনুরোধ প্রক্রিয়াকরণ থেমে যায় এবং কোনো টার্গেট অনুরোধ শুরু হয় না।

উদাহরণ:

onrequest: function(req, res, next) {
      debug('plugin onrequest');
      req.headers['x-foo-request-start'] = Date.now();
      next();
    }

ondata_request ফাংশন

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

উদাহরণ:

ondata_request: function(req, res, data, next) {
      debug('plugin ondata_request ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }

onend_request ফাংশন

ক্লায়েন্টের কাছ থেকে অনুরোধের সমস্ত ডেটা পাওয়া গেলে এটি কল করা হয়।

উদাহরণ:

onend_request: function(req, res, data, next) {
      debug('plugin onend_request');
      next(null, data);
    }

onclose_request ফাংশন

এটি নির্দেশ করে যে ক্লায়েন্ট সংযোগ বন্ধ হয়ে গেছে। ক্লায়েন্ট সংযোগ নির্ভরযোগ্য না হলে আপনি এই ফাংশনটি ব্যবহার করতে পারেন। ক্লায়েন্টের সাথে সকেট সংযোগ বন্ধ হয়ে গেলে এটি কল করা হয়।

উদাহরণ:

onclose_request: function(req, res, next) {
      debug('plugin onclose_request');
      next();
    }

onerror_request ফাংশন

ক্লায়েন্টের অনুরোধ গ্রহণে কোনো ত্রুটি হলে এটি কল করা হয়।

উদাহরণ:

onerror_request: function(req, res, err, next) {
      debug('plugin onerror_request ' + err);
      next();
    }

প্রতিক্রিয়া প্রবাহ ইভেন্ট হ্যান্ডলার

Edge Microgateway-তে রেসপন্স ইভেন্টের সময় এই ফাংশনগুলো কল করা হয়।

  • onresponse
  • ondata_response
  • onend_response
  • onclose_response
  • onerror_response

onresponse ফাংশন

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

উদাহরণ:

onresponse: function(req, res, next) {      
    debug('plugin onresponse');     
    res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start'])    
    next();    
}


ondata_response ফাংশন

টার্গেট থেকে ডেটার একটি অংশ পাওয়া গেলে এটি কল করা হয়।

উদাহরণ:

ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    }


onend_response ফাংশন

টার্গেট থেকে সমস্ত প্রতিক্রিয়া ডেটা পাওয়া গেলে এটি কল করা হয়।

উদাহরণ:

onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    }

onclose_response ফাংশন

এটি নির্দেশ করে যে টার্গেট সংযোগটি বন্ধ হয়ে গেছে। টার্গেট সংযোগটি নির্ভরযোগ্য না হলে আপনি এই ফাংশনটি ব্যবহার করতে পারেন। টার্গেটের সাথে সকেট সংযোগ বন্ধ হয়ে গেলে এটি কল করা হয়।

উদাহরণ:

onclose_response: function(req, res, next) {
      debug('plugin onclose_response');
      next();
    }


onerror_response ফাংশন

লক্ষ্য প্রতিক্রিয়া পেতে কোনো ত্রুটি হলে এটি কল করা হয়।

উদাহরণ:

onerror_response: function(req, res, err, next) {
      debug('plugin onerror_response ' + err);
      next();
    }

প্লাগইন ইভেন্ট হ্যান্ডলার ফাংশন সম্পর্কে আপনার যা জানা প্রয়োজন

Edge Microgateway যখন কোনো নির্দিষ্ট API অনুরোধ প্রসেস করে, তখন সংঘটিত বিশেষ ইভেন্টের প্রতিক্রিয়ায় প্লাগইন ইভেন্ট হ্যান্ডলার ফাংশনগুলো কল করা হয়।

  • init() ফাংশনের প্রতিটি হ্যান্ডলারকে ( যেমন ondata_request , ondata_response ইত্যাদি) প্রসেসিং শেষ হলে অবশ্যই next() কলব্যাকটি কল করতে হবে। যদি আপনি next() কল না করেন, তাহলে প্রসেসিং থেমে যাবে এবং রিকোয়েস্টটি আটকে থাকবে।
  • next() ফাংশনের প্রথম আর্গুমেন্টটি একটি ত্রুটি হতে পারে, যার ফলে অনুরোধ প্রক্রিয়াকরণ বন্ধ হয়ে যাবে।
  • ondata_ এবং onend_ হ্যান্ডলারগুলোকে অবশ্যই next() ফাংশনকে একটি দ্বিতীয় আর্গুমেন্টসহ কল ​​করতে হবে, যেটিতে টার্গেট বা ক্লায়েন্টের কাছে পাঠানোর জন্য ডেটা থাকবে। যদি প্লাগইনটি বাফারিং অবস্থায় থাকে এবং এই মুহূর্তে রূপান্তর করার জন্য পর্যাপ্ত ডেটা না থাকে, তাহলে এই আর্গুমেন্টটি null হতে পারে।
  • উল্লেখ্য যে, সমস্ত অনুরোধ এবং প্রতিক্রিয়া পরিষেবা দেওয়ার জন্য প্লাগইনটির একটিমাত্র ইনস্ট্যান্স ব্যবহার করা হয়। যদি কোনো প্লাগইন কলগুলোর মধ্যে প্রতি-অনুরোধের স্টেট ধরে রাখতে চায়, তবে এটি সরবরাহকৃত রিকোয়েস্ট অবজেক্ট ( req )-এ যোগ করা একটি প্রপার্টিতে সেই স্টেটটি সংরক্ষণ করতে পারে, যার লাইফটাইম হলো এপিআই কলটির সময়কাল।
  • সমস্ত ত্রুটি ধরতে সতর্ক থাকুন এবং ত্রুটিসহ next() কল করুন। next() কল করতে ব্যর্থ হলে API কলটি আটকে যাবে।
  • মেমরি লিক যেন না হয় সেদিকে সতর্ক থাকুন, কারণ এটি এজ মাইক্রোগেটওয়ের সার্বিক পারফরম্যান্সকে প্রভাবিত করতে পারে এবং মেমরি শেষ হয়ে গেলে এটি ক্র্যাশও করতে পারে।
  • Node.js মডেল অনুসরণ করার ব্যাপারে সতর্ক থাকুন এবং মেইন থ্রেডে কম্পিউট-ইনটেনসিভ টাস্ক করবেন না, কারণ এটি Edge Microgateway-এর পারফরম্যান্সকে নেতিবাচকভাবে প্রভাবিত করতে পারে।

প্লাগইন init() ফাংশন সম্পর্কে

এই অংশে init() ফাংশনে প্রদত্ত আর্গুমেন্টগুলো— config , logger , এবং stats— বর্ণনা করা হয়েছে।

কনফিগারেশন

Edge Microgateway-এর কনফিগারেশন ফাইলের সাথে Apigee Edge থেকে ডাউনলোড করা তথ্য, যেমন প্রোডাক্ট এবং কোটা, একত্রিত করার পর প্রাপ্ত একটি কনফিগারেশন অবজেক্ট। আপনি এই অবজেক্টে প্লাগইন-নির্দিষ্ট কনফিগারেশন খুঁজে পেতে পারেন: config.<plugin-name>

response-override নামের একটি প্লাগইনে `param` নামের একটি কনফিগ প্যারামিটার যার ভ্যালু `foo` , সেটি যোগ করতে default.yaml ফাইলে এটি লিখুন:

response-override:
    param: foo

তারপর, আপনি আপনার প্লাগইন কোডে প্যারামিটারটি এইভাবে অ্যাক্সেস করতে পারবেন:

// Called when response data is received
    ondata_response: function(req, res, data, next) {
      debug('***** plugin ondata_response');
      debug('***** plugin ondata_response: config.param: ' + config.param);
      next(null, data);
    },

এক্ষেত্রে, আপনি প্লাগইন ডিবাগ আউটপুটে 'foo' প্রিন্ট হতে দেখবেন:

Sun, 13 Dec 2015 21:25:08 GMT plugin:response-override ***** plugin ondata_response: config.param: foo

লগার

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

  • info(object, message)
  • warn(object, message)
  • error(object, message)

পরিসংখ্যান

এমন একটি অবজেক্ট যা একটি মাইক্রোগেটওয়ে ইনস্ট্যান্সের মধ্য দিয়ে প্রবাহিত অনুরোধ এবং প্রতিক্রিয়া সম্পর্কিত অনুরোধ, প্রতিক্রিয়া, ত্রুটি এবং অন্যান্য সমষ্টিগত পরিসংখ্যান ধারণ করে।

  • treqErrors - ত্রুটিসহ লক্ষ্য অনুরোধের সংখ্যা।
  • treqErrors - ত্রুটিসহ লক্ষ্য প্রতিক্রিয়ার সংখ্যা।
  • statusCodes - একটি অবজেক্ট যাতে প্রতিক্রিয়া কোডের সংখ্যা থাকে:
{
  1: number of target responses with 1xx response codes
  2: number of target responses with 2xx response codes
  3: number of target responses with 3xx response codes
  4: number of target responses with 4xx response codes
  5: number of target responses with 5xx response codes
  }
  
  • অনুরোধ - মোট অনুরোধের সংখ্যা।
  • প্রতিক্রিয়াসমূহ - মোট প্রতিক্রিয়ার সংখ্যা।
  • সংযোগসমূহ - সক্রিয় টার্গেট সংযোগের সংখ্যা।

next() ফাংশন সম্পর্কে

সিরিজের পরবর্তী মেথডের প্রসেসিং চালিয়ে যাওয়ার জন্য সমস্ত প্লাগইন মেথডকে অবশ্যই next() কল করতে হবে (নতুবা প্লাগইন প্রসেসটি আটকে যাবে)। রিকোয়েস্ট লাইফ সাইকেলে, প্রথম যে মেথডটি কল করা হয় তা হলো onrequest()। এর পরের যে মেথডটি কল করা হয় তা হলো ondata_request() ; তবে, ondata_request শুধুমাত্র তখনই কল করা হয় যখন রিকোয়েস্টে ডেটা অন্তর্ভুক্ত থাকে, যেমন, উদাহরণস্বরূপ, একটি POST রিকোয়েস্টের ক্ষেত্রে। এর পরের যে মেথডটি কল করা হবে তা হলো onend_request() , যা রিকোয়েস্ট প্রসেসিং সম্পন্ন হলে কল করা হয়। onerror_* ফাংশনগুলো শুধুমাত্র কোনো ত্রুটির ক্ষেত্রে কল করা হয়, এবং আপনি চাইলে কাস্টম কোডের মাধ্যমে ত্রুটিগুলো হ্যান্ডেল করার সুযোগ পান।

ধরা যাক, অনুরোধে ডেটা পাঠানো হয়েছে এবং ondata_request() ফাংশনটি কল করা হয়েছে। লক্ষ্য করুন যে, ফাংশনটি দুটি প্যারামিটার সহ next() ফাংশনটিকে কল করে:

next(null, data);

প্রচলিত নিয়ম অনুযায়ী, প্রথম প্যারামিটারটি ত্রুটির তথ্য জানানোর জন্য ব্যবহৃত হয়, যা আপনি চেইনের পরবর্তী কোনো ফাংশনে সমাধান করতে পারেন। এটিকে null (একটি ফলসি আর্গুমেন্ট) সেট করার মাধ্যমে আমরা বোঝাই যে কোনো ত্রুটি নেই এবং অনুরোধ প্রক্রিয়াকরণ স্বাভাবিকভাবে চলতে থাকবে। যদি এই আর্গুমেন্টটি ট্রুথি হয় (যেমন একটি Error অবজেক্ট), তাহলে অনুরোধ প্রক্রিয়াকরণ থেমে যায় এবং অনুরোধটি টার্গেটে পাঠানো হয়।

দ্বিতীয় প্যারামিটারটি চেইনের পরবর্তী ফাংশনে রিকোয়েস্ট ডেটা পাঠায়। আপনি যদি কোনো অতিরিক্ত প্রসেসিং না করেন, তাহলে রিকোয়েস্ট ডেটা অপরিবর্তিত অবস্থায় এপিআই-এর টার্গেটে চলে যায়। তবে, এই মেথডের মধ্যেই আপনার রিকোয়েস্ট ডেটা পরিবর্তন করার এবং পরিবর্তিত রিকোয়েস্টটি টার্গেটে পাঠানোর সুযোগ রয়েছে। উদাহরণস্বরূপ, যদি রিকোয়েস্ট ডেটা XML হয় এবং টার্গেট JSON আশা করে, তাহলে আপনি ondata_request() মেথডে এমন কোড যোগ করতে পারেন যা (ক) রিকোয়েস্ট হেডারের Content-Type পরিবর্তন করে application/json করে দেবে এবং আপনার ইচ্ছামতো যেকোনো উপায়ে রিকোয়েস্ট ডেটাকে JSON-এ রূপান্তর করবে (উদাহরণস্বরূপ, আপনি NPM থেকে প্রাপ্ত একটি Node.js xml2json কনভার্টার ব্যবহার করতে পারেন)।

চলুন দেখি সেটা কেমন দেখতে হতে পারে:

ondata_request: function(req, res, data, next) {
  debug('****** plugin ondata_request');
  var translated_data = parser.toJson(data);
  next(null, translated_data);
},

এক্ষেত্রে, অনুরোধের ডেটা (যা XML বলে ধরে নেওয়া হয়) JSON-এ রূপান্তরিত করা হয় এবং সেই রূপান্তরিত ডেটা ব্যাকএন্ড টার্গেটে পাঠানোর আগে next() ফাংশনের মাধ্যমে অনুরোধ শৃঙ্খলের পরবর্তী ফাংশনে পাঠানো হয়।

মনে রাখবেন যে, ডিবাগিংয়ের উদ্দেশ্যে রূপান্তরিত ডেটা প্রিন্ট করার জন্য আপনি আরেকটি ডিবাগ স্টেটমেন্ট যোগ করতে পারেন। উদাহরণস্বরূপ:

ondata_request: function(req, res, data, next) {
  debug('****** plugin ondata_request');
  var translated_data = parser.toJson(data);
  debug('****** plugin ondata_response: translated_json: ' + translated_json);
  next(null, translated_data);
},

প্লাগইন হ্যান্ডলার কার্যকর করার ক্রম সম্পর্কে

আপনি যদি এজ মাইক্রোগেটওয়ের জন্য প্লাগইন লেখেন, তাহলে প্লাগইন ইভেন্ট হ্যান্ডলারগুলো কোন ক্রমে কার্যকর হয় তা আপনাকে বুঝতে হবে।

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

নিম্নলিখিত উদাহরণটি আপনাকে এই কার্যসম্পাদন ক্রমটি বুঝতে সাহায্য করার জন্য তৈরি করা হয়েছে।

১. তিনটি সহজ প্লাগইন তৈরি করুন

নিম্নলিখিত প্লাগইনটি বিবেচনা করুন। এর ইভেন্ট হ্যান্ডলারগুলো কল করা হলে এটি কেবল কনসোল আউটপুট প্রিন্ট করে:

plugins/plugin-1/index.js

module.exports.init = function(config, logger, stats) {

  return {

    onrequest: function(req, res, next) {
      console.log('plugin-1: onrequest');
      next();
    },

    onend_request: function(req, res, data, next) {
      console.log('plugin-1: onend_request');
      next(null, data);
    },

    ondata_response: function(req, res, data, next) {
      console.log('plugin-1: ondata_response ' + data.length);
      next(null, data);
    },

    onend_response: function(req, res, data, next) {
      console.log('plugin-1: onend_response');
      next(null, data);
    }
  };
}

এখন, একই কোড ব্যবহার করে plugin-2 এবং plugin-3 নামে আরও দুটি প্লাগইন তৈরি করার কথা ভাবুন (তবে, console.log() স্টেটমেন্টগুলো যথাক্রমে plugin-2 এবং plugin-3 এ পরিবর্তন করুন)।

২. প্লাগইন কোডটি পর্যালোচনা করুন

<microgateway-root-dir>/plugins/plugin-1/index.js এ থাকা এক্সপোর্ট করা প্লাগইন ফাংশনগুলো হলো ইভেন্ট হ্যান্ডলার, যা রিকোয়েস্ট এবং রেসপন্স প্রসেসিংয়ের সময় নির্দিষ্ট মুহূর্তে এক্সিকিউট হয়। উদাহরণস্বরূপ, রিকোয়েস্ট হেডারের প্রথম বাইটটি পাওয়ার পর onrequest এক্সিকিউট হয়। অন্যদিকে, রেসপন্স ডেটার শেষ বাইটটি পাওয়ার পর onend_response এক্সিকিউট হয়।

ondata_response হ্যান্ডলারটি দেখুন — যখনই রেসপন্স ডেটার একটি অংশ পাওয়া যায়, তখনই এটি কল করা হয়। গুরুত্বপূর্ণ বিষয়টি হলো, রেসপন্স ডেটা সবসময় একবারে পাওয়া যায় না। বরং, ডেটা যেকোনো দৈর্ঘ্যের খণ্ডে খণ্ডে পাওয়া যেতে পারে।

৩. প্লাগইনগুলোকে প্লাগইন সিকোয়েন্সে যুক্ত করুন।

এই উদাহরণটি অনুসরণ করে, আমরা Edge Microgateway কনফিগারেশন ফাইলে ( ~./edgemicro/config.yaml ) প্লাগইন সিকোয়েন্সে প্লাগইনগুলো নিম্নোক্তভাবে যুক্ত করব। সিকোয়েন্সটি গুরুত্বপূর্ণ। এটি নির্ধারণ করে দেয় যে প্লাগইন হ্যান্ডলারগুলো কোন ক্রমে এক্সিকিউট হবে।

  plugins:
    dir: ../plugins
    sequence:
      - plugin-1
      - plugin-2
      - plugin-3
  

৪. ডিবাগ আউটপুট পরীক্ষা করুন

এখন, এই প্লাগইনগুলো কল করা হলে যে আউটপুট তৈরি হবে তা দেখা যাক। এখানে কয়েকটি গুরুত্বপূর্ণ বিষয় লক্ষ্য করার আছে:

  • Edge Microgateway-এর কনফিগারেশন ফাইল ( ~./edgemicro/config.yaml ) প্লাগইন সিকোয়েন্স দ্বারা ইভেন্ট হ্যান্ডলারগুলো কোন ক্রমে কল করা হবে তা নির্দিষ্ট করা থাকে।
  • অনুরোধ হ্যান্ডলারগুলোকে আরোহী ক্রমে কল করা হয় (প্লাগইন অনুক্রমে যে ক্রমে তারা উপস্থিত থাকে -- ১, ২, ৩)।
  • রেসপন্স হ্যান্ডলারগুলো অবরোহী ক্রমে কল করা হয় -- ৩, ২, ১।
  • আগত প্রতিটি ডেটা চাঙ্কের জন্য ondata_response হ্যান্ডলারটি একবার কল করা হয়। এই উদাহরণে (আউটপুট নিচে দেখানো হলো), দুটি চাঙ্ক গ্রহণ করা হয়েছে।

এই তিনটি প্লাগইন ব্যবহৃত হওয়ার সময় এবং Edge Microgateway-এর মাধ্যমে একটি অনুরোধ পাঠানো হলে যে নমুনা ডিবাগ আউটপুট তৈরি হয়, তা এখানে দেওয়া হলো। হ্যান্ডলারগুলো যে ক্রমে কল করা হয়, শুধু সেটি লক্ষ্য করুন:

  plugin-1: onrequest
  plugin-2: onrequest
  plugin-3: onrequest

  plugin-1: onend_request
  plugin-2: onend_request
  plugin-3: onend_request

  plugin-3: ondata_response 931
  plugin-2: ondata_response 931
  plugin-1: ondata_response 931

  plugin-3: ondata_response 1808
  plugin-3: onend_response

  plugin-2: ondata_response 1808
  plugin-2: onend_response

  plugin-1: ondata_response 1808
  plugin-1: onend_response

সারসংক্ষেপ

যখন আপনি কাস্টম প্লাগইন কার্যকারিতা, যেমন অনুরোধ বা প্রতিক্রিয়ার ডেটা সংগ্রহ ও রূপান্তর করা, বাস্তবায়ন করার চেষ্টা করেন, তখন প্লাগইন হ্যান্ডলারগুলো কোন ক্রমে কল করা হয় তা বোঝা অত্যন্ত গুরুত্বপূর্ণ।

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

প্লাগইনগুলিতে গ্লোবাল ভেরিয়েবল ব্যবহার সম্পর্কে

Edge Microgateway-তে পাঠানো প্রতিটি অনুরোধ একটি প্লাগইনের একই ইনস্ট্যান্সে পাঠানো হয়; তাই, অন্য কোনো ক্লায়েন্টের কাছ থেকে আসা দ্বিতীয় অনুরোধের স্টেট প্রথমটিকে ওভাররাইট করে দেবে। প্লাগইনের স্টেট সংরক্ষণ করার একমাত্র নিরাপদ জায়গা হলো রিকোয়েস্ট বা রেসপন্স অবজেক্টের কোনো প্রপার্টিতে স্টেটটি স্টোর করা (যার লাইফটাইম অনুরোধটির লাইফটাইম পর্যন্ত সীমাবদ্ধ)।

প্লাগইনগুলিতে লক্ষ্য URL পুনর্লিখন

যোগ করা হয়েছে: v2.3.3

আপনার প্লাগইন কোডে req.targetHostname এবং req.targetPath ভেরিয়েবলগুলো পরিবর্তন করে আপনি ডায়নামিকভাবে প্লাগইনের ডিফল্ট টার্গেট URL ওভাররাইড করতে পারেন।

v2.4.x-এ যোগ করা হয়েছে

আপনি টার্গেট এন্ডপয়েন্ট পোর্ট ওভাররাইড করতে এবং HTTP ও HTTPS-এর মধ্যে যেকোনো একটি বেছে নিতে পারেন। আপনার প্লাগইন কোডে এই ভেরিয়েবলগুলো পরিবর্তন করুন: req.targetPort এবং req.targetSecure । HTTPS বেছে নিতে, req.targetSecure- কে true সেট করুন; HTTP-এর জন্য, এটিকে false সেট করুন। আপনি যদি req.targetSecure-কে true সেট করেন, তবে আরও তথ্যের জন্য এই আলোচনা থ্রেডটি দেখুন।

Edge Microgateway-তে eurekaclient নামক একটি নমুনা প্লাগইন যুক্ত করা হয়েছে। এই প্লাগইনটি req.targetPort এবং req.targetSecure ভেরিয়েবলগুলো কীভাবে ব্যবহার করতে হয় তা প্রদর্শন করে এবং ব্যাখ্যা করে যে, Edge Microgateway কীভাবে ইউরেকাকে একটি সার্ভিস এন্ডপয়েন্ট ক্যাটালগ হিসেবে ব্যবহার করে ডাইনামিক এন্ডপয়েন্ট লুকআপ সম্পাদন করতে পারে।


নমুনা প্লাগইন

এই প্লাগইনগুলি আপনার Edge Microgateway ইনস্টলেশনের সাথে দেওয়া হয়। আপনি Edge Microgateway ইনস্টলেশনে এগুলি এখানে খুঁজে পেতে পারেন:

[prefix]/lib/node_modules/edgemicro/plugins

যেখানে [prefix] হলো npm প্রিফিক্স ডিরেক্টরি, যেমনটি Edge Microgateway ইনস্টল করার "Where is Edge Microgateway" অংশে বর্ণনা করা হয়েছে।

জমা-অনুরোধ

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

module.exports.init = function(config, logger, stats) {

  function accumulate(req, data) {

    if (!req._chunks) req._chunks = [];
    req._chunks.push(data);

  }

  return {

    ondata_request: function(req, res, data, next) {

      if (data && data.length > 0) accumulate(req, data);

      next(null, null);

    },


    onend_request: function(req, res, data, next) {

      if (data && data.length > 0) accumulate(req, data);

      var content = null;

      if (req._chunks && req._chunks.length) {

        content = Buffer.concat(req._chunks);

      }

      delete req._chunks;

      next(null, content);

    }

  };

}

সঞ্চিত-প্রতিক্রিয়া

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

module.exports.init = function(config, logger, stats) {

  function accumulate(res, data) {
    if (!res._chunks) res._chunks = [];
    res._chunks.push(data);
  }

  return {

    ondata_response: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(res, data);
      next(null, null);
    },

    onend_response: function(req, res, data, next) {
      if (data && data.length > 0) accumulate(res, data);
      var content = Buffer.concat(res._chunks);
      delete res._chunks;
      next(null, content);
    }

  };

}

হেডার-আপারকেস প্লাগইন

Edge Microgateway ডিস্ট্রিবিউশনগুলোতে <microgateway-root-dir>/plugins/header-uppercase নামের একটি স্যাম্পল প্লাগইন অন্তর্ভুক্ত থাকে। এই স্যাম্পলটিতে প্রতিটি ফাংশন হ্যান্ডলারের বর্ণনাসহ কমেন্ট রয়েছে। এই স্যাম্পলটি টার্গেট রেসপন্সের কিছু সাধারণ ডেটা ট্রান্সফরমেশন করে এবং ক্লায়েন্ট রিকোয়েস্ট ও টার্গেট রেসপন্সে কাস্টম হেডার যুক্ত করে।

<microgateway-root-dir>/plugins/header-uppercase/index.js এর সোর্স কোড নিচে দেওয়া হলো:

'use strict';

var debug = require('debug')('plugin:header-uppercase');

// required
module.exports.init = function(config, logger, stats) {

  var counter = 0;

  return {

    // indicates start of client request
    // request headers, url, query params, method should be available at this time
    // request processing stops (and a target request is not initiated) if
    // next is called with a truthy first argument (an instance of Error, for example)
    onrequest: function(req, res, next) {
      debug('plugin onrequest');
      req.headers['x-foo-request-id'] = counter++;
      req.headers['x-foo-request-start'] = Date.now();
      next();
    },

    // indicates start of target response
    // response headers and status code should be available at this time
    onresponse: function(req, res, next) {
      debug('plugin onresponse');
      res.setHeader('x-foo-response-id', req.headers['x-foo-request-id']);
      res.setHeader('x-foo-response-time', Date.now() - req.headers['x-foo-request-start']);
      next();
    },

    // chunk of request body data received from client
    // should return (potentially) transformed data for next plugin in chain
    // the returned value from the last plugin in the chain is written to the target
    ondata_request: function(req, res, data, next) {
      debug('plugin ondata_request ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    },

    // chunk of response body data received from target
    // should return (potentially) transformed data for next plugin in chain
    // the returned value from the last plugin in the chain is written to the client
    ondata_response: function(req, res, data, next) {
      debug('plugin ondata_response ' + data.length);
      var transformed = data.toString().toUpperCase();
      next(null, transformed);
    },

    // indicates end of client request
    onend_request: function(req, res, data, next) {
      debug('plugin onend_request');
      next(null, data);
    },

    // indicates end of target response
    onend_response: function(req, res, data, next) {
      debug('plugin onend_response');
      next(null, data);
    },

    // error receiving client request
    onerror_request: function(req, res, err, next) {
      debug('plugin onerror_request ' + err);
      next();
    },

    // error receiving target response
    onerror_response: function(req, res, err, next) {
      debug('plugin onerror_response ' + err);
      next();
    },

    // indicates client connection closed
    onclose_request: function(req, res, next) {
      debug('plugin onclose_request');
      next();
    },

    // indicates target connection closed
    onclose_response: function(req, res, next) {
      debug('plugin onclose_response');
      next();
    }

  };

}

বড় হাতের অক্ষরে রূপান্তর করুন

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

 */
module.exports.init = function(config, logger, stats) {

  // perform content transformation here
  // the result of the transformation must be another Buffer
  function transform(data) {
    return new Buffer(data.toString().toUpperCase());
  }

  return {

    ondata_response: function(req, res, data, next) {
      // transform each chunk as it is received
      next(null, data ? transform(data) : null);
    },

    onend_response: function(req, res, data, next) {
      // transform accumulated data, if any
      next(null, data ? transform(data) : null);
    },

    ondata_request: function(req, res, data, next) {
      // transform each chunk as it is received
      next(null, data ? transform(data) : null);
    },

    onend_request: function(req, res, data, next) {
      // transform accumulated data, if any
      next(null, data ? transform(data) : null);
    }

  };

}