আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশনে যান । তথ্য
এজ মাইক্রোগেটওয়ে v. 3.3.x
শ্রোতা
এই বিষয়টি এমন ডেভেলপারদের উদ্দেশ্যে করা হয়েছে যারা কাস্টম প্লাগইন লিখে এজ মাইক্রোগেটওয়ে বৈশিষ্ট্য প্রসারিত করতে চান। আপনি যদি একটি নতুন প্লাগইন লিখতে চান তবে JavaScript এবং Node.js এর সাথে অভিজ্ঞতা প্রয়োজন।
একটি কাস্টম এজ মাইক্রোগেটওয়ে প্লাগইন কি?
একটি প্লাগইন হল একটি Node.js মডিউল যা এজ মাইক্রোগেটওয়েতে কার্যকারিতা যোগ করে। প্লাগইন মডিউলগুলি একটি সামঞ্জস্যপূর্ণ প্যাটার্ন অনুসরণ করে এবং এজ মাইক্রোগেটওয়েতে পরিচিত একটি অবস্থানে সংরক্ষণ করা হয়, সেগুলিকে আবিষ্কার করতে এবং স্বয়ংক্রিয়ভাবে চালানোর জন্য সক্ষম করে৷ আপনি যখন এজ মাইক্রোগেটওয়ে ইনস্টল করেন তখন বেশ কয়েকটি পূর্বনির্ধারিত প্লাগইন সরবরাহ করা হয়। এর মধ্যে রয়েছে প্রমাণীকরণ, স্পাইক অ্যারেস্ট, কোটা এবং বিশ্লেষণের জন্য প্লাগইন। এই বিদ্যমান প্লাগইনগুলো ইউজ প্লাগইন -এ বর্ণনা করা হয়েছে।
আপনি কাস্টম প্লাগইন লিখে মাইক্রোগেটওয়েতে নতুন বৈশিষ্ট্য এবং ক্ষমতা যোগ করতে পারেন। ডিফল্টরূপে, এজ মাইক্রোগেটওয়ে মূলত একটি নিরাপদ পাস-থ্রু প্রক্সি যা লক্ষ্য পরিষেবাগুলিতে এবং থেকে অপরিবর্তিত অনুরোধ এবং প্রতিক্রিয়াগুলি পাস করে। কাস্টম প্লাগইনগুলির সাথে, আপনি মাইক্রোগেটওয়ের মাধ্যমে প্রবাহিত অনুরোধ এবং প্রতিক্রিয়াগুলির সাথে প্রোগ্রাম্যাটিকভাবে ইন্টারঅ্যাক্ট করতে পারেন।
কাস্টম প্লাগইন কোড কোথায় রাখবেন
কাস্টম প্লাগইনগুলির জন্য একটি ফোল্ডার এখানে এজ মাইক্রোগেটওয়ে ইনস্টলেশনের অংশ হিসাবে অন্তর্ভুক্ত করা হয়েছে:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
যেখানে [prefix]
হল npm
উপসর্গ নির্দেশিকা যা এজ মাইক্রোগেটওয়ে ইনস্টল করার ক্ষেত্রে "কোথায় এজ মাইক্রোগেটওয়ে ইনস্টল করা হয়েছে" এ বর্ণিত।
আপনি এই ডিফল্ট প্লাগইন ডিরেক্টরি পরিবর্তন করতে পারেন। কোথায় প্লাগইন পাবেন দেখুন।
পূর্বনির্ধারিত প্লাগইনগুলি পর্যালোচনা করা হচ্ছে
আপনি আপনার নিজস্ব প্লাগইন তৈরি করার চেষ্টা করার আগে, পূর্বনির্ধারিত প্লাগইনগুলির কোনোটিই আপনার প্রয়োজনীয়তা পূরণ করে না তা পরীক্ষা করে নেওয়া ভালো। এই প্লাগইনগুলি এখানে অবস্থিত:
[prefix]/lib/node_modules/edgemicro/node_modules/microgateway-plugins
যেখানে [prefix]
হল npm
উপসর্গ ডিরেক্টরি। এজ মাইক্রোগেটওয়ে ইনস্টল করার ক্ষেত্রে "কোথায় এজ মাইক্রোগেটওয়ে ইনস্টল করা আছে" দেখুন।
বিস্তারিত জানার জন্য, এজ মাইক্রোগেটওয়ের সাথে প্রদত্ত পূর্বনির্ধারিত প্লাগইনগুলিও দেখুন।
একটি সাধারণ প্লাগইন লিখুন
এই বিভাগে, আমরা একটি সাধারণ প্লাগইন তৈরি করার জন্য প্রয়োজনীয় পদক্ষেপগুলির মধ্য দিয়ে হেঁটে যাব। এই প্লাগইনটি "হ্যালো, বিশ্ব!" এবং টার্মিনালে প্রিন্ট করে।
- যদি এজ মাইক্রোগেটওয়ে চলছে, এখনই এটি বন্ধ করুন:
edgemicro stop
- কাস্টম প্লাগইন ডিরেক্টরিতে
cd
:cd [prefix]/lib/node_modules/edgemicro/plugins
যেখানে
[prefix]
হলnpm
উপসর্গ নির্দেশিকা যা এজ মাইক্রোগেটওয়ে ইনস্টল করার ক্ষেত্রে "কোথায় এজ মাইক্রোগেটওয়ে ইনস্টল করা হয়েছে" এ বর্ণিত। - প্রতিক্রিয়া-ওভাররাইড নামে একটি নতুন প্লাগইন প্রকল্প তৈরি করুন এবং এটিতে
cd
:
mkdir response-override && cd response-override
- একটি নতুন Node.js প্রকল্প তৈরি করুন:
npm init
ডিফল্ট স্বীকার করতে একাধিকবার রিটার্ন টিপুন। -
index.js
নামে একটি নতুন ফাইল তৈরি করতে একটি পাঠ্য সম্পাদক ব্যবহার করুন। - নিম্নলিখিত কোডটি
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"); } }; }
- এখন আপনি একটি প্লাগইন তৈরি করেছেন, এবং আপনাকে এটি এজ মাইক্রোগেটওয়ে কনফিগারেশনে যোগ করতে হবে।
$HOME/.edgemicro/[org]-[env]-config.yaml
ফাইলটি খুলুন, যেখানেorg
এবংenv
হল আপনার এজ প্রতিষ্ঠান এবং পরিবেশের নাম। - প্লাগইনগুলিতে
response-override
প্লাগইন যুক্ত করুনplugins:sequence
উপাদান।
... plugins: dir: ../plugins sequence: - oauth - response-override ...
- এজ মাইক্রোগেটওয়ে পুনরায় চালু করুন।
- এজ মাইক্রোগেটওয়ের মাধ্যমে একটি API কল করুন। (এই API কলটি অনুমান করে যে আপনি এজ মাইক্রোগেটওয়ে সেট আপ এবং কনফিগারিং- এ বর্ণিত API কী সুরক্ষা সহ টিউটোরিয়ালের মতো একই কনফিগারেশন সেট আপ করেছেন:
curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo Hello, World!
একটি প্লাগইন এর শারীরস্থান
নিম্নলিখিত এজ মাইক্রোগেটওয়ে নমুনা প্লাগইনটি আপনার নিজস্ব প্লাগইনগুলি বিকাশ করার সময় অনুসরণ করা প্যাটার্নকে চিত্রিত করে৷ এই বিভাগে আলোচিত নমুনা প্লাগইনের সোর্স কোডটি plugins/header-uppercase/index.js.
- রুট ফোল্ডারে একটি
package.json
এবংindex.js
সহ প্লাগইন হল স্ট্যান্ডার্ড NPM মডিউল। - একটি প্লাগইন অবশ্যই একটি init() ফাংশন রপ্তানি করবে।
- init() ফাংশন তিনটি আর্গুমেন্ট নেয়: config , logger , এবং stats । এই আর্গুমেন্টগুলি প্লাগইন init() ফাংশন আর্গুমেন্টে বর্ণনা করা হয়েছে।
- init() নামের ফাংশন হ্যান্ডলার সহ একটি অবজেক্ট রিটার্ন করে যেটিকে বলা হয় যখন অনুরোধের জীবদ্দশায় কিছু ঘটনা ঘটে।
ইভেন্ট হ্যান্ডলার ফাংশন
একটি প্লাগইন অবশ্যই কিছু বা সমস্ত ইভেন্ট হ্যান্ডলার ফাংশন বাস্তবায়ন করবে। এই ফাংশন বাস্তবায়ন আপনার উপর নির্ভর করে. যে কোনো প্রদত্ত ফাংশন ঐচ্ছিক, এবং একটি সাধারণ প্লাগইন এই ফাংশনগুলির অন্তত একটি উপসেট বাস্তবায়ন করবে।
ফ্লো ইভেন্ট হ্যান্ডলারদের অনুরোধ করুন
এই ফাংশনগুলিকে এজ মাইক্রোগেটওয়েতে অনুরোধের ইভেন্টগুলিতে ডাকা হয়।
-
onrequest
-
ondata_request
-
onend_request
-
onclose_request
-
onerror_request
onrequest
ফাংশন
ক্লায়েন্ট অনুরোধের শুরুতে কল করা হয়। যখন এজ মাইক্রোগেটওয়ে অনুরোধের প্রথম বাইট প্রাপ্ত হয় তখন এই ফাংশনটি চালু হয়। এই ফাংশনটি আপনাকে অনুরোধ শিরোনাম, URL, ক্যোয়ারী প্যারামিটার এবং HTTP পদ্ধতিতে অ্যাক্সেস দেয়। আপনি যদি একটি সত্য প্রথম আর্গুমেন্টের সাথে পরবর্তী কল করেন (যেমন ত্রুটির উদাহরণ), তাহলে অনুরোধ প্রক্রিয়াকরণ বন্ধ হয়ে যায় এবং একটি লক্ষ্য অনুরোধ শুরু হয় না।
উদাহরণ:
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(); }
প্রতিক্রিয়া প্রবাহ ইভেন্ট হ্যান্ডলার
এই ফাংশনগুলি এজ মাইক্রোগেটওয়েতে প্রতিক্রিয়া ইভেন্টগুলিতে বলা হয়।
-
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(); }
প্লাগইন ইভেন্ট হ্যান্ডলার ফাংশন সম্পর্কে আপনার যা জানা দরকার
প্লাগইন ইভেন্ট হ্যান্ডলার ফাংশনগুলি নির্দিষ্ট ইভেন্টগুলির প্রতিক্রিয়া হিসাবে বলা হয় যা ঘটে যখন এজ মাইক্রোগেটওয়ে একটি প্রদত্ত API অনুরোধ প্রক্রিয়া করে।
- প্রতিটি init() ফাংশন হ্যান্ডলার ( ondata_request , ondata_response , ইত্যাদি) প্রসেসিং সম্পন্ন হলে পরবর্তী() কলব্যাক কল করতে হবে। আপনি next() কল না করলে, প্রক্রিয়াকরণ বন্ধ হয়ে যাবে এবং অনুরোধটি হ্যাং হয়ে যাবে।
- পরবর্তী() এর প্রথম আর্গুমেন্টটি একটি ত্রুটি হতে পারে যা অনুরোধ প্রক্রিয়াকরণ বন্ধ করতে পারে।
- ondata_ এবং onend_ হ্যান্ডলারদের অবশ্যই নেক্সট() কল করতে হবে একটি দ্বিতীয় আর্গুমেন্ট সহ যেখানে ডেটা টার্গেট বা ক্লায়েন্টের কাছে পাঠানো হবে। এই যুক্তিটি শূন্য হতে পারে যদি প্লাগইনটি বাফারিং হয় এবং এই মুহূর্তে রূপান্তর করার জন্য যথেষ্ট ডেটা না থাকে।
- মনে রাখবেন যে প্লাগইনের একটি একক দৃষ্টান্ত সমস্ত অনুরোধ এবং প্রতিক্রিয়া পরিষেবা দিতে ব্যবহৃত হয়। যদি একটি প্লাগইন কলগুলির মধ্যে প্রতি-অনুরোধের অবস্থা বজায় রাখতে চায়, তবে এটি সরবরাহকৃত অনুরোধ বস্তু ( req ) এ যোগ করা একটি সম্পত্তিতে সেই অবস্থাটিকে সংরক্ষণ করতে পারে, যার জীবনকাল হল API কলের সময়কাল।
- সমস্ত ত্রুটি ধরার জন্য সতর্কতা অবলম্বন করুন এবং ত্রুটি সহ next() এ কল করুন। পরবর্তী() কল করতে ব্যর্থ হলে API কল হ্যাং হয়ে যাবে।
- মেমরি ফাঁস প্রবর্তন না করার বিষয়ে সতর্ক থাকুন কারণ এটি এজ মাইক্রোগেটওয়ের সামগ্রিক কর্মক্ষমতাকে প্রভাবিত করতে পারে এবং মেমরি ফুরিয়ে গেলে এটি ক্র্যাশ হতে পারে।
- প্রধান থ্রেডে কম্পিউট-ইনটেনসিভ কাজ না করে Node.js মডেল অনুসরণ করতে সতর্ক থাকুন কারণ এটি এজ মাইক্রোগেটওয়ের কর্মক্ষমতাকে বিরূপভাবে প্রভাবিত করতে পারে।
প্লাগইন init() ফাংশন সম্পর্কে
এই বিভাগটি init() ফাংশনে পাস করা আর্গুমেন্টগুলি বর্ণনা করে: config , logger , এবং stats ।
কনফিগারেশন
এজ মাইক্রোগেটওয়ে কনফিগারেশন ফাইলকে এপিজি এজ থেকে ডাউনলোড করা ডেটার সাথে একত্রিত করে প্রাপ্ত কনফিগারেশন ডেটাকে একটি অবজেক্টে রাখা হয়: config
।
প্রতিক্রিয়া-ওভাররাইড নামক প্লাগইনে foo এর মান সহ param নামক একটি কনফিগার প্যারামিটার যোগ করতে, এটি 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
আপনি চাইল্ড অবজেক্ট config.emgConfigs
এ মার্জড মাইক্রোগেটওয়ে কনফিগারেশন এবং ডাউনলোড করা অ্যাপিজি এজ ডেটা অ্যাক্সেস করতে পারেন। উদাহরণস্বরূপ, আপনি init
ফাংশনে এই কনফিগারেশন ডেটা অ্যাক্সেস করতে পারেন:
module.exports.init = function(config, logger, stats) { let emgconfigs = config.emgConfigs;
নীচে emgConfigs
ধারণ করে এমন ডেটার একটি উদাহরণ দেওয়া হল:
{ edgemicro: { port: 8000, max_connections: 1000, config_change_poll_interval: 600, logging: { level: 'error', dir: '/var/tmp', stats_log_interval: 60, rotate_interval: 24, stack_trace: false }, plugins: { sequence: [Array] }, global: { org: 'Your Org', env: 'test' } }, headers: { 'x-forwarded-for': true, 'x-forwarded-host': true, 'x-request-id': true, 'x-response-time': true, via: true }, proxies: [ { max_connections: 1000, name: 'edgemicro_delayed', revision: '1', proxy_name: 'default', base_path: '/edgemicro_delayed', target_name: 'default', url: 'https://httpbin.org/delay/10', timeout: 0 } ], product_to_proxy: { EdgeMicroTestProduct: [ 'edgemicro-auth','edgemicro_delayed',] }, product_to_scopes: {prod4: [ 'Admin', 'Guest', 'Student' ] }, product_to_api_resource: { EdgeMicroTestProduct: [ '/*' ] }, _hash: 0, keys: { key: 'Your key', secret: 'Your key ' }, uid: 'Internally generated uuid', targets: [] }
লগার
সিস্টেম লগার. বর্তমানে নিযুক্ত লগার এই ফাংশনগুলি রপ্তানি করে, যেখানে অবজেক্ট একটি স্ট্রিং, HTTP অনুরোধ, HTTP প্রতিক্রিয়া, বা একটি ত্রুটি উদাহরণ হতে পারে।
-
info(object, message)
-
warn(object, message)
-
error(object, message)
-
trace(object, message)
-
debug(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()
কল করতে হবে (অথবা প্লাগইন প্রক্রিয়াটি হ্যাং হয়ে যাবে)। রিকোয়েস্ট লাইফ সাইকেলে, প্রথম পদ্ধতি যা বলা হয় তা হল onrequest()। পরবর্তী পদ্ধতিটি কল করা হবে ondata_request()
পদ্ধতি; যাইহোক, ondata_request
শুধুমাত্র তখনই বলা হয় যখন অনুরোধে ডেটা অন্তর্ভুক্ত থাকে, যেমন ক্ষেত্রে, উদাহরণস্বরূপ, একটি POST অনুরোধের। পরবর্তী পদ্ধতিটি হবে onend_request()
, যা অনুরোধ প্রক্রিয়াকরণ সম্পন্ন হলে বলা হয়। onerror_*
ফাংশনগুলি শুধুমাত্র একটি ত্রুটির ক্ষেত্রে কল করা হয়, এবং আপনি যদি চান তবে তারা আপনাকে কাস্টম কোড দিয়ে ত্রুটিগুলি পরিচালনা করার অনুমতি দেয়।
ধরা যাক অনুরোধে ডেটা পাঠানো হয়, এবং ondata_request()
বলা হয়। লক্ষ্য করুন যে ফাংশনটি next()
দুটি পরামিতি সহ কল করে:
next(null, data);
নিয়ম অনুসারে, প্রথম প্যারামিটারটি ত্রুটির তথ্য জানাতে ব্যবহার করা হয়, যা আপনি চেইনের পরবর্তী ফাংশনে পরিচালনা করতে পারেন। এটিকে null
এ সেট করে, একটি মিথ্যা যুক্তি, আমরা বলছি কোন ত্রুটি নেই, এবং অনুরোধ প্রক্রিয়াকরণ স্বাভাবিকভাবে এগিয়ে যাওয়া উচিত। যদি এই যুক্তিটি সত্য হয় (যেমন একটি ত্রুটি বস্তু), তাহলে অনুরোধ প্রক্রিয়াকরণ বন্ধ হয়ে যায় এবং অনুরোধটি লক্ষ্যে পাঠানো হয়।
দ্বিতীয় প্যারামিটারটি অনুরোধের ডেটাকে চেইনের পরবর্তী ফাংশনে প্রেরণ করে। আপনি যদি কোনও অতিরিক্ত প্রক্রিয়াকরণ না করেন, তাহলে অনুরোধের ডেটা অপরিবর্তিত API-এর লক্ষ্যে প্রেরণ করা হয়। যাইহোক, আপনার কাছে এই পদ্ধতির মধ্যে অনুরোধের ডেটা পরিবর্তন করার এবং পরিবর্তিত অনুরোধটি লক্ষ্যে প্রেরণ করার সুযোগ রয়েছে। উদাহরণস্বরূপ, যদি অনুরোধের ডেটা XML হয় এবং লক্ষ্য JSON আশা করে, তাহলে আপনি ondata_request()
পদ্ধতিতে কোড যোগ করতে পারেন যা (a) অনুরোধের শিরোনামের বিষয়বস্তু-টাইপকে 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); },
প্লাগইন হ্যান্ডলার এক্সিকিউশন অর্ডার সম্পর্কে
আপনি যদি এজ মাইক্রোগেটওয়ের জন্য প্লাগইনগুলি লেখেন, তাহলে আপনাকে বুঝতে হবে যে প্লাগইন ইভেন্ট হ্যান্ডলারগুলি চালানো হয়।
মনে রাখা গুরুত্বপূর্ণ বিষয় হল যে আপনি যখন এজ মাইক্রোগেটওয়ে কনফিগারেশন ফাইলে একটি প্লাগইন সিকোয়েন্স নির্দিষ্ট করেন, তখন অনুরোধ হ্যান্ডলাররা আরোহী ক্রমানুসারে চালায়, যখন রেসপন্স হ্যান্ডলাররা নিচের ক্রমে এক্সিকিউট করে।
নিম্নলিখিত উদাহরণটি আপনাকে এই মৃত্যুদন্ডের ক্রম বুঝতে সাহায্য করার জন্য ডিজাইন করা হয়েছে।
1. তিনটি সহজ প্লাগইন তৈরি করুন
নিম্নলিখিত প্লাগইন বিবেচনা করুন. এটি যা করে তা হল প্রিন্ট কনসোল আউটপুট যখন এর ইভেন্ট হ্যান্ডলারদের বলা হয়:
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
এ পরিবর্তন করুন)।
2. প্লাগইন কোড পর্যালোচনা করুন
<microgateway-root-dir>/plugins/plugin-1/index.js
এ এক্সপোর্ট করা প্লাগইন ফাংশন হল ইভেন্ট হ্যান্ডলার যা অনুরোধ এবং প্রতিক্রিয়া প্রক্রিয়াকরণের সময় নির্দিষ্ট সময়ে কার্যকর করে। উদাহরণস্বরূপ, onrequest
execute করে রিকোয়েস্ট হেডারের প্রথম বাইট প্রাপ্ত হয়। যখন, onend_response
শেষ বাইট প্রতিক্রিয়া ডেটা প্রাপ্তির পরে কার্যকর হয়।
হ্যান্ডলার ondata_response একবার দেখুন -- যখনই প্রতিক্রিয়া ডেটার একটি অংশ প্রাপ্ত হয় তখন এটি বলা হয়। জানা গুরুত্বপূর্ণ বিষয় হল প্রতিক্রিয়া ডেটা অগত্যা একবারে প্রাপ্ত হয় না। বরং, নির্বিচারে দৈর্ঘ্যের অংশে ডেটা প্রাপ্ত হতে পারে।
3. প্লাগইন সিকোয়েন্সে প্লাগইন যোগ করুন
এই উদাহরণটি চালিয়ে, আমরা এজ মাইক্রোগেটওয়ে কনফিগারেশন ফাইলে ( ~./edgemicro/config.yaml
) প্লাগইন সিকোয়েন্সে প্লাগইনগুলি যুক্ত করব। ক্রমটি গুরুত্বপূর্ণ। এটি প্লাগইন হ্যান্ডলারগুলি চালানোর ক্রম নির্ধারণ করে।
plugins: dir: ../plugins sequence: - plugin-1 - plugin-2 - plugin-3
4. ডিবাগ আউটপুট পরীক্ষা করুন
এখন, এই প্লাগইনগুলিকে কল করার সময় যে আউটপুট উৎপন্ন হবে তা দেখা যাক। লক্ষ্য করার জন্য কয়েকটি গুরুত্বপূর্ণ পয়েন্ট রয়েছে:
- প্লাগইন সিকোয়েন্স এজ মাইক্রোগেটওয়ে কনফিগারেশন ফাইল (
~./edgemicro/config.yaml
) ইভেন্ট হ্যান্ডলারদের যে ক্রমে ডাকা হয় তা নির্দিষ্ট করে। - রিকোয়েস্ট হ্যান্ডলারদের ঊর্ধ্বমুখী ক্রমে ডাকা হয় (যে ক্রমে তারা প্লাগইন সিকোয়েন্সে প্রদর্শিত হয় -- 1, 2, 3)।
- রেসপন্স হ্যান্ডলারদের অবরোহ ক্রমে ডাকা হয় -- 3, 2, 1।
-
ondata_response
হ্যান্ডলারকে প্রতিটি ডেটার জন্য একবার কল করা হয় যা আসে। এই উদাহরণে (নীচে দেখানো আউটপুট), দুটি খণ্ড প্রাপ্ত হয়।
এখানে নমুনা ডিবাগ আউটপুট উত্পাদিত হয় যখন এই তিনটি প্লাগইন ব্যবহার করা হয় এবং এজ মাইক্রোগেটওয়ের মাধ্যমে একটি অনুরোধ পাঠানো হয়। হ্যান্ডলারদের যে ক্রমে বলা হয় তা শুধু লক্ষ্য করুন:
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
সারাংশ
যখন আপনি কাস্টম প্লাগইন কার্যকারিতা প্রয়োগ করার চেষ্টা করেন, যেমন অনুরোধ বা প্রতিক্রিয়া ডেটা জমা করা এবং রূপান্তরিত করার চেষ্টা করার সময় প্লাগইন হ্যান্ডলারদের যে ক্রমে কল করা হয় তা বোঝা খুবই গুরুত্বপূর্ণ।
শুধু মনে রাখবেন যে অনুরোধ হ্যান্ডলারগুলি এজ মাইক্রোগেটওয়ে কনফিগারেশন ফাইলে যে ক্রমে প্লাগইনগুলি নির্দিষ্ট করা হয়েছে সেই ক্রমে কার্যকর করা হয় এবং প্রতিক্রিয়া হ্যান্ডলারগুলি বিপরীত ক্রমে কার্যকর করা হয়।
প্লাগইনগুলিতে গ্লোবাল ভেরিয়েবল ব্যবহার করার বিষয়ে
এজ মাইক্রোগেটওয়েতে প্রতিটি অনুরোধ একটি প্লাগইনের একই উদাহরণে পাঠানো হয়; তাই, অন্য ক্লায়েন্ট থেকে দ্বিতীয় অনুরোধের অবস্থা প্রথমটিকে ওভাররাইট করবে। প্লাগইন অবস্থা সংরক্ষণ করার একমাত্র নিরাপদ জায়গা হল অনুরোধ বা প্রতিক্রিয়া বস্তুর (যার জীবনকাল অনুরোধের মধ্যে সীমাবদ্ধ) একটি সম্পত্তিতে রাজ্য সংরক্ষণ করা।
প্লাগইনগুলিতে টার্গেট ইউআরএল পুনরায় লেখা
যোগ করা হয়েছে: v2.3.3
আপনি আপনার প্লাগইন কোডে এই ভেরিয়েবলগুলি পরিবর্তন করে একটি প্লাগইনে ডিফল্ট টার্গেট URLকে গতিশীলভাবে ওভাররাইড করতে পারেন: req.targetHostname এবং req.targetPath ।
যোগ করা হয়েছে: v2.4.x
আপনি টার্গেট এন্ডপয়েন্ট পোর্ট ওভাররাইড করতে পারেন এবং HTTP এবং HTTPS এর মধ্যে বেছে নিতে পারেন। আপনার প্লাগইন কোডে এই ভেরিয়েবলগুলি পরিবর্তন করুন: req.targetPort এবং req.targetSecure । HTTPS নির্বাচন করতে, req.targetSecure সেট করুন true ; HTTP এর জন্য, এটি মিথ্যাতে সেট করুন। আপনি যদি req.targetSecure কে সত্যে সেট করেন, আরও তথ্যের জন্য এই আলোচনার থ্রেডটি দেখুন।
এতে সরানো হয়েছে: v3.3.3
eurekaclient নামক নমুনা প্লাগইনটি v.3.3.3 এ Edge Microgateway থেকে সরানো হয়েছে। রিলিজ নোট দেখুন.
এই বৈশিষ্ট্যটি অপসারণ এজ মাইক্রোগেটওয়ের মূল কার্যকারিতা বা টার্গেট ইউআরএলগুলির পুনর্লিখনকে প্রভাবিত করে না। আপনি ডায়নামিক এন্ডপয়েন্ট লুকআপ কনফিগার করতে পারেন এবং প্লাগইন স্তরে req.targetHostname
, req.targetPath
, req.targetPort
, এবং req.targetSecure
এর মতো লক্ষ্য ভেরিয়েবলগুলিকে ওভাররাইড করতে পারেন৷ প্লাগইনগুলিতে টার্গেট ইউআরএল পুনর্লিখন দেখুন।
নমুনা প্লাগইন
এই প্লাগইনগুলি আপনার এজ মাইক্রোগেটওয়ে ইনস্টলেশনের সাথে সরবরাহ করা হয়েছে। আপনি এখানে এজ মাইক্রোগেটওয়ে ইনস্টলেশনে তাদের খুঁজে পেতে পারেন:
[prefix]/lib/node_modules/edgemicro/plugins
যেখানে [prefix]
হল npm
উপসর্গ নির্দেশিকা যা এজ মাইক্রোগেটওয়ে ইনস্টল করার ক্ষেত্রে "কোথায় এজ মাইক্রোগেটওয়ে ইনস্টল করা হয়েছে" এ বর্ণিত।
accumulate-অনুরোধ
এই প্লাগইনটি অনুরোধ বস্তুর সাথে সংযুক্ত একটি অ্যারে সম্পত্তিতে ক্লায়েন্ট থেকে ডেটা খণ্ডগুলি জমা করে। যখন সমস্ত অনুরোধের ডেটা প্রাপ্ত হয়, তখন অ্যারেটি একটি বাফারে সংযুক্ত হয় যা পরবর্তী ক্রমানুসারে পরবর্তী প্লাগইনে প্রেরণ করা হয়। এই প্লাগইনটি অনুক্রমের প্রথম প্লাগইন হওয়া উচিত যাতে পরবর্তী প্লাগইনগুলি জমাকৃত অনুরোধের ডেটা গ্রহণ করে।
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); } }; }
accumulate- প্রতিক্রিয়া
এই প্লাগইন টার্গেট থেকে ডাটা খণ্ডগুলিকে রেসপন্স অবজেক্টের সাথে সংযুক্ত একটি অ্যারে প্রোপার্টিতে জমা করে। যখন সমস্ত প্রতিক্রিয়া ডেটা প্রাপ্ত হয়, তখন অ্যারেটি একটি বাফারে সংযুক্ত হয় যা পরবর্তী ক্রমানুসারে পরবর্তী প্লাগইনে প্রেরণ করা হয়। যেহেতু এই প্লাগইনটি প্রতিক্রিয়াগুলির উপর কাজ করে, যেগুলি বিপরীত ক্রমে প্রক্রিয়া করা হয়, আপনার এটিকে অনুক্রমের শেষ প্লাগইন হিসাবে স্থাপন করা উচিত।
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); } }; }
হেডার-বড় হাতের প্লাগইন
এজ মাইক্রোগেটওয়ে ডিস্ট্রিবিউশনে <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); } }; }