कस्टम प्लग इन डेवलप करना

आपको Apigee Edge दस्तावेज़ दिख रहा है.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस पेज पर जाएं Apigee X दस्तावेज़.
जानकारी

Edge Microgateway v. 3.1.5 और इसके बाद के वर्शन

ऑडियंस

यह विषय उन डेवलपर के लिए है जो ईमेल लिखकर Edge Microgateway की सुविधाएं बढ़ाना चाहते हैं कस्टम प्लगिन के बारे में ज़्यादा जानें. अगर आपको नया प्लगिन लिखना है, तो JavaScript और Node.js का इस्तेमाल आवश्यक.

कस्टम Edge Microgateway प्लगिन क्या है?

प्लगिन एक Node.js मॉड्यूल होता है, जो Edge Microgateway में फ़ंक्शन जोड़ता है. प्लग इन मॉड्यूल हर दिन एक ही पैटर्न के साथ काम करते हैं. साथ ही, उन्हें Edge Microgateway के हिसाब से सेव किया जाता है. इससे ताकि उन्हें खोजा और अपने-आप चलाया जा सके. जब आप Edge Microgateway इंस्टॉल करो. इनमें पुष्टि करने, स्पाइक अरेस्ट, कोटा, और Analytics. इन मौजूदा प्लग इन के बारे में प्लग इन का इस्तेमाल करना में बताया गया है.

आप custom लिखकर माइक्रोगेटवे में नई सुविधाएं और क्षमताएं जोड़ सकते हैं प्लगिन. डिफ़ॉल्ट रूप से, Edge Microgateway एक सुरक्षित पास-थ्रू प्रॉक्सी है जो पास किए जाने वाले अनुरोधों और उनके जवाबों में कोई बदलाव नहीं किया जाता. कस्टम प्लगिन की मदद से, आप ये काम कर सकते हैं प्रोग्रामेटिक रूप से उन अनुरोधों और जवाबों के साथ इंटरैक्ट करता है जो माइक्रोगेटवे से होकर गुज़रते हैं.

कस्टम प्लग इन कोड कहां डालें

Edge Microgateway इंस्टॉलेशन के हिस्से के तौर पर कस्टम प्लगिन के लिए एक फ़ोल्डर शामिल किया गया है यहां:

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

जहां [prefix], npm प्रीफ़िक्स डायरेक्ट्री है "एज माइक्रोगेटवे कहां इंस्टॉल किया गया है" में बताया गया है इंस्टॉलिंग एज में माइक्रोगेटवे.

आपके पास इस डिफ़ॉल्ट प्लगिन डायरेक्ट्री को बदलने का विकल्प है. देखें कि कहां ढूंढें प्लगिन.

पहले से तय प्लग इन की समीक्षा करना

खुद का प्लगिन डेवलप करने से पहले, यह जांच लेना अच्छा है कि पहले से तय कोई भी प्लगिन प्लगिन आपकी ज़रूरतों को पूरा करते हैं. ये प्लगिन इन जगहों पर मौजूद हैं:

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

जहां [prefix], npm प्रीफ़िक्स डायरेक्ट्री है. यहां जाएं: साथ ही, "एज माइक्रोगेटवे कहां इंस्टॉल किया गया है" Installing Edge में देखें माइक्रोगेटवे.

ज़्यादा जानकारी के लिए, यह भी देखें पहले से तय Edge Microgateway के साथ दिए गए प्लगिन.

कोई आसान प्लगिन लिखें

इस सेक्शन में, हम आसान प्लगिन बनाने के ज़रूरी चरणों के बारे में बताएंगे. यह प्लगिन रिस्पॉन्स डेटा (जो भी हो) को "hello, World!" स्ट्रिंग से बदल देता है. और उसे टर्मिनल.

  1. अगर Edge Microgateway चल रहा है, तो उसे अभी बंद करें:
    edgemicro stop
    
  2. cd को कस्टम प्लग इन डायरेक्ट्री में जोड़ें:

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

    जहां [prefix], npm प्रीफ़िक्स डायरेक्ट्री है जैसा कि "एज माइक्रोगेटवे कहां इंस्टॉल किया गया है" में बताया गया है इंस्टॉलिंग एज में माइक्रोगेटवे.

  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 कुंजी की सुरक्षा के साथ ट्यूटोरियल के रूप में कॉन्फ़िगरेशन, जैसा कि सेट अप करना और Edge Microgateway को कॉन्फ़िगर किया जा रहा है:
    curl -H 'x-api-key: uAM4gBSb6YoMvTHfx5lXJizYIpr5Jd' http://localhost:8000/hello/echo
    Hello, World!
    

प्लगिन की एनाटॉमी

नीचे दिया गया Edge Microgateway सैंपल प्लगिन, पैटर्न के बारे में बताता है. इसे तब दिखाया जाता है, जब अपने खुद के प्लगिन डेवलप करना. इस सेक्शन में बताए गए सैंपल प्लगिन का सोर्स कोड यह है plugins/header-uppercase/index.js. में

  • प्लग इन, package.json और index.js वाले स्टैंडर्ड एनपीएम मॉड्यूल हैं रूट फ़ोल्डर में ले जा सकते है.
  • प्लगिन को init() फ़ंक्शन को एक्सपोर्ट करना होगा.
  • init() फ़ंक्शन में तीन आर्ग्युमेंट इस्तेमाल किए जाते हैं: config, logger, और आंकड़े में दिए गए हैं. इन आर्ग्युमेंट के बारे में प्लगिन में बताया गया है init() फ़ंक्शन के आर्ग्युमेंट.
  • init(): नतीजे के तौर पर, नाम वाले फ़ंक्शन हैंडलर के साथ एक ऑब्जेक्ट दिखाता है. हालांकि, ऐसा तब होता है, जब कुछ इवेंट, अनुरोध के पूरा होने के दौरान घटते हैं.

इवेंट हैंडलर के फ़ंक्शन

प्लगिन को इनमें से कुछ या सभी इवेंट हैंडलर फ़ंक्शन लागू करने होंगे. इन रणनीतियों को लागू करने से किसी भी काम को करने का फ़ैसला आपका होता है. कोई भी फ़ंक्शन वैकल्पिक है और एक सामान्य प्लगिन यहां लागू होगा इनमें से कम से कम एक सबसेट का इस्तेमाल करें.

फ़्लो इवेंट हैंडलर का अनुरोध करें

इन फ़ंक्शन को Edge Microgateway में अनुरोध इवेंट पर कॉल किया जाता है.

  • onrequest
  • ondata_request
  • onend_request
  • onclose_request
  • onerror_request

onrequest फ़ंक्शन

क्लाइंट के अनुरोध की शुरुआत में कॉल किया गया. यह फ़ंक्शन तब सक्रिय होता है, जब Edge Microgateway को अनुरोध मिला है. यह फ़ंक्शन आपको अनुरोध के हेडर का ऐक्सेस देता है, यूआरएल, क्वेरी पैरामीटर, और एचटीटीपी तरीका. अगर आपने पहले सही तर्क के साथ अगला कॉल किया हो (जैसे कि इंस्टेंस) से अलग होता है, तो प्रोसेसिंग का अनुरोध रुक जाता है और टारगेट अनुरोध शुरू नहीं होता है.

उदाहरण:

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 फ़ंक्शन

टारगेट रिस्पॉन्स की शुरुआत में कॉल किया जाता है. यह फ़ंक्शन तब सक्रिय होता है, जब Edge Microgateway को जवाब मिला है. यह फ़ंक्शन आपको रिस्पॉन्स हेडर का ऐक्सेस देता है और स्टेटस कोड होना चाहिए.

उदाहरण:

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, दिए गए एपीआई अनुरोध को प्रोसेस करता है.

  • हर init() फ़ंक्शन हैंडलर (ondata_request, ondata_response, वगैरह) को पूरा होने पर next() कॉलबैक को कॉल करना होगा प्रोसेस चल रही है. अगर next() को कॉल नहीं किया जाता है, तो प्रोसेसिंग बंद हो जाएगी और अनुरोध हैंग हो जाएगा.
  • next() का पहला आर्ग्युमेंट कोई गड़बड़ी हो सकती है. इसकी वजह से अनुरोध होगा को खत्म करने की प्रोसेस जारी है.
  • ondata_ और onend_ हैंडलर को कॉल करना चाहिए next(). इसमें दूसरे आर्ग्युमेंट के साथ, टारगेट को पास किया जाने वाला डेटा शामिल होता है या क्लाइंट की ओर से अगर प्लगिन बफ़र हो रहा है और उसके पास ज़रूरत के मुताबिक डेटा नहीं है, तो यह आर्ग्युमेंट शून्य हो सकता है बदलाव लाने की कोशिश कर रहे हैं.
  • ध्यान दें कि प्लगिन के एक ही इंस्टेंस का इस्तेमाल, सभी अनुरोधों और रिस्पॉन्स को पूरा करने के लिए किया जाता है. अगर कोई प्लग इन कॉल के बीच हर अनुरोध की स्थिति को बनाए रखना चाहता है, तो वह उस स्थिति को दिए गए request ऑब्जेक्ट (req) में जोड़ी गई प्रॉपर्टी, जिसकी लाइफ़टाइम, एपीआई कॉल की अवधि है.
  • सभी गड़बड़ियों को ध्यान में रखें और गड़बड़ी के साथ next() को कॉल करें. ऐसा नहीं किया जा सका कॉल next() की वजह से, एपीआई कॉल हैंग हो जाएगा.
  • ध्यान रखें कि आप मेमोरी में डेटा लीक न होने दें, क्योंकि इससे Edge की पूरी परफ़ॉर्मेंस पर असर पड़ सकता है इससे माइक्रोगेटवे बन जाता है और मेमोरी खत्म होने पर यह क्रैश हो जाता है.
  • मुख्य पेज में कंप्यूट-इंटेंसिव टास्क न करें. इससे Node.js मॉडल को फ़ॉलो करने का ध्यान रखें थ्रेड क्योंकि इससे एज माइक्रोगेटवे की परफ़ॉर्मेंस पर बुरा असर पड़ सकता है.

प्लग इन init() फ़ंक्शन के बारे में जानकारी

इस सेक्शन में init() फ़ंक्शन को दिए गए आर्ग्युमेंट के बारे में बताया गया है: config, logger, और आंकड़े हैं.

कॉन्फ़िगरेशन

Edge Microgateway कॉन्फ़िगरेशन फ़ाइल को Apigee Edge से डाउनलोड किए गए डेटा को config नाम वाले ऑब्जेक्ट में रखा जाता है.

foo वैल्यू के साथ param नाम वाला कॉन्फ़िगरेशन पैरामीटर जोड़ने के लिए response-override नाम के प्लगिन में जाता है, तो इसे 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

आपने लोगों तक पहुंचाया मुफ़्त में मर्ज किए गए माइक्रोगेटवे कॉन्फ़िगरेशन और डाउनलोड किए गए Apigee Edge डेटा को चाइल्ड ऑब्जेक्ट 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: []
  }

लॉगर

सिस्टम लॉगर. हाल ही में इस्तेमाल किया गया लॉगर इन फ़ंक्शन को एक्सपोर्ट करता है, जहां ऑब्जेक्ट कोई स्ट्रिंग, एचटीटीपी अनुरोध, एचटीटीपी रिस्पॉन्स या गड़बड़ी इंस्टेंस.

  • 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
  }
  
  • request - अनुरोधों की कुल संख्या.
  • response - जवाबों की कुल संख्या.
  • कनेक्शन - चालू टारगेट कनेक्शन की संख्या.

Next() फ़ंक्शन के बारे में जानकारी

इसमें अगले तरीके को प्रोसेस करना जारी रखने के लिए, प्लग इन के सभी तरीकों को next() को कॉल करना होगा सीरीज़ (या प्लगिन प्रोसेस हैंग हो जाएगी). अनुरोध की अवधि में, पहला तरीका होता है onrequest(). कॉल किया जाने वाला अगला तरीका ondata_request() तरीका है; हालांकि, ondata_request को सिर्फ़ तब कॉल किया जाता है, जब अनुरोध में डेटा शामिल होता है, जैसा कि उदाहरण के लिए, पीओएसटी अनुरोध किया गया है. कॉल किए जाने वाले अगले तरीके में onend_request(), जिसे अनुरोध की प्रोसेस पूरी होने पर कॉल किया जाता है. कॉन्टेंट बनाने onerror_* फ़ंक्शन सिर्फ़ गड़बड़ी होने पर ही कॉल किए जाते हैं. इनकी मदद से अगर आप चाहें, तो गड़बड़ियों को कस्टम कोड से ठीक कर सकते हैं.

मान लें कि अनुरोध में डेटा भेजा गया है और ondata_request() को कॉल किया गया है. सूचना जिसे यह फ़ंक्शन दो पैरामीटर के साथ next() को कॉल करता है:

next(null, data);

तौर-तरीकों के मुताबिक, पहले पैरामीटर का इस्तेमाल गड़बड़ी की जानकारी देने के लिए किया जाता है. इसके बाद हैंडल को चेन में बाद वाले फ़ंक्शन में डालें. इसे null पर सेट करने से, यह गलत लग सकता है में कहा जाता है कि कोई गड़बड़ी नहीं है. इसलिए, अनुरोध को प्रोसेस करने की प्रोसेस सामान्य तरीके से की जानी चाहिए. अगर आपने यह तर्क सही है (जैसे कि कोई गड़बड़ी ऑब्जेक्ट). फिर अनुरोध प्रोसेसिंग रुक जाती है और अनुरोध टारगेट के लिए भेजी गई थी.

दूसरा पैरामीटर, अनुरोध से जुड़े डेटा को चेन के अगले फ़ंक्शन को पास करता है. अगर आप ऐसा नहीं करते हैं, तो अतिरिक्त प्रोसेसिंग मोड का इस्तेमाल किया जाता है, तो अनुरोध के डेटा को एपीआई के टारगेट में बिना कोई बदलाव किए भेजा जाता है. हालांकि, आपके पास इस तरीके में अनुरोध डेटा में बदलाव करने और संशोधित टारगेट के लिए अनुरोध करें. उदाहरण के लिए, अगर अनुरोध का डेटा एक्सएमएल है और टारगेट को JSON, इसके बाद, ondata_request() तरीके में कोड जोड़ा जा सकता है. ऐसा करने से (a) अनुरोध के हेडर का कॉन्टेंट-टाइप application/json में बदला जाता है और अनुरोध के डेटा को बदला जाता है JSON को अपनी पसंद के हिसाब से इस्तेमाल किया जा सकता है. उदाहरण के लिए, Node.js का इस्तेमाल किया जा सकता है xml2json के कन्वर्टर को NPM से मिला है).

आइए देखते हैं कि यह कैसा दिख सकता है:

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

इस मामले में, अनुरोध के डेटा (जिसे एक्सएमएल माना जाता है) को 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);
},

इसके बारे में जानकारी प्लगिन हैंडलर एक्ज़ीक्यूशन ऑर्डर

Edge Microgateway के लिए प्लगिन लिखने पर, आपको यह समझना होगा कि प्लगिन किस क्रम में है इवेंट हैंडलर चलाए जाते हैं.

याद रखने वाली ज़रूरी बात यह है कि जब आप Edge में प्लगिन का क्रम तय करते हैं, तो माइक्रोगेटवे कॉन्फ़िगरेशन फ़ाइल, अनुरोध हैंडलर बढ़ते क्रम में काम करते हैं, जबकि रिस्पॉन्स हैंडलर घटते क्रम में काम करते हैं.

नीचे दिया गया उदाहरण, इस एक्ज़ीक्यूशन के क्रम को समझने में आपकी मदद करने के लिए डिज़ाइन किया गया है.

1. तीन आसान बनाएँ प्लगिन

यहां दिए गए प्लगिन का इस्तेमाल करें. जब इसके इवेंट हैंडलर होते हैं, तो यह बस प्रिंट कंसोल आउटपुट होता है कॉल किया गया:

प्लगइन/प्लगइन-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, अनुरोध के हेडर पर मिलने वाले पहले बाइट को एक्ज़ीक्यूट करता है. हालांकि, onend_response, रिस्पॉन्स डेटा के आखिरी बाइट मिलने के बाद काम करता है.

हैंडलर ondata_response पर एक नज़र डालें -- जब भी कुछ रिस्पॉन्स डेटा का हिस्सा हो, तो इसे कॉल किया जाता है मिल जाता है. ज़रूरी जानकारी यह है कि ज़रूरी नहीं है कि रिस्पॉन्स डेटा एक बार. इसके बजाय, डेटा को मनमुताबिक लंबाई के कई हिस्सों में मिल सकता है.

3. प्लगिन को इसमें जोड़ें प्लगिन का क्रम

इसके बाद, हम Edge में प्लगिन के क्रम में प्लगिन जोड़ देंगे माइक्रोगेटवे कॉन्फ़िगरेशन फ़ाइल (~./edgemicro/config.yaml) के बारे में यहां बताया गया है. क्रम यह है अहम है. यह प्लगिन हैंडलर के एक्ज़ीक्यूट के क्रम के बारे में बताता है.

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

4. डीबग आउटपुट की जांच करना

आइए, अब उस आउटपुट को देखते हैं जो इन प्लगिन को कॉल करने पर तैयार होता है. यहां हैं ध्यान देने योग्य कुछ महत्वपूर्ण बातें:

  • यह प्लगिन, Edge Microgateway कॉन्फ़िगरेशन फ़ाइल को सीक्वेंस करता है (~./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

खास जानकारी

प्लगिन हैंडलर को कॉल करने के क्रम को समझना बेहद ज़रूरी है. कस्टम प्लगिन फ़ंक्शन लागू करना. जैसे, अनुरोध या रिस्पॉन्स को इकट्ठा करना और उसे बदलना डेटा शामिल है.

याद रखें कि अनुरोध हैंडलर को उसी क्रम में एक्ज़ीक्यूट किया जाता है जिस क्रम में प्लगिन Edge Microgateway कॉन्फ़िगरेशन फ़ाइल में बताया गया है और रिस्पॉन्स हैंडलर विपरीत क्रम में.

प्लगिन में ग्लोबल वैरिएबल का इस्तेमाल करने के बारे में जानकारी

Edge Microgateway को किया जाने वाला हर अनुरोध, प्लगिन के एक ही इंस्टेंस पर भेजा जाता है; इसलिए, किसी अन्य क्लाइंट के दूसरे अनुरोध की स्थिति पहले वाले अनुरोध को ओवरराइट कर देगी. यह जगह सिर्फ़ यही है प्लग इन की स्थिति को अनुरोध या रिस्पॉन्स ऑब्जेक्ट (जिनकी अनुरोध की अवधि तक सीमित है).

प्लगिन में टारगेट यूआरएल को फिर से लिखना

इसमें जोड़ा गया: v2.3.3

इन वैरिएबल में बदलाव करके, प्लगिन में डिफ़ॉल्ट टारगेट यूआरएल को डाइनैमिक तौर पर बदला जा सकता है अपने प्लग इन कोड में: req.targetHostname और req.targetPath.

इसमें जोड़ा गया: v2.4.x

टारगेट एंडपॉइंट पोर्ट को बदला भी जा सकता है. साथ ही, एचटीटीपी और एचटीटीपीएस में से किसी एक को चुना जा सकता है. इनमें बदलाव करें आपके प्लगिन कोड में वैरिएबल: req.targetPort और req.targetSecure. एचटीटीपीएस चुनने के लिए, req.targetSecure को इस पर सेट करें true; एचटीटीपी के लिए, इसे false पर सेट करें. अगर req.targetSecure को इस पर सेट किया जाता है सही है, तो यह चर्चा देखें थ्रेड पर जाएं.

Edge Microgateway में eurekaclient नाम का एक सैंपल प्लग इन जोड़ा गया है. यह प्लग इन req.targetPort और req.targetSecure वैरिएबल इस्तेमाल करने का तरीका बताता है और यह दिखाता है कि Edge Microgateway कैसे Eureka को सेवा के तौर पर इस्तेमाल करके डाइनैमिक एंडपॉइंट लुकअप कर सकता है एंडपॉइंट कैटलॉग की सूची देखें.


अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सैंपल प्लगिन

ये प्लगिन आपको Edge Microgateway इंस्टॉलेशन के साथ दिए जाते हैं. इन्हें यहां देखा जा सकता है: Edge Microgateway इंस्टॉल करने के लिए यहां जाएं:

[prefix]/lib/node_modules/edgemicro/plugins

जहां [prefix], npm प्रीफ़िक्स डायरेक्ट्री है "एज माइक्रोगेटवे कहां इंस्टॉल किया गया है" में बताया गया है इंस्टॉलिंग एज में माइक्रोगेटवे.

accumulate-request

यह प्लगिन, क्लाइंट से मिले डेटा को अनुरोध किया गया ऑब्जेक्ट. अनुरोध का पूरा डेटा मिलने पर, अरे को बफ़र में जोड़ दिया जाता है जिसे इसके बाद क्रम में अगले प्लगिन को पास कर दिया जाता है. यह प्लगिन पहला प्लग इन होना चाहिए ताकि बाद के प्लगिन को अनुरोध का इकट्ठा किया गया डेटा मिल सके.

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-response

यह प्लगिन, टारगेट से अटैच की गई प्रॉपर्टी में डेटा को इकट्ठा करके इकट्ठा करता है रिस्पॉन्स ऑब्जेक्ट है. जवाब का पूरा डेटा मिलने पर, अरे को बफ़र में जोड़ दिया जाता है जिसे इसके बाद क्रम में अगले प्लगिन को पास कर दिया जाता है. क्योंकि यह प्लगिन इन प्लैटफ़ॉर्म पर काम करता है जवाबों को उल्टे क्रम में प्रोसेस किया जाता है, इसलिए आपको इसे आखिरी प्लगिन के तौर पर रखना चाहिए क्रम में रखें.

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);
    }

  };

}